필요한데가 많을 것 같아서 올려 놓는다.

//  See  http://msdn.microsoft.com/en-us/library/dd233248.aspx

let (|Integer|_|) (str: string) =
   let mutable intvalue = 0
   if System.Int32.TryParse(str, &intvalue) then Some(intvalue)
   else None

let (|Float|_|) (str: string) =
   let mutable floatvalue = 0.0
   if System.Double.TryParse(str, &floatvalue) then Some(floatvalue)
   else None

let parseNumeric str =
   match str with
     | Integer i -> printfn "%d : Integer" i
     | Float f -> printfn "%f : Floating point" f
     | _ -> printfn "%s : Not matched." str

parseNumeric "1.1"
parseNumeric "0"
parseNumeric "0.0"
parseNumeric "10"
parseNumeric "Something else"




실행 결과:

1.100000 : Floating point
0 : Integer
0.000000 : Floating point
10 : Integer
Something else : Not matched.


Posted by Scripter
,

F# 프로그래밍 중에 한글 출력을 시도하였다.
그러나 당연히 되리라고 믿었던 printfn 에 의한 한글 출력이 되지 않았다.

printfn "한글"

이 한 줄 짜리 F# 소스를 컴파일하고 실행하면

???

가 출력된다. 소스를 UTF8 인코딩으로 저장해 보기도 하고, 명령창을 chcp 65001 하여 UTF8 창으로 바꾸어 보기도 하였지만 허사였다.
인터넷 검색을 해보아도 해결책을 찾지 못했다.
아마도 F# 언어를 사용하는 사람들은 적어도 한글을 안써도 되는 듯...
(.NET에서 한글을 못 쓰면 문제가 많을텐데...)

그러나 알고 보면 쉬운 것.
fsc 로 컴파일할 때  --codepage:숫자 옵션으로 인코딩 숫자(예를 들어 949)를 지정하면 된다.

우선 F# 소스를 하나 보자

// 파일명: hello.fs

(* 한글이 있는
   여러 줄
   주석문 *)
printfn "Hello"
printfn "안녕하세요?"

// 한글이 있는 주석문
let a = sprintf "%s을 %s당..." "한글 출력" "연습합니"
printfn "F# 프로그래밍에서 %s" a



컴파일하기:
D:\test\f#>fsc --codepage:949 hello.fs
Microsoft (R) F# 2.0 Compiler build 2.0.0.0
Copyright (c) Microsoft Corporation. All Rights Reserved.

실행하기:
D:\test\f#>hello
Hello
안녕하세요?
F# 프로그래밍에서 한글 출력을 연습합니당...


* 참고: fsi 에서는 한글 입력과 출력이 잘 되지 않는다.


* Visual Studio 통합 환경에서는 한글 문제가 발생하지 않는다.






Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.

Posted by Scripter
,

목적:
http://stackoverflow.com/questions/1907709/a-simple-wrapper-for-f-to-do-matrix-operations 에 올려진 소스에서 String.spit 관련를 문제 해결하자.

테스트를 위해 필요한 자료:   dnAnalytics
                                        F# Power Pack


// 파일명: TestFSharpMatrix.fs (원래 소스)

#r @"D:\WORK\tools\dnAnalytics_windows_x86\bin\dnAnalytics.dll" 
#r @"FSharp.PowerPack.dll"
 
 
open dnAnalytics
.LinearAlgebra
 
open
Microsoft.FSharp.Math
 
open dnAnalytics
.LinearAlgebra.Decomposition
 
 
// F# matrix -> ndAnalytics DenseMatrix
 
let mat2dnmat
(mat:matrix) =
 
    let m
= new DenseMatrix(mat.ToArray2D())
 
    m 
 
// ndAnalytics DenseMatrix -> F# matrix
 
let dnmat2mat
(dnmat:DenseMatrix) =
 
    let n
= dnmat.Rows
 
    let m
= dnmat.Columns
 
    let mat
= Matrix.create n m 0.
 
   
for i=0 to n-1 do
 
       
for j=0 to m-1 do
 
            mat
.[i,j] <- dnmat.Item(i,j)
 
    mat 
 
// random matrix
 
let randmat n m
=
 
    let r
= new System.Random()
 
    let ranlist m
=
 
       
[ for i in 1..m do yield r.NextDouble() ]
 
    matrix
([1..n] |> List.map (fun x-> ranlist m))
 
 
// is square matrix
 
let issqr
(m:matrix) =
 
    let n
, m = m.Dimensions
 
    n
=

 
// is postive definite
 
let ispd m
=
 
   
if not (issqr m) then false
 
   
else
 
        let m1
=
mat2dnmat m 
        let qrsolver
= dnAnalytics.LinearAlgebra.Decomposition.Cholesky(m1)
 
        qrsolver
.IsPositiveDefinite()
 
 
// determinant
 
let det m
=
 
    let m1
=
mat2dnmat m 
    let lusolver
= dnAnalytics.LinearAlgebra.Decomposition.LU(m1)
 
    lusolver
.Determinant ()
 
 
// is full rank
 
let isfull m
=
 
    let m1
=
mat2dnmat m 
    let qrsolver
= dnAnalytics.LinearAlgebra.Decomposition.GramSchmidt(m1)
 
    qrsolver
.IsFullRank()
 
 
// rank
 
let rank m
=
 
    let m1
=
mat2dnmat m 
    let svdsolver
= dnAnalytics.LinearAlgebra.Decomposition.Svd(m1, false)
 
    svdsolver
.Rank()
 
 
// inversion by lu
 
let inv m
=
 
    let m1
=
mat2dnmat m 
    let lusolver
= dnAnalytics.LinearAlgebra.Decomposition.LU(m1)
 
    lusolver
.Inverse()
 
 
// lu
 
let lu m
=
 
    let m1
=
mat2dnmat m 
    let lusolver
= dnAnalytics.LinearAlgebra.Decomposition.LU(m1)
 
    let l
= dnmat2mat (DenseMatrix (lusolver.LowerFactor ()))
 
    let u
= dnmat2mat (DenseMatrix (lusolver.UpperFactor ()))
 
   
(l,u)
 
 
// qr
 
let qr m
=
 
    let m1
=
mat2dnmat m 
    let qrsolver
= dnAnalytics.LinearAlgebra.Decomposition.GramSchmidt(m1)
 
    let q
= dnmat2mat (DenseMatrix (qrsolver.Q()))
 
    let r
= dnmat2mat (DenseMatrix (qrsolver.R()))
 
   
(q, r)
 
 
// svd
 
let svd m
=
 
    let m1
=
mat2dnmat m 
    let svdsolver
= dnAnalytics.LinearAlgebra.Decomposition.Svd(m1, true)
 
    let u
= dnmat2mat (DenseMatrix (svdsolver.U()))
 
    let w
= dnmat2mat (DenseMatrix  (svdsolver.W()))
 
    let vt
= dnmat2mat (DenseMatrix (svdsolver.VT()))
 
   
(u, w, vt.Transpose)
 


// and test code
(* todo: read matrix market format   ref: http://math.nist.gov/MatrixMarket/formats.html *)
 
let readmat
(filename:string) =
 
   
System.IO.File.ReadAllLines(filename) |> Array.map (fun x-> (x |> String.split [' '] |> List.toArray |> Array.map float))
 
   
|>
matrix 
 
let timeit f str
=
 
    let watch
= new System.Diagnostics.Stopwatch()
 
    watch
.Start()
 
    let res
= f()
 
    watch
.Stop()
 
    printfn
"%s Needed %f ms" str watch.Elapsed.TotalMilliseconds
 
    res 
 

let test
() =  
    let testlu
() =  
       
for i=1 to 10 do 
            let a
,b = lu (randmat 1000 1000) 
           
() 
       
() 

    let testsvd
() = 
       
for i=1 to 10 do 
            let u
,w,v = svd (randmat 300 300) 
           
() 
       
() 

    let testdet
() = 
       
for i=1 to 10 do 
            let d
= det (randmat 650 650) 
           
() 
       
() 

    timeit testlu
"lu"  
    timeit testsvd
"svd" 
    timeit testdet
"det" 



1. 우선 위의 소스를 그대로  컴파일하였다.

컴파일하니 아래와 같이 에러가 뜬다.
 
D:\test\f#>fsc TestFSharpMatrix.fsx
Microsoft (R) F# 2.0 Compiler build 2.0.0.0
Copyright (c) Microsoft Corporation. All Rights Reserved.

TestFSharpMatrix.fsx(106,85): error FS0039: The field, constructor or member 'sp
lit' is not defined


2. 파일 확장명 바꾸고, #r 디렉티브 수정하기

dll 파일을 현재 디렉토리에 놓고 컴파일하기 위해 소스 선두의 #r 디렉티브를 수정하였다.
파일 확장명도 fsx로 바꾸었다.


// 1차 수정된 파일명: TestFSharpMatrix.fsx (소스의 선두 #r 디렉티브 부분 수정)

#r @".\dnAnalytics.dll" 
#r @".\FSharp.PowerPack.dll"
 
 
open dnAnalytics.LinearAlgebra 
open
Microsoft.FSharp.Math
 
open dnAnalytics
.LinearAlgebra.Decomposition
 
 

// 이하 생략



컴파일하면 이전과 동일한 에러메세지가 뜬다,

D:\test\f#>fsc TestFSharpMatrix.fsx
Microsoft (R) F# 2.0 Compiler build 2.0.0.0
Copyright (c) Microsoft Corporation. All Rights Reserved.

TestFSharpMatrix.fsx(106,85): error FS0039: The field, constructor or member 'sp
lit' is not defined



3. FSharp.PowerPack.Compatibility.dll 도 사용하자.

F# Power Pack 의  FSharp.PowerPack.Compatibility.dll 을 현재 디렉토리에 넣어 준다.


// 2차 수정된 파일명: testFShapMatrix.fsx (FSharp.PowerPack.Compatibility.dll 을 #r 리렉티브에 추가)

#r @".\dnAnalytics.dll"
#r @".\FSharp.PowerPack.dll"
#r @".\FSharp.PowerPack.Compatibility.dll"

open dnAnalytics.LinearAlgebra 
open
Microsoft.FSharp.Math
 
open dnAnalytics
.LinearAlgebra.Decomposition
 
 
// 이하 생략



2차 수정된 소스는 컴파일은 되지만 실행 결과가 없다.

D:\test\f#>fsc TestFSharpMatrix.fsx
Microsoft (R) F# 2.0 Compiler build 2.0.0.0
Copyright (c) Microsoft Corporation. All Rights Reserved.

TestFSharpMatrix.fsx(136,1): warning FS0988: Main module of program is empty: no
thing will happen when it is run


4, 실행위한 Main 모듈을 추가하자.

// 3차 수정된 파일명: testString.fsx (소스의 7째 줄 Split을 String.split로 수정)
// 3차 수정된 파일명: testFShapMatrix.fsx (FSharp.PowerPack.Compatibility.dll 을 #r 리렉티브에 추가)

#r @".\dnAnalytics.dll"
#r @".\FSharp.PowerPack.dll"
#r @".\FSharp.PowerPack.Compatibility.dll";;

open dnAnalytics.LinearAlgebra 
open
Microsoft.FSharp.Math
 
open dnAnalytics
.LinearAlgebra.Decomposition
 
 
// 중략

    timeit testlu
"lu"  
    timeit testsvd
"svd" 
    timeit testdet
"det" 

[<EntryPoint>]
let main args =
    test()
    0           // Return 0. This indicates success.



이제는 컴파일도 잘 되고, 실행도 잘 된다.
실행 후 잠시 기다리면 실행에 소요된 시간이 밀리초 단위로 컨솔에 출력된다.

D:\test\f#>fsc TestFSharpMatrix.fsx
Microsoft (R) F# 2.0 Compiler build 2.0.0.0
Copyright (c) Microsoft Corporation. All Rights Reserved.

D:\test\f#>TestFSharpMatrix
lu Needed 21519.869700 ms
svd Needed 6146.898400 ms
det Needed 4221.604900 ms



* 이로서 이 글의 선두에 적어 놓은 목적이 해결되었다.



Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.


Posted by Scripter
,

목적:
http://geekswithblogs.net/MarkPearl/archive/2010/04/02/creating-my-first-f-program-in-my-new-ldquoexpert-f.aspx 에 올려진 (실행되지 않는) F# 예제가 실행되도록 하자.


// 파일명: testString.fs (에러가 많은 원래 소스)

#light

  let wordCount text =
    let words = Split [' '] text
    let wordset = Set.ofList words
    let nWords = words.Length
    let nDups = words.Length - wordSet.Count
    (nWords, nDups)

let showWordCount text =
    let nWords,nDups = wordCount text
    printfn "--> %d words in text" nWords
    printfn "--> %d duplicate words" nDups



1. 우선 위의 소스를 그대로  컴파일하였다.

컴파일하니 아래와 같이 에러가 2개 뜬다.
 
D:\test\f#>fsc testStringSplit.fs
Microsoft (R) F# 2.0 Compiler build 2.0.0.0
Copyright (c) Microsoft Corporation. All Rights Reserved.

testStringSplit.fs(5,17): error FS0039: The value or constructor 'Split' is not
defined

testStringSplit.fs(8,32): error FS0039: The namespace or module 'wordSet' is not
 defined



2. String.split 해결하기

우선 String.split 가 없다고 하는 문제를 해결하기 위해 #r 디렉티브를 써서 소스 첫 부분에
#r "FSharp.PowerPack.dll";;
#r "FSharp.PowerPack.Compatibility.dll";;
릉 추가하여 다시 컴파일하였다. (여기도 FSharp.PowerPack.Compatibility.dll 도 꼭 있어야 함이 중요하다. 이것을 모르면 엉뚱한 곳에서 삽질만 하게 된다.)


// 1차 수정된 파일명: testString.fs

#r "FSharp.PowerPack.dll";;
#r "FSharp.PowerPack.Compatibility.dll";;

#light

let
wordCount text =
    let words = Split [' '] text
    let wordset = Set.ofList words
    let nWords = words.Length
    let nDups = words.Length - wordSet.Count
    (nWords, nDups)

let showWordCount text =
    let nWords,nDups = wordCount text
    printfn "--> %d words in text" nWords
    printfn "--> %d duplicate words" nDups



이제 1차 수정된 소스를 컴파일하였다.
아래 처럼 #r 디렉티브에 관련된 에러가 뜬다.

D:\test\f#>fsc testStringSplit.fs
Microsoft (R) F# 2.0 Compiler build 2.0.0.0
Copyright (c) Microsoft Corporation. All Rights Reserved.

testStringSplit.fs(1,1): error FS0076: #r directives may only occur in F# script
 files (extensions .fsx or .fsscript). Either move this code to a script file, a
dd a '-r' compiler option for this reference or delimit the directive with '#if
INTERACTIVE'/'#endif'.

testStringSplit.fs(2,1): error FS0076: #r directives may only occur in F# script
 files (extensions .fsx or .fsscript). Either move this code to a script file, a
dd a '-r' compiler option for this reference or delimit the directive with '#if
INTERACTIVE'/'#endif'.


3. 파일 확장명 바꾸기

#r 디렉티브가 있는 소스의 확장명은 fsx라야 한다고 하니 그렇게 바꾸었다.

// 2차 수정된 파일명: testString.fsx (소스는 그대로이고 파일 확장명만 fsx로 변경)

#r "FSharp.PowerPack.dll";;
#r "FSharp.PowerPack.Compatibility.dll";;

#light

let
wordCount text =
    let words = Split [' '] text
    let wordset = Set.ofList words
    let nWords = words.Length
    let nDups = words.Length - wordSet.Count
    (nWords, nDups)

let showWordCount text =
    let nWords,nDups = wordCount text
    printfn "--> %d words in text" nWords
    printfn "--> %d duplicate words" nDups



2차 수정된 소스를 컴파일 하였다.
컴파일하기 위해서는 2개의 파일 FSharp.PowerPack.dll 과 Fharp.PowerPack.Compatibility.dll 이 현재 디렉토리에 있어야 한다. 이는  http://fsharppowerpack.codeplex.com/  에서 구할 수 있다.

D:\est\f#>fsc testStringSplit.fsx
Microsoft (R) F# 2.0 Compiler build 2.0.0.0
Copyright (c) Microsoft Corporation. All Rights Reserved.

testStringSplit.fsx(7,17): error FS0039: The value or constructor 'Split' is not
 defined

testStringSplit.fsx(10,32): error FS0039: The namespace or module 'wordSet' is n
ot defined


4, Split가 아니라 String.split

// 3차 수정된 파일명: testString.fsx (소스의 7째 줄 Split을 String.split로 수정)

#r "FSharp.PowerPack.dll";;
#r "FSharp.PowerPack.Compatibility.dll";;

#light

let
wordCount text =
    let words = String.split [' '] text
    let wordset = Set.ofList words
    let nWords = words.Length
    let nDups = words.Length - wordSet.Count
    (nWords, nDups)

let showWordCount text =
    let nWords,nDups = wordCount text
    printfn "--> %d words in text" nWords
    printfn "--> %d duplicate words" nDups



3차 수정된 소스를 컴파일 하였다.


D:\test\f#>fsc testStringSplit.fsx
Microsoft (R) F# 2.0 Compiler build 2.0.0.0
Copyright (c) Microsoft Corporation. All Rights Reserved.

testStringSplit.fsx(10,32): error FS0039: The namespace or module 'wordSet' is n
ot defined


5. 4차 수정 (오타를 바로 잡다)

// 4차 수정된 파일명: testString.fsx (소스의 8째 줄 wordset을 wordSet으로 수정)

#r "FSharp.PowerPack.dll";;
#r "FSharp.PowerPack.Compatibility.dll";;

#light

let
wordCount text =
    let words = String.split [' '] text
    let wordSet = Set.ofList words
    let nWords = words.Length
    let nDups = words.Length - wordSet.Count
    (nWords, nDups)

let showWordCount text =
    let nWords,nDups = wordCount text
    printfn "--> %d words in text" nWords
    printfn "--> %d duplicate words" nDups


 

4차 수정된 소스를 컴파일 하였다.
컴파일이 잘된다. 그런데  Main 모듈이 없다는 경고(warning)가 뜬다.

D:\test\f#>fsc testStringSplit.fsx
Microsoft (R) F# 2.0 Compiler build 2.0.0.0
Copyright (c) Microsoft Corporation. All Rights Reserved.

testStringSplit.fsx(18,1): warning FS0988: Main module of program is empty: noth
ing will happen when it is run


Main 모듈이 없다는 위의 경고를 무시하고 실행해보았다.

D:\test\f#>TestFSharpMatrix

실행은 되지만 역시 아무 출력이 없다.



6. 실행을 위한 Main 모듈 추가하기

// 5차 수정된 파일명: testString.fsx (소스의 끝 부분에 Main 모듈 추가)

#r "FSharp.PowerPack.dll";;
#r "FSharp.PowerPack.Compatibility.dll";;

#light

let
wordCount text =
    let words = String.split [' '] text
    let wordSet = Set.ofList words
    let nWords = words.Length
    let nDups = words.Length - wordSet.Count
    (nWords, nDups)

let showWordCount text =
    let nWords,nDups = wordCount text
    printfn "--> %d words in text" nWords
    printfn "--> %d duplicate words" nDups

[<EntryPoint>]
let main args =
    showWordCount "let wordCount text let showWordCount text"
    0        // Return 0. This indicates success.



마지막으로 수정된 위의 소스를 컴파일한다.

D:\test\f#>fsc testStringSplit.fsx
Microsoft (R) F# 2.0 Compiler build 2.0.0.0
Copyright (c) Microsoft Corporation. All Rights Reserved.


컴파일된 실행파일(testStringSplit.exe)을 실행한다.

D:\test\f#>testStringSplit
--> 6 words in text
--> 2 duplicate words



* 이로서 이 글의 선두에 적어 놓은 목적이 해결되었다.



Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.

Posted by Scripter
,

2**2**5  은 (2**2)**5  와 2**(2**5) 중에 어느 것과 같을까?
즉, 지수 연산자 **는 왼쪽에서 오른쪽으로(left to right) 진행할까?
아니면 오른쪽에서 왼쪽으로(right to left) 진행할까?

만일 2**2**5 == (2**2)**5  라면 그 결과는 2**10 과 같을 것이고,
만일  2**2**5 == 2**(2**5)  라면 그 결과는 2**32 과 같을 것이다.

* 미리 결론을 말하면 Groovy 언어에서는 지수 계산의 순서가 다른 언어(Python. Ruby, Maxima 등)의 것과는 다르다는 것이다.


1. groovy 의 경우

groovysh 로 테스트하였다.

Groovy Shell (1.7.3, JVM: 1.6.0_17)
Type 'help' or '\h' for help.
-------------------------------------------------------------------------------
groovy:000> println(2**5)
32
===> null
groovy:000> println(5**2)
25
===> null
groovy:000> println(2**2**5)
1024
===> null
groovy:000> exit




2. python의 경우

python으로 테스트하였다.

Python 2.6.4 (r264:75708, Oct 26 2009, 08:23:19) [MSC v.1500 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> print 2**5
32
>>> print 5**2
25
>>> print 2**2**5
4294967296




3. ruby 의 경우

irb로 테스트하였다.

irb(main):001:0> print "%d\n" % (2**5)
32
=> nil
irb(main):002:0> print "%d\n" % (5**2)
25
=> nil
irb(main):003:0> print "%d\n" % (2**2**5)
4294967296
=> nil
irb(main):004:0> exit




4. wxMaxima 의 경우

wxMaxima로 테스트하였다.




Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.

Posted by Scripter
,

Java 7에 포함되기로 했다가 취소된 함수형 프로그래밍(closure) 미리 맛보기

    관련 자료
        [1] http://javac.info/
        [2] http://stronglytypedblog.blogspot.com/2010/06/lambdas-in-java-preview-part-1-basics.html )
        [3] http://www.infoq.com/articles/lambdas-java-analysis
        [4] http://wiki.java.net/bin/view/JDK/ClosuresSyntaxInJava7
        [5] http://www.ibm.com/developerworks/java/library/j-jtp04247.html
        [6] http://www.java.net/pub/pq/242
        [7] http://www.baptiste-wicht.com/2010/05/oracle-pushes-a-first-version-of-closures/
        [8] http://www.davidflanagan.com/2010/05/closures-in-jav.html


1. FuctionalJava 홈페이지
   http://functionaljava.org/examples/

2. 다운로드
    http://functionaljava.org/download/


3. 예제

JDK 1.5 이상 용 예제 파일 (Java 7 용은 별도로 있음)

// 소스 파일: Fibs.java

package concurrent;

import static fj.Bottom.error;
import fj.Effect;
import fj.F;
import fj.P;
import fj.P2;
import fj.Unit;
import fj.data.List;
import fj.control.parallel.Actor;
import fj.control.parallel.Promise;
import fj.control.parallel.Strategy;
import static fj.data.List.range;
import static fj.function.Integers.add;
import static fj.control.parallel.Promise.join;
import static fj.control.parallel.Promise.promise;
import static fj.control.parallel.Actor.actor;

import java.text.MessageFormat;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * Parallel Fibonacci numbers.
 * Based on a Haskell example by Don Stewart.
 * Author: Runar
 */
public class Fibs
  {private static final int CUTOFF = 35;

   public static void main(final String[] args)
     {if (args.length < 1)
         throw error("This program takes an argument: number_of_threads");

      final int threads = Integer.parseInt(args[0]);
      final ExecutorService pool = Executors.newFixedThreadPool(threads);
      final Strategy<Unit> su = Strategy.executorStrategy(pool);
      final Strategy<Promise<Integer>> spi = Strategy.executorStrategy(pool);

      // This actor performs output and detects the termination condition.
      final Actor<List<Integer>> out = actor(su, new Effect<List<Integer>>()
        {public void e(final List<Integer> fs)
          {for (final P2<Integer, Integer> p : fs.zipIndex())
               {System.out.println(MessageFormat.format("n={0} => {1}", p._2(), p._1()));}
           pool.shutdown();}});

      // A parallel recursive Fibonacci function
      final F<Integer, Promise<Integer>> fib = new F<Integer, Promise<Integer>>()
        {public Promise<Integer> f(final Integer n)
          {return n < CUTOFF ? promise(su, P.p(seqFib(n))) : f(n - 1).bind(f(n - 2), add);}};

      System.out.println("Calculating Fibonacci sequence in parallel...");
      join(su, spi.parMap(fib, range(0, 46)).map(Promise.<Integer>sequence(su))).to(out);}

  // The sequential version of the recursive Fibonacci function
  public static int seqFib(final int n)
    {return n < 2 ? n : seqFib(n - 1) + seqFib(n - 2);}}



4. 컴파일하기

    javac -d . -cp functionaljava.jar Fibs.java


5. 실행하기 (옵션 3은 쓰레드 개수)

    java -classpath .;functionaljava.jar concurrent.Fibs 3

실행 결과:
ibs 3
Calculating Fibonacci sequence in parallel...
n=0 => 0
n=1 => 1
n=2 => 1
n=3 => 2
n=4 => 3
n=5 => 5
n=6 => 8
n=7 => 13
n=8 => 21
n=9 => 34
n=10 => 55
n=11 => 89
n=12 => 144
n=13 => 233
n=14 => 377
n=15 => 610
n=16 => 987
n=17 => 1,597
n=18 => 2,584
n=19 => 4,181
n=20 => 6,765
n=21 => 10,946
n=22 => 17,711
n=23 => 28,657
n=24 => 46,368
n=25 => 75,025
n=26 => 121,393
n=27 => 196,418
n=28 => 317,811
n=29 => 514,229
n=30 => 832,040
n=31 => 1,346,269
n=32 => 2,178,309
n=33 => 3,524,578
n=34 => 5,702,887
n=35 => 9,227,465
n=36 => 14,930,352
n=37 => 24,157,817
n=38 => 39,088,169
n=39 => 63,245,986
n=40 => 102,334,155
n=41 => 165,580,141
n=42 => 267,914,296
n=43 => 433,494,437
n=44 => 701,408,733
n=45 => 1,134,903,170



Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
Posted by Scripter
,


1. Add.cs 파일

// File: Add.cs
namespace UtilityMethods
{
    public class AddClass
    {
        public static long Add(long i, long j)
        {
            return (i + j);
        }
    }
}




2. Mult.cs 파일

// File: Mult.cs
namespace UtilityMethods
{
    public class MultiplyClass
    {
        public static long Multiply(long x, long y)
        {
            return (x * y);
        }
    }
}




3. TestCode.cs 파일

using UtilityMethods;

class TestCode
{
    static void Main(string[] args)
    {
        System.Console.WriteLine("Calling methods from MathLibrary.DLL:");

        if (args.Length != 2)
        {
            System.Console.WriteLine("Usage: TestCode <num1> <num2>");
            return;
        }

        long num1 = long.Parse(args[0]);
        long num2 = long.Parse(args[1]);

        long sum = AddClass.Add(num1, num2);
        long product = MultiplyClass.Multiply(num1, num2);

        System.Console.WriteLine("{0} + {1} = {2}", num1, num2, sum);
        System.Console.WriteLine("{0} * {1} = {2}", num1, num2, product);
    }
}



4. dll 파일 만들기

    csc /target:library /out:MathLibrary.DLL Add.cs Mult.cs


5. 테스트 실행 파일 만들기

csc /out:TestCode.exe /reference:MathLibrary.DLL TestCode.cs


6. 실행하기

  TestCode 1234 5678



Posted by Scripter
,

1. 다운로드
    http://www.alglib.net/ 에서 C#용 라이브러리 소스를 다운로드한다.


2. 다운로드한 파일의 압축을 적당한 디렉토리에 푼다.


3. 그 디렉토리로 가서 빌드한다. (옵션은 csc 와 mono 중에 택 1)
    build csc

    (빌드가 끝나면 out 디렉토리에 libalglib.dll 파일이 생성되어 있을 것이다.)


4. 빌드 후 테스트  (옵션은 csc 와 mono 중에 택 1)
   check csc all


5. 개별 테스트 (옵션 /reference 를 이용하여 dll 파일을 지정한다.)

   cd examples

   csc _demo_rcond_1.cs /reference:..\out\libalglib.dll
   _demo_rcond_1

   csc _demo_ode_example1.cs /reference:..\out\libalglib.dll
   _demo_ode_example1

   csc _demo_ode_example2.cs /reference:..\out\libalglib.dll
   _demo_ode_example2


Posted by Scripter
,
소스파일명: hello.ml
open Printf;;

print_string "Hello, 안녕하세요?";;
print_endline "";;

let x = 23 in
let y = 7 in
printf "x의 값은 %d이고 y의 값은 %d입니다." x y;
print_endline "";
printf "따라서 그 곱은 x * y = %d * %d = %d 입니다.\n" x y (x*y);;


컴파일하기: ocamlc -o hello.exe hello.ml
실행 명령> hello
실행 결과:
Hello, 안녕하세요?
x의 값은 23이고 y의 값은 7입니다.
따라서 그 곱은 x * y = 23 * 7 = 161 입니다.


컴파일 없이 실행하기: ocaml hello.ml
실행 결과:

Hello, 안녕하세요?
x의 값은 23이고 y의 값은 7입니다.
따라서 그 곱은 x * y = 23 * 7 = 161 입니다.


 
 
Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.

Posted by Scripter
,
다항식 p(x) 를 1차 다항식 ax - b 로 나눌 때의 몫과 나머지를 구하는 조립제법을
Python 언어로 구현해 보았다. 조립제법은 일명 Horner의 방법이라고도 불리우는데, 이는
x = a 에서 다항식 p(x)의 값 p(a)을 계산하는 가장 빠른 알고리즘이기도 하다.

         p(x) = (ax - b)q(x) + r

여기서 r은 나머지이며 r = p(b/a) 이다. 또 q(x)는 몫이다.

[참고]
    * 온라인으로 조립제법 표 만들기 손으로 계산하는 조립제법 표 
    * 온라인으로 구하는 다항식의 도함수: 조립제법을 이용한 다항식의 도함수


아래의 소스파일은 파일 testSyntheticDivision.py 를 수정한 것이다.

python 대신 jython이나 IronPython 으로도 수정 없이 그대로 실행된다.


  1. # coding: MS949
  2. #  Filename: testSyntheticDivision2.py
  3. #
  4. #  Purpose:  Find the quotient and remainder when some polynomial is
  5. #            divided by a monic polynomial of the first degree.
  6. #
  7. #  Execute:  python testSyntheticDivision2.py 5 -4 7 8 6 8
  8. #        Or  jython testSyntheticDivision2.py 5 -4 7 8 6 8
  9. import sys
  10. # 사용법 표시
  11. def printUsage():
  12.     print("사용법: python testSyntheticDivision2.py [제식의 계수] [피제식의 계수들]")
  13.     print("조립제법(synthetic method)에 의한 다항식 나눗셈 결과를 보여준다.")
  14. # 부동소수점수의 표현이 .0 으로 끝나는 경우 이를 잘라낸다.
  15. # 전체 문자열 표시 너비는 매개변수 width 로 전달받아 처리한다.
  16. def simplify(v, width=None):
  17.     t = "%g" % v
  18.     tlen = len(t)
  19.     if t[tlen-2:tlen-1] == ".0":
  20.         t = t[0, -2]
  21.     if width != None:
  22.         if tlen < width:
  23.             t = "              "[0: width - tlen] + t
  24.     return t
  25. # "/수" 표시하기
  26. # 부동소수점수의 표현이 .0 으로 끝나는 경우 이를 잘라낸다.
  27. # 전체 문자열 표시 너비는 매개변수 width 로 전달받아 처리한다.
  28. def simplifyReciprocal(v, width=None):
  29.     t = "/%g" % v
  30.     tlen = len(t)
  31.     if t[tlen-2:tlen-1] == ".0":
  32.         t = t[0, -2]
  33.     if width != None:
  34.         if tlen < width:
  35.             t = "              "[0: width - tlen] + t
  36.     return t
  37. # 다항식을 내림차순의 스트링 표현으로 반환
  38. def toPolyString(c):
  39.     t = ""
  40.     sc0 = simplify(c[0])
  41.     if len(c) > 2:
  42.         if sc0 == "1":
  43.             t += "x^%d" % (len(c)-1)
  44.         elif sc0 == "-1":
  45.             t += "-x^%d" % (len(c)-1)
  46.         else:
  47.             t += sc0 + " x^%d" % (len(c)-1)
  48.     elif len(c) == 2:
  49.         if sc0 == "1":
  50.             t += "x"
  51.         elif sc0 == "-1":
  52.             t += "-x"
  53.         else:
  54.             t += sc0 + " x"
  55.     elif len(c) == 1:
  56.         t += sc0
  57.     for i in range(1, len(c)):
  58.         k = len(c) - 1 - i
  59.         sc = simplify(c[i])
  60.         if k > 1:
  61.             if c[i] > 0.0:
  62.                 if sc == "1":
  63.                     t += " + " + "x^%d" % k
  64.                 else:
  65.                     t += " + " + sc + " x^%d" % k
  66.             elif c[i] < 0.0:
  67.                 if sc == "-1":
  68.                     t += " - " + "x^%d" % k
  69.                 else:
  70.                     t += " - " + simplify(abs(c[i])) + " x^%d" % k
  71.         elif k == 1:
  72.             if c[i] > 0.0:
  73.                 if sc == "1":
  74.                     t += " + " + "x"
  75.                 else:
  76.                     t += " + " + sc + " x"
  77.             elif c[i] < 0.0:
  78.                 if sc == "-1":
  79.                     t += " - " + "x"
  80.                 else:
  81.                     t += " - " + simplify(abs(c[i])) + " x"
  82.         elif k == 0:
  83.             if c[i] > 0.0:
  84.                 t += " + " + sc
  85.             elif c[i] < 0.0:
  86.                 t += " - " + simplify(abs(c[i]))
  87.     return t
  88. # 다항식 나눗셈 결과를
  89. #     (피제식) = (제식)(몫) + (나머지)
  90. # 형태로 출력
  91. def printDivisionResult(a, c, d, b):
  92.     strLine = "  " + toPolyString(c)
  93.     print( strLine )
  94.     strLine = "    = ( " + toPolyString( [a[0], -a[1]] ) + " )"
  95.     tmp = [0.0] * (len(b) - 1)
  96.     for i in range(0, len(tmp)):
  97.         tmp[i] = b[i]
  98.     strLine += "( " + toPolyString(tmp) + " )"
  99.     r = d[len(d) - 1]
  100.     if r > 0.0:
  101.         strLine += " + " + simplify(r)
  102.     elif r < 0.0:
  103.         strLine += " - " + simplify(abs(r))
  104.     print( strLine )
  105. # 조립제법 계산표 출력 함수
  106. def printSyntheticTable(a, c, s, d, q):
  107.     strLine = "         | "
  108.     strLine += simplify(c[0], 8)
  109.     for i in range(1, len(c)):
  110.         strLine += "  " + simplify(c[i], 8)
  111.     print( strLine )
  112.     strLine = simplify(a[1], 8) + " |"
  113.     strLine += "           "
  114.     strLine += simplify(s[1], 8)
  115.     for i in range(2, len(s)):
  116.         strLine += "  " + simplify(s[i], 8)
  117.     print( strLine )
  118.     strLine = "         |"
  119.     for i in range(0, len(q)):
  120.         strLine += "----------"
  121.     print( strLine )
  122.     strLine = "         | "
  123.     strLine += simplify(d[0], 8)
  124.     for i in range(1, len(d)):
  125.         strLine += "  " + simplify(d[i], 8)
  126.     print( strLine )
  127.     strLine = simplifyReciprocal(a[0], 8) + " | "
  128.     strLine += simplify(q[0], 8)
  129.     for i in range(1, len(q) - 1):
  130.         strLine += "  " + simplify(q[i], 8)
  131.     print( strLine )
  132. # 실행 시작 지점
  133. if len(sys.argv) < 3:
  134.     printUsage()
  135.     sys.exit(1)
  136. ######################################################
  137. # 피제식은 c_0 x^n +  c_1 x^(n -1) + ... + c_n
  138. # 제식은 a x -  b
  139. a = [float(sys.argv[1]), - float(sys.argv[2])]
  140. c = [0.0]*(len(sys.argv) - 3)
  141. s = [0.0]*(len(sys.argv) - 3)
  142. d = [0.0]*(len(sys.argv) - 3)
  143. b = [0.0]*(len(sys.argv) - 3)
  144. for i in range(0, len(c)):
  145.     c[i] = float(sys.argv[i + 3])
  146. ######################################################
  147. # 조립제법의 주요 부분
  148. s[0] = 0.0
  149. d[0] = c[0]
  150. b[0] = c[0] / a[0]
  151. for i in range(1, len(c)):
  152.     s[i] = b[i-1]*a[1]
  153.     d[i] = c[i] + s[i]
  154.     b[i] = d[i] / a[0]
  155. ######################################################
  156. # 몫의 계수와 나머지를 출력한다.
  157. print("몫의 계수는"),
  158. for i in range(0, len(b) - 2):
  159.     print(simplify(b[i], None) + ", " ),
  160. print(simplify(b[len(b) - 2], None)),
  161. print("이고, 나머지는 " + simplify(d[len(d) - 1], None) + " 이다.")
  162. print
  163. ######################################################
  164. # 조립제법 표를 출력한다.
  165. printSyntheticTable(a, c, s, d, b)
  166. print
  167. ######################################################
  168. # (피제식) = (제식) x (몫) + (나머지)
  169. printDivisionResult(a, c, d, b)




실행> python testSyntheticDivision2.py 5 -4 7 8 6 8
몫의 계수는 1.4,  2.72,  3.376 이고, 나머지는 21.504 이다.

         |        7         8         6         8
       4 |                5.6     10.88    13.504
         |----------------------------------------
         |        7      13.6     16.88    21.504
      /5 |      1.4      2.72     3.376

  7 x^3 + 8 x^2 + 6 x + 8
    = ( 5 x - 4 )( 1.4 x^2 + 2.72 x + 3.376 ) + 21.504



Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.

Posted by Scripter
,