#haskell #time-complexity #prime-factoring
#haskell #временная сложность #разложение на простые множители
Вопрос:
Я пытаюсь написать функцию в Haskell, которая позволяет мне вычислять следующие 3 простых числа, учитывая значение N и сохранять три простых числа в отсортированном списке.
Задача состоит в том, чтобы сделать это без импорта какого-либо внешнего модуля.
Поведение функции:
* nextPrimes 75 = [79,83,89]
* nextPrimes 64 = [67,71,73]
он должен вычислить следующие 3 простых числа из N с 10-значными числами менее чем за 2 минуты.
nextPrimes :: Int -> [Int]
nextPrimes n
Комментарии:
1. Какой алгоритм вы хотите использовать для этого?
2. Я бы подошел к этому в Haskell, сначала сгенерировав бесконечный список простых чисел. Затем выполните поиск по этому списку, пока не дойдете до соответствующего места, и возьмите следующие три простых числа из списка.
Ответ №1:
извините… но я не смог удержаться…
nextPrimes :: Int -> [Int]
nextPrimes n = let sq = fromIntegral . ceiling . sqrt $ fromIntegral n
pri k = (k,and [ k`mod`x/=0 | x <- [2..sq]])
in take 3 . map fst . filter snd $ map pri [n..]
Это работает почти мгновенно, даже когда нам приходится считать до sqrt n:
λ> nextPrimes 295084709089
[295084709159,295084709209,295084709273]
Комментарии:
1. это потрясающе, большое спасибо, ценю это @oo_miguel
2. @DavidePollcino: Рад помочь. Итак, вы можете принять и проголосовать за этот ответ прямо сейчас 🙂
3. Спасибо за отзыв! Голоса, отданные теми, у кого репутация менее 15, записываются, но не изменяют публично отображаемую оценку публикации.
4. О, я не знал об этом.