open System
type SeqDesc<'a> = SeqDesc of 'a * (unit -> SeqDesc<'a>) //' a self referring tuple type
let primesMPWSE () = // original code by GordonBGood, http://stackoverflow.com/a/17401770/849891
let wh = [| 2;4;2;4;6;2;6;4;2;4;6;6;2;6;4;2;6;4;6;8;4;2;4;2;
4;8;6;4;6;2;4;6;2;6;6;4;2;4;6;2;6;4;2;4;2;10;2;10 |]
let inline adv i = if i < 47 then i + 1 else 0
let reinsert c m (p,pi) =
let c2 = c + wh.[pi] * p
match Map.tryFind c2 m with
| None -> m |> Map.add c2 [(p,adv pi)]
| Some(facts) -> m |> Map.add c2 ((p,adv pi)::facts)
let rec mkprimes (n,i) m (SeqDesc((p,pi),f) as psd) q =
let n2,i2 = n + wh.[i],adv i
match Map.tryFind n m with
| None -> if n < q then SeqDesc((n,i),fun() -> mkprimes (n2,i2) m psd q)
else let (SeqDesc((p2,_),_) as nsd),c2 = f(),n + wh.[pi] * p
mkprimes (n2,i2) (Map.add c2 [(p,adv pi)] m) nsd (p2 * p2)
| Some
(skips
) -> let m2
= skips
|> List.
fold (reinsert n
) (m
|> Map.
remove n
) mkprimes (n2,i2) m2 psd q
let rec prs = SeqDesc((11,0),fun() -> mkprimes (13,1) Map.empty prs 121 )
let genseq sd = Seq.unfold (fun (SeqDesc((p,_), g)) -> Some(p, g())) sd
seq { yield 2; yield 3; yield 5; yield 7; yield! mkprimes (11,0) Map.empty prs 121 |> genseq }
primesMPWSE() |> Seq.nth 100000 |> printfn "%A"
b3BlbiBTeXN0ZW0KCnR5cGUgU2VxRGVzYzwnYT4gPSBTZXFEZXNjIG9mICdhICogKHVuaXQgLT4gU2VxRGVzYzwnYT4pIC8vJyBhIHNlbGYgcmVmZXJyaW5nIHR1cGxlIHR5cGUKCmxldCBwcmltZXNNUFdTRSAoKSA9ICAgLy8gb3JpZ2luYWwgY29kZSBieSBHb3Jkb25CR29vZCwgIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzE3NDAxNzcwLzg0OTg5MSAKICBsZXQgd2ggPSBbfCAyOzQ7Mjs0OzY7Mjs2OzQ7Mjs0OzY7NjsyOzY7NDsyOzY7NDs2Ozg7NDsyOzQ7MjsKICAgICAgICAgICAgICAgIDQ7ODs2OzQ7NjsyOzQ7NjsyOzY7Njs0OzI7NDs2OzI7Njs0OzI7NDsyOzEwOzI7MTAgfF0gICAKICBsZXQgaW5saW5lIGFkdiBpID0gaWYgaSA8IDQ3IHRoZW4gaSArIDEgZWxzZSAwCiAgbGV0IHJlaW5zZXJ0IGMgbSAocCxwaSkgPQogICAgICBsZXQgYzIgPSBjICsgd2guW3BpXSAqIHAKICAgICAgbWF0Y2ggTWFwLnRyeUZpbmQgYzIgbSB3aXRoCiAgICAgICAgfCBOb25lICAgICAgICAtPiBtIHw+IE1hcC5hZGQgYzIgWyhwLGFkdiBwaSldCiAgICAgICAgfCBTb21lKGZhY3RzKSAtPiBtIHw+IE1hcC5hZGQgYzIgKChwLGFkdiBwaSk6OmZhY3RzKQogIGxldCByZWMgbWtwcmltZXMgKG4saSkgbSAoU2VxRGVzYygocCxwaSksZikgYXMgcHNkKSBxID0gICAKICAgIGxldCBuMixpMiA9IG4gKyB3aC5baV0sYWR2IGkKCiAgICBtYXRjaCBNYXAudHJ5RmluZCBuIG0gd2l0aAogICAgICB8IE5vbmUgLT4gaWYgbiA8IHEgdGhlbiBTZXFEZXNjKChuLGkpLGZ1bigpIC0+IG1rcHJpbWVzIChuMixpMikgbSBwc2QgcSkKICAgICAgICAgICAgICAgIGVsc2UgbGV0IChTZXFEZXNjKChwMixfKSxfKSBhcyBuc2QpLGMyID0gZigpLG4gKyB3aC5bcGldICogcAogICAgICAgICAgICAgICAgICAgICBta3ByaW1lcyAobjIsaTIpIChNYXAuYWRkIGMyIFsocCxhZHYgcGkpXSBtKSBuc2QgKHAyICogcDIpCiAgICAgIHwgU29tZShza2lwcykgLT4gbGV0IG0yID0gc2tpcHMgfD4gTGlzdC5mb2xkIChyZWluc2VydCBuKSAobSB8PiBNYXAucmVtb3ZlIG4pCiAgICAgICAgICAgICAgICAgICAgICAgbWtwcmltZXMgKG4yLGkyKSBtMiBwc2QgcQogIGxldCByZWMgcHJzID0gU2VxRGVzYygoMTEsMCksZnVuKCkgLT4gbWtwcmltZXMgKDEzLDEpIE1hcC5lbXB0eSBwcnMgMTIxICkKICBsZXQgZ2Vuc2VxIHNkID0gU2VxLnVuZm9sZCAoZnVuIChTZXFEZXNjKChwLF8pLCBnKSkgLT4gU29tZShwLCBnKCkpKSBzZAogIHNlcSB7IHlpZWxkIDI7IHlpZWxkIDM7IHlpZWxkIDU7IHlpZWxkIDc7IHlpZWxkISBta3ByaW1lcyAoMTEsMCkgTWFwLmVtcHR5IHBycyAxMjEgfD4gZ2Vuc2VxIH0KCnByaW1lc01QV1NFKCkgfD4gU2VxLm50aCAxMDAwMDAgfD4gcHJpbnRmbiAiJUEi
LS0gd2l0aCB3aCBldGMgaW50ZXJuYWwgdG8gbWtwcmltZXM6ICAgICAtLSBleHRlcm5hbCB0byBta3ByaW1lczogICAgICAgIC0tICAoKQoxMDBrOiAxMjk5NzIxOiAxLjI2cyAxMi43TUIgICAgICAgICAgICAgICAgICAgIDEuMDZzICAgICAgICAgICAgICAgICAgICAxLjA2cyAgICAxMi42TUIKMjAwazogMjc1MDE2MTogMi41M3MgMTIuOU1CICAgIG5eMS4wMSAgICAgICAgICAyLjMzcyAgICAgICAgICAgICAgICAgICAgMi4yMXMgICAgMTIuNk1CCjQwMGs6IDU4MDAxMzk6IDUuNjFzIDEyLjdNQiAgICBuXjEuMTUKODAwazogMTIxOTUyNjMgMTIuM3MgMTIuOU1CICAgIG5eMS4xMyAgICAgICAgIDExLjExcyAgIG5eMS4xMyAgICAgICAgICAxMC44NHMgICAgMTIuNk1CICgxMS4wNi0xMi44KT8/CjFtbG46ICAgICAgICAgLTE1LjdzLSAgICAgICAgICAgICAgICAgICAgICAgICAxNC4zM3MgICBuXjEuMTMgICAgICAgICAgMTQuMTVzICAgIDEyLjlNQiAobGltaXQgZXhjZWVkZWQpPz8=
-- with wh etc internal to mkprimes: -- external to mkprimes: -- ()
100k: 1299721: 1.26s 12.7MB 1.06s 1.06s 12.6MB
200k: 2750161: 2.53s 12.9MB n^1.01 2.33s 2.21s 12.6MB
400k: 5800139: 5.61s 12.7MB n^1.15
800k: 12195263 12.3s 12.9MB n^1.13 11.11s n^1.13 10.84s 12.6MB (11.06-12.8)??
1mln: -15.7s- 14.33s n^1.13 14.15s 12.9MB (limit exceeded)??