프로그래밍/OCaml 26

이진 파일을 읽어서 16진수로 보여주는 HexView 소스 with OCaml

OCaml 언어 소스: (* Filename: testHexView_02.ml Execute: ocaml testHexView_02.ml [filename] Or Compile: ocamlc -o testHexView_02 testHexView_02.ml Execute: ./testHexView_02 [filename] Or Compile: ocamlc -o testHexView_02.exe testHexView_02.ml Execute: testHexView_02 [filename] Date: 2013. 8. 20. *) open Printf;; let printUsage() = printf("Usgae: testHexView_02 [filename]\n");; let toHex n = let s = ..

OCaml 언어, F# 언어. Haskell 언어로 각각 리스트 쉽게 생성하기 그리고 zipWith 을 이용한 행렬 곱셈

수학에서 집합을 표현하는 방법에는 열거형 표현법과 진술형 표현법으로 나뉘어진다. { 3, 7, 10, 14 } 는 열거형 표현이고, { y | y = n + 2n + [n/2] where n = 1, 2, 3, 4 } 는 진술형 표현이다. (단 여기서 [x] 는 가우스 기호) (참고로 아래의 구문에서 기호 ghci GHCi, version 7.4.2: http://www.haskell.org/ghc/ :? for help Loading package ghc-prim ... linking ... done. Loading package integer-gmp ... linking ... done. Loading package base ... linking ... done. Prelude> [ x + 2*x +..

OCaml 언어로 평방근, 입방근, n제곱근 구하는 함수를 구현하고 테스트하기

음이 아닌 실수 A 의 평방근 sqrt(A) 를 구하는 Heron 의 방법: 반복함수 g(x) = (x + A/x) / 2 를 이용 실수 A 의 n제곱근 root(n, A) 를 구하는 Newton-Raphson 의 방법 반복함수 g(x) = ((n-1)*x + A/(x**(n - 1))) / n 를 이용 n = 2 인 경우에는 Newton-Raphson 의 방법이 Heron 의 방법과 동일하다. (참조. http://en.wikipedia.org/wiki/Newton's_method ) OCaml 언어에는 부동소수점수의 지수연산자 ** 가 있다. 하지만 차후 필요한 데가 있을 것 같아서 이와 유사한 n 제곱 함수와 n 제곱근 함수를 구현해 보았다. 지수가 정수인 거듭제곱을 계산하는 함수도 nPow, gP..

30000! 빨리 계산하기 with OCaml

* 꼬리 재귀호출과 패턴 매칭을 이용하여 구현한 팩토리얼과 피보나치 수열 계산 (* Filename: fact.ml Rapid factorial and fibonacci seq implementations by pattern matching and tail recursive call Execute: ocaml nums.cma fact.ml or Compile: ocamlc -o fact.exe nums.cma fact.ml Execute: fact Date: 2013. 2. 6. Author: pkim __AT__ scripts.pe.kr *) open Printf open Num let bignum x = num_of_int x ;; let to_string x = string_of_num x ;; l..

int 타입과 bigint 타입 간 상호 타입 변환 with OCaml

OCaml 언어에서 쓸 수 있는 bigint 타입은 Big_Int 모듈의 것과 Num 모듈의 것 두 가지 종류가 있다. Num 모듈의 것은 유리수 계산에도 쓸 수 있는 타입이지만 그 대신 속도가 느리고, Big_int 모듈의 것은 사칙연산자 마저도 정의 되어 있지 않아 사용하는데는 불편하지만 다소 더 빠르다. 그래도 Java 언어의 java.math.BigInteger 보다는 많이 느리다. OCaml 언어의 타입 체크는 C 언어나 Java 언어 보다도 훨씬 엄격하며, int, int32, int64 간의 오토박싱, 언박싱은 아예 지원되지 않으며 항상 명시적인 타입 변환을 해주어야 한다. 사칙 연산 기호 마저도 int 타입이면 + - * / float 타입이면 +. -. *. /. Num.Int 또는 Nu..

Pollard's rho method 소개: 정수의 인수분해(factorizing integers) with OCaml

정의 (소수와 합성수) 1보다 큰 양의 정수 n에 대하여 (i) n = a * b 를 만족하고 1보다 큰 두 양의 정수 a와 b가 존재하면, n을 합성수(合成數, composite number)라고 한다. 참고로 이 경우, a, b 중에 적어도 하나는 sqrt(n) 보다 작거나 같다. 합성수의 예로는 4, 6, 9, 24, 143 등이 있다. (ii) n = a * b 를 만족하고 1보다 큰 두 양의 정수 a와 b가 존재하지 않으면, 즉 n을 두 양의 정수의 곱으로 표현하는 방법이 1*n과 n*1 두 가지 뿐이면, n을 소수(素數, prime number)라고 한다. 소수의 예로는 2, 3, 5, 7, 11 등이 있다. n이 소수인지 아닌지 확인하려면, n을 2 보다 크거나 같고 sqrt(n) 보다 작거..

스트링 리스트에서 스트링 찾기(find) with OCaml

[파일명: testStringFindInList.ml]------------------------------------------------ open Printf;; let is_member arr s = List.exists (fun x -> x = s) arr ;; let findIndex s data = let rec loop s1 l acc = match l with | x::xs -> if x = s1 then acc else loop s1 xs (acc + 1) | [] -> -1 in let k = loop s data 0 in k ;; let printList data = let rec loop l = match l with | x::[] -> printf "%s" x | x::xs -> ..

스트링 배열 정렬(sorting)하기 with OCaml

printList 함수를 OCaml 의 함수형 언어의 특징을 살려 (꼬리 재귀호출과 match 표현을 이용하여) 구현하였다. [파일명: testSort.ml]------------------------------------------------ open Printf ;; let printList data = let rec loop l = match l with | x::[] -> printf "%s" x | x::xs -> begin printf "%s, " x; loop xs end | [] -> printf "" in printf "[" ; loop data ; printf "]" ;; (* Begin here *) let cmdArgs = Sys.argv in let args2 = Array.sub..

손으로 계산하는 긴자리 곱셈표 만들기 with OCaml

초등학교 때 배우던 두 정수의 곱셈표를 만들어 주는 F# 소스이다. 이 소스는 Python 소스를 F# 소스로 변환한 후 다시 OCaml 언어로 재작성한 것이라서 OCaml 의 명령형 언어 특징을 위주로 짜여져 있다. (* * Filename: makeMultTable.ml * * Print a multiplication table. * * Execute: ocaml makeMultTable.ml 123 450 * * Or * * Compile: ocamlc -o makeMultTable.exe makeMultTable.ml * Execute: makeMultTable 230 5100 * * Date: 2013. 2. 2). * Author: pkim __AT__ scripts.pe.kr *) open ..