Поскольку вы говорите, что вам нужен этот список простых чисел для еще , что вы делаете, я думаю, вам не нужно реализовывать его самостоятельно, не так ли?Вы смотрели на существующие готовые решения?
Несколько существующих пакетов предоставляют функцию primes
, которая дает (бесконечный) список простых чисел:
primes :: [Integer] -- or some other integral type
primes = [2,3,5,7,11,13,...]
Я смотрел наверсии в пакетах primes
, arithmoi
и exact-combinatorics
.Тот, что в arithmoi
кажется ослепительно быстрым.Сценарий стека:
#!/usr/bin/env stack
-- stack --resolver lts-12.21 script --optimize
import Math.NumberTheory.Primes (primes)
main :: IO ()
main = print (sum $ take 1000000 primes)
использует arithmoi-0.7.0.0
и суммирует первые десять миллионов простых чисел примерно за секунду.
Если вы используете более новую версию пакета в arithmoi-0.8.0.0
, тогда primes
был переопределен как полиморфный список, поэтому вы захотите определить мономорфную копию нужного целочисленного типа:
primes' :: [Integer]
primes' = primes
и использовать ее, чтобы избежать повторного вычисления списка каждый раз, когда используется primes
,(См. Документацию.)