{-# OPTIONS_GHC -O2 -fno-cse #-}
main = do
let m = 1000000
print $ tmawprimes
!! (m
- 1)
data A a = A a (A a) | B [a] -- direct encoding for Split List
tmawprimes = 2:3:5:7:primes' -- tree-merged | primes-multiples removal
where -- | with 2-3-5-7 WHEEL
primes' = roll 11 wheel `minus` tjoin
[A (p*p) (B [p*q|q<-rollFrom p]) | p <- primes_]
primes_ = h ++ t `minus` tjoin
[A (p*p) (B [p*q|q<-rollFrom p]) | p <- primes_]
where (h
,t
) = splitAt 6 (roll
11 wheel
)
rollFrom n = go wheelNums wheel
where m
= (n
-11) `
mod`
210 go (x:xs) (w:ws) | x==m = roll (n+w) ws
| True = go xs ws
wheelNums = roll 0 wheel -- [0,2,6,8,12,18, ...]
wheel = 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:wheel
tjoin (a:b:c:ys) = add a (add b c) `add` tjoin (pairs ys)
where pairs (a:b:ys) = add a b : pairs ys
add u
@(B
(x:xs
)) v
@(A y ys
) = case compare x y
of LT -> A x (add (B xs) v)
EQ -> A x (add (B xs) ys)
GT -> A y (add u ys)
add (A x xs) v = A x (add xs v)
add (B xs) (B ys) = B (union xs ys)
union a
@(x:xs
) b
@(y:ys
) = case compare x y
of LT -> x : union xs b
EQ -> x : union xs ys
GT -> y : union a ys
minus a
@(x:xs
) b
@(A y ys
) = case compare x y
of LT -> x : minus xs b
EQ -> minus xs ys
GT -> minus a ys
ey0jIE9QVElPTlNfR0hDIC1PMiAtZm5vLWNzZSAjLX0KbWFpbiA9IGRvCiAgbGV0IG0gPSAxMDAwMDAwCiAgcHV0U3RyICQgc2hvdyBtICsrICItdGggcHJpbWU6ICIKICBwcmludCAkIHRtYXdwcmltZXMgISEgKG0gLSAxKQoKZGF0YSBBIGEgPSBBIGEgKEEgYSkgfCBCIFthXSAgLS0gZGlyZWN0IGVuY29kaW5nIGZvciBTcGxpdCBMaXN0Cgp0bWF3cHJpbWVzIDo6ICBbSW50XQp0bWF3cHJpbWVzID0gMjozOjU6NzpwcmltZXMnICAtLSB0cmVlLW1lcmdlZCB8IHByaW1lcy1tdWx0aXBsZXMgcmVtb3ZhbAogICB3aGVyZSAgICAgICAgICAgICAgICAgICAgIC0tICAgICAgICAgICAgIHwgd2l0aCAyLTMtNS03IFdIRUVMCiAgICBwcmltZXMnICA9IHJvbGwgMTEgd2hlZWwgYG1pbnVzYCB0am9pbgogICAgICAgICAgICAgICAgIFtBIChwKnApIChCIFtwKnF8cTwtcm9sbEZyb20gcF0pIHwgcCA8LSBwcmltZXNfXQoKICAgIHByaW1lc18gID0gaCArKyB0ICBgbWludXNgIHRqb2luCiAgICAgICAgICAgICAgICAgW0EgKHAqcCkgKEIgW3AqcXxxPC1yb2xsRnJvbSBwXSkgfCBwIDwtIHByaW1lc19dCiAgICAgICAgICAgICAgIHdoZXJlIChoLHQpID0gc3BsaXRBdCA2IChyb2xsIDExIHdoZWVsKSAgCgogICAgcm9sbEZyb20gbiA9IGdvIHdoZWVsTnVtcyB3aGVlbAogICAgICB3aGVyZSBtID0gKG4tMTEpIGBtb2RgIDIxMAogICAgICAgICAgICBnbyAoeDp4cykgKHc6d3MpIHwgeD09bSA9IHJvbGwgKG4rdykgd3MgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBUcnVlID0gZ28geHMgd3MKICAgIHdoZWVsTnVtcyAgPSByb2xsIDAgd2hlZWwgICAgICAgICAtLSBbMCwyLDYsOCwxMiwxOCwgLi4uXSAKICAgIHJvbGwgICAgICAgPSBzY2FubCAoKykKICAgIHdoZWVsICAgICAgPSAyOjQ6Mjo0OjY6Mjo2OjQ6Mjo0OjY6NjoyOjY6NDoyOjY6NDo2Ojg6NDoyOjQ6MjoKICAgICAgICAgICAgICAgICA0Ojg6Njo0OjY6Mjo0OjY6Mjo2OjY6NDoyOjQ6NjoyOjY6NDoyOjQ6MjoxMDoyOjEwOndoZWVsCgogICAgdGpvaW4gKGE6YjpjOnlzKSA9IGFkZCBhIChhZGQgYiBjKSBgYWRkYCB0am9pbiAocGFpcnMgeXMpCiAgICAgd2hlcmUgcGFpcnMgKGE6Yjp5cykgID0gYWRkIGEgYiA6IHBhaXJzIHlzCiAgICAgICAgICAgYWRkIHVAKEIoeDp4cykpIHZAKEEgeSB5cykgPSBjYXNlIGNvbXBhcmUgeCB5IG9mIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFQgLT4gQSB4IChhZGQgKEIgeHMpIHYpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUSAtPiBBIHggKGFkZCAoQiB4cykgeXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVCAtPiBBIHkgKGFkZCAgIHUgICAgeXMpCiAgICAgICAgICAgYWRkICAgKEEgeCB4cykgIHYgICAgICAgICAgPSBBIHggKGFkZCAgIHhzICAgdikKICAgICAgICAgICBhZGQgICAoQiAgIHhzKSAgICAoQiAgIHlzKSA9IEIgICAodW5pb24geHMgICB5cykgCgogICAgdW5pb24gYUAoeDp4cykgYkAoeTp5cykgPSBjYXNlIGNvbXBhcmUgeCB5IG9mIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExUIC0+IHggOiB1bmlvbiB4cyAgIGIgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVEgLT4geCA6IHVuaW9uIHhzICAgeXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVCAtPiB5IDogdW5pb24gYSAgICB5cwoKICAgIG1pbnVzIGFAKHg6eHMpIGJAKEEgeSB5cykgPSBjYXNlIGNvbXBhcmUgeCB5IG9mIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExUIC0+IHggOiBtaW51cyB4cyAgIGIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUSAtPiAgICAgbWludXMgeHMgICB5cwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdUIC0+ICAgICBtaW51cyBhICAgIHlz