{-# LANGUAGE PatternGuards #-}
import Data.List
import Data.Function
tsieve
(x:xs
) = x : tsieve
[y
| y
<- xs
, rem y x
/= 0]
psieve
(p:ps
) xs
| (h
,t
) <- span (< p
*p
) xs
= h
++ psieve ps
[y
| y
<- t
, rem y p
/= 0]
last . take n
. -- nubBy (((==0).).rem) $ [2..] -- tsieve $ [2..]
-- fix $ (2:) . (`psieve` [3..])
(`psieve` [2..]) . fix $ (2:) . (`psieve` [3..])
}
ey0jIExBTkdVQUdFIFBhdHRlcm5HdWFyZHMgIy19CgppbXBvcnQgRGF0YS5MaXN0CmltcG9ydCBEYXRhLkZ1bmN0aW9uCgp0c2lldmUgKHg6eHMpID0geCA6IHRzaWV2ZSBbeSB8IHkgPC0geHMsIHJlbSB5IHggLz0gMF0KCnBzaWV2ZSAocDpwcykgeHMgfCAoaCx0KSA8LSBzcGFuICg8IHAqcCkgeHMgPSAKICAgICAgICAgICAgIGggKysgcHNpZXZlIHBzIFt5IHwgeSA8LSB0LCByZW0geSBwIC89IDBdCgptYWluID0gZG8geyBuIDwtIGZtYXAgcmVhZCBnZXRMaW5lIDsKICBwcmludCAuIAogICAgbGFzdCAuIHRha2UgbiAuIC0tIG51YkJ5ICgoKD09MCkuKS5yZW0pICQgWzIuLl0KICAgICAgICAgICAgICAgICAgICAtLSB0c2lldmUgJCBbMi4uXQogICAgICAgICAgICAgICAgICAgIC0tIGZpeCAkICgyOikgLiAoYHBzaWV2ZWAgWzMuLl0pCiAgICAgICAgICAgICAgICAgICAgICAgKGBwc2lldmVgIFsyLi5dKSAuIGZpeCAkICgyOikgLiAoYHBzaWV2ZWAgWzMuLl0pCiAgfQ==
MTAwMDAwCgpudWJCeSAoKCg9PTApLikucmVtKSBbMi4uXSAtLSAgMmsgMC43OXMgIDUuOCBNQiAgLS0gICA0ayAzLjUxcyAgNS44IE1CICAtLSAgbl4yLjE1ClQtc2lldmU6ICAgICAgICAgICAgICAgICAgIC0tICA0ayAwLjYycyAgNi44IE1CICAtLSAgIDhrIDIuOThzICA2LjggTUIgIC0tICBuXjIuMjUKcG9zdHBvbmVkIFQtc2lldmUgICAgICAgICAgLS0gNDBrIDAuNTdzIDEwLjkgTUIgIC0tIDEwMGsgMS44OHMgMTIuOSBNQiAgLS0gIG5eMS4zMApzdGFnZWQgcG9zdHAnZCBULXN2ICAgICAgICAtLSA0MGsgMC40NnMgIDguOCBNQiAgLS0gNDAwayAxMC41MiAgOC45IE1CICAtLSAgbl4xLjM2CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA=
100000
nubBy (((==0).).rem) [2..] -- 2k 0.79s 5.8 MB -- 4k 3.51s 5.8 MB -- n^2.15
T-sieve: -- 4k 0.62s 6.8 MB -- 8k 2.98s 6.8 MB -- n^2.25
postponed T-sieve -- 40k 0.57s 10.9 MB -- 100k 1.88s 12.9 MB -- n^1.30
staged postp'd T-sv -- 40k 0.46s 8.8 MB -- 400k 10.52 8.9 MB -- n^1.36