main = do
ps = eulerPrimesTo (n+1)
fromSpan
(xs
,i
) = xs
++ fromSpan
(map (+ i
) xs
,i
)
eulerS
() = iterate eulerStep
([2],1)eulerStep (xs@(p:_), i) =
`minus`
map (p
*) xs
, p
*i
)
eulerPrimesTo m = if m > 1 then go ([2],1) else []
where
go w@((p:_), _)
| True = p : go (eulerStep w)
minus a
@(x:xs
) b
@(y:ys
) = case compare x y
of LT -> x : minus xs b
EQ -> minus xs ys
GT -> minus a ys
minus a b = a
bWFpbiA9IGRvCiAgcyA8LSBnZXRDb250ZW50cwogIGxldCBuID0gcmVhZCBzCiAgICAgIHBzID0gZXVsZXJQcmltZXNUbyAobisxKQogIHByaW50IChsZW5ndGggcHMsIGxhc3QgcHMpCgpmcm9tU3BhbiAoeHMsaSkgID0geHMgKysgZnJvbVNwYW4gKG1hcCAoKyBpKSB4cyxpKQoKZXVsZXJTICgpID0gaXRlcmF0ZSBldWxlclN0ZXAgKFsyXSwxKQpldWxlclN0ZXAgKHhzQChwOl8pLCBpKSA9IAogICAgICAgKCAodGFpbCAuIGNvbmNhdCAuIHRha2UgcCAuIGl0ZXJhdGUgKG1hcCAoKyBpKSkpIHhzCiAgICAgICAgICBgbWludXNgIG1hcCAocCopIHhzLCBwKmkgKQoKZXVsZXJQcmltZXNUbyA6OiAgSW50IC0+IFtJbnRdCmV1bGVyUHJpbWVzVG8gbSA9IGlmIG0gPiAxIHRoZW4gZ28gKFsyXSwxKSBlbHNlIFtdCiAgICB3aGVyZQogICAgICBnbyB3QCgocDpfKSwgXykgCiAgICAgICAgIHwgbSA8IHAqcCA9IHRha2VXaGlsZSAoPD0gbSkgKGZyb21TcGFuIHcpCiAgICAgICAgIHwgVHJ1ZSAgICA9IHAgOiBnbyAoZXVsZXJTdGVwIHcpCgptaW51cyBhQCh4OnhzKSBiQCh5OnlzKSA9IGNhc2UgY29tcGFyZSB4IHkgb2YgCiAgICAgICAgICAgICAgICAgICAgTFQgLT4geCA6ICBtaW51cyB4cyBiCiAgICAgICAgICAgICAgICAgICAgRVEgLT4gICAgICBtaW51cyB4cyB5cwogICAgICAgICAgICAgICAgICAgIEdUIC0+ICAgICAgbWludXMgYSAgeXMKbWludXMgYSAgICAgICAgYiAgICAgICAgPSBh