May
19
F#で無限素数シーケンスを作る
かの有名なエラストテネスのふるいを用いてF#で無限素数シーケンスを作ろうと思ったがめんどくさい。
まぁF#は純粋関数型言語じゃないからいろいろやりようはあるだろうが、関数型らしいやりかたでやってみた。
let prime = ([],2) |> Seq.unfold (fun (l,n)->
let isp l n= l |> Seq.takeWhile (fun p->p*p<=n) |> Seq.exists ((%)n>>(=)0) |> not
let p=Seq.initInfinite ((+)n) |> Seq.find (isp l)
Some(p,(l@[p],p+1))
);;
だが速いかはよくわからない。まぁいい感じだとは思うんだけどね。