Как получать большие простые числа?

Дмитрий40
Сообщений: 219
Зарегистрирован: 28 май 2014, 21:00

Как получать большие простые числа?

Сообщение Дмитрий40 » 12 авг 2014, 13:53

Alexu007 писал(а):Source of the post
Дмитрий40 писал(а):Source of the post Объём памяти считается несложно, можно даже без интуиции, 32 бита умножить на 204 миллиона - простых чисел до 2^32 - их достаточно для проверки всех чисел вплоть до 2^64. Т.е. память нужна лишь для хранения простых чисел до sqrt(проверяемое число).
В решете же хранятся все числа, и простые и составные. Только там на позиции простых чисел 1, а составных - 0 (или наоборот). Так что памяти всё же надо $$2^{32}$$ байт - чтобы работало боле-мене быстро (заморачивание с битами и тем более с делением памяти на "37" ИМХО сильно уменьшит быстродействие).

Но и это только для чисел размером до $$2^{32}$$ байт. Далее ими можно воспользоваться для деления чисел до $$2^{64}$$ (и тогда достаточно этих простых чисел), либо продолжать решето с соответствующим расходом памяти. Или я не прав?
Возможно и правы. Но решето несложно улучшить для уменьшения памяти - сегментирование. Т.е. считать не сразу весь огромный массив чисел, а по сотне тысяч за раз. Собственно считаю это одним из важных достоинств решета.
Да, и хранить уже проверенный интервал в виде массива нет нужды - простые числа оттуда уже извлекли, массив больше не нужен.

Т.е. для сегментированного решета алгоритм выглядит как повторяющаяся последовательность шагов: а) инициализировать массив решета; б) для каждого из известных простых чисел вычеркнуть его из всего сегмента; в) пройти по сегменту и выдать все найденные простые числа; г) продвинуть начало сегмента дальше пока не достигнем конца желаемого интервала; д) повторить всё с начала.
Размер сегмента выбирается чтобы помещаться в кэш данных процессора (L2 как компромисс по скорости).

folk писал(а):Source of the post Также там вроде как не хранятся делящиеся на 2,3,5.
Да, именно так, они не хранятся просто по построению массива битов. Каждые 8 битов (1 байт) хранят информацию о 8-ми возможных простых числах в интервале [n..n+29]. А их максимум 8.
Последний раз редактировалось Дмитрий40 27 ноя 2019, 20:43, всего редактировалось 1 раз.
Причина: test

Дмитрий40
Сообщений: 219
Зарегистрирован: 28 май 2014, 21:00

Как получать большие простые числа?

Сообщение Дмитрий40 » 12 авг 2014, 14:37

folk писал(а):Source of the post Для решета оценка по моему неверная. Для Аткина видел оценку $$O\left(\frac{N}{\log\log(N)}\right)$$ для поиска простых в диапазоне [N,N+k] надо потратить $$O\left(k \frac{\sqrt{N}}{\log\log(\sqrt{N})}\right)$$
Для N порядка 10^20 числа под О таковы, что для Аткина оно меньше чем для $$O(\ln^6(N))$$
Пара замечаний.
Во первых, для Эратосфена (которым все обычно и пользуются) оценка уже $$O\left(N\log\log(N)\right)$$.
Во вторых, числа 10^20 ещё слишком малы чтобы проявилось преимущество таких оценок. Т.к. здесь ещё пока важны и константы внутри O(), а для Эратоcфена она меньше 0.03 (просто цикл ведь по известным простым, а их примерно 30-40-я часть от интервала). Какова константа для AKS теста я не знаю.
Формально для 10^20 AKS должен быть в 3.6 раза медленнее Аткина и вчетверо быстрее Эратосфена. Вот что будет практически - вопрос.

Я что-то неправильно посчитал? Цифры получаются нереальные, для интервала в 1 миллиард чисел около чисел 800 триллионов количество операций зашкаливает за 10^17, на 3ГГц процессоре их ну никак не выполнить за 10с. А у меня именно столько и тратится на миллиардный интервал. И это ещё можно ускорить всемеро! Похоже константа внутри O() ещё во много раз меньше и тогда сравнение по O() смысла не имеет вообще на таких маленьких числах. Или формула для Эратосфена $$O\left(k \sqrt{N}\log\log(\sqrt{N})\right)$$ некорректна.
Последний раз редактировалось Дмитрий40 27 ноя 2019, 20:43, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
omega
Сообщений: 3776
Зарегистрирован: 21 апр 2010, 21:00

Как получать большие простые числа?

Сообщение omega » 12 авг 2014, 17:14

folk писал(а):Source of the post
Насколько я понял в primesieve все же хранятся побитово - выигрыш за счет L2 кэша больше чем экономия на битовых операциях. Также там вроде как не хранятся делящиеся на 2,3,5. (информация не стопроцентная - читал про нее в инете просто)
У меня эта программа сломалась на 5*10^18 при памяти в ноуте 2Gb.

У меня генератор коллеги А. Белышева для стартовой точки 5*10^18 уже не работает.
А генератор primesieve работает, правда, я интервал задала всего длиной 10^9.
Но мне для моих задач больше и не надо, именно так и надо: генерировать простые числа небольшими порциями и проверять сгенерированные массивы простых. Так работает и программа А. Белышева, она генерирует простые в интервалах длины 2*10^9.

Изображение

В примере был задан поиск 7-туплетов, не найдено ни одного в заданном интервале. Любопытно! В таком огромном массиве простых ни одного 7-туплета.

А вот 6-туплет в этом же интервале найден, всего один:

Код: Выбрать все

(5000000000450118397, 5000000000450118401, 5000000000450118403, 5000000000450118407, 5000000000450118409, 5000000000450118413)

Prime numbers: 23225181
Elapsed time: 13.20 sec
Последний раз редактировалось omega 27 ноя 2019, 20:43, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
omega
Сообщений: 3776
Зарегистрирован: 21 апр 2010, 21:00

Как получать большие простые числа?

Сообщение omega » 12 авг 2014, 17:35

Кстати, недавно найденный 20-туплет:

Код: Выбрать все

3941119827895253385301920029 + 0,2,8,12,14, 18,24,30,32,38,42,44,50,54,60,68,72,74,78,80


[url=http://primerecords.dk/simultprime.htm]http://primerecords.dk/simultprime.htm[/url]

Вот как люди генерируют такие большие простые числа?
Это ещё что! Там (по указанной ссылке) есть и 236-значные простые числа.

June 22. New record: 236-digit 8-tuplet by Norman Luhn.

Этого года рекорд, июнь, совсем свеженький. Как я понимаю, 8-туплет.

Ещё добавлю: WolframAlpha такие простые числа, как в 20-туплете, свободно генерирует.

Пример:

Код: Выбрать все

Select[Range[0,1000],PrimeQ[3941119827895253385301920029+#]&]

{0, 2, 8, 12, 14, 18, 24, 30, 32, 38, 42, 44, 50, 54, 60, 68, 72, 74, 78, 80, 110, 138, 182, 204, 242, 302, 432, 542, 638, 662, 684, 740, 782, 942}

Код: Выбрать все

Select[Range[0,5000],PrimeQ[3941119827895253385301920029+#]&]

{0, 2, 8, 12, 14, 18, 24, 30, 32, 38, 42, 44, 50, 54, 60, 68, 72, 74, 78, 80, 110, 138, 182, 204, 242, 302, 432, 542, 638, 662, 684, 740, 782, 942, 1044, 1088, 1130, 1208, 1260, 1398, 1460, 1482, 1538, 1680, 1734, 1878, 1998, 2004, 2100, 2114, 2144, 2154, 2250, 2304, 2318, 2322, 2342, 2364, 2390, 2412, 2450, 2672, 2702, 2760, 2780, 2802, 2804, 2888, 3048, 3108, 3152, 3228, 3314, 3384, 3444, 3584, 3654, 3708, 3794, 3830, 3834, 3930, 3992, 4064, 4098, 4128, 4152, 4158, 4160, 4202, 4208, 4434, 4524, 4548, 4554, 4730, 4760, 4914}

Время генерации пара секунд. Можно и больший интервал задать.
Последний раз редактировалось omega 27 ноя 2019, 20:43, всего редактировалось 1 раз.
Причина: test

Дмитрий40
Сообщений: 219
Зарегистрирован: 28 май 2014, 21:00

Как получать большие простые числа?

Сообщение Дмитрий40 » 12 авг 2014, 18:07

Сотню чисел за пару секунд? Не смешно даже. Вот попробуйте миллиардный интервал проверить, к примеру около 10^15 для корректного сравнения, пусть хоть за минуту нагенерит ...
Сделать решето для больших чисел проблем особых нет, надо только с памятью аккуратнее работать. Конечно скорость генерации сильно упадёт. Формально я знаю как организовать двойное решето, с требованием к памяти примерно сотню мегабайтов для генерации чисел вплоть до 10^28, но пока такое просто не нужно. И вот оно будет работать медленно.

А большие числа ... Многие из них являются весьма специального вида, для которых доказаны аналитические выражения, не требующие перебора или сводящего его к сильно-сильно урезанным вариантам.
Для любых чисел же применяют вероятностные тесты (как WolframAlpha и делает), но они не дают гарантии простоты числа (хотя говорят что контрпримера пока и неизвестно). И для каждого теста существуют "псевдопростые" числа, на которых он гарантированно ошибается, счастье что эти множества не пересекаются для разных тестов и пока можно пользоваться множественными проверками.
Последний раз редактировалось Дмитрий40 27 ноя 2019, 20:43, всего редактировалось 1 раз.
Причина: test

Дмитрий40
Сообщений: 219
Зарегистрирован: 28 май 2014, 21:00

Как получать большие простые числа?

Сообщение Дмитрий40 » 12 авг 2014, 18:31

Действительно, Alexu007, в каком диапазоне и сколько чисел (в каком интервале) хотите получать?
Последний раз редактировалось Дмитрий40 27 ноя 2019, 20:43, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
omega
Сообщений: 3776
Зарегистрирован: 21 апр 2010, 21:00

Как получать большие простые числа?

Сообщение omega » 12 авг 2014, 18:44

Генератор А. Белышева генерирует простые числа в интервале [10^15,10^15+2*10^9] полторы минуты.

Изображение

Генератор primesieve делает это гораздо быстрее.

Код: Выбрать все

Prime numbers: 57901748
Elapsed time: 3.08 sec


Так что, нет никакой мути нигде, и смеяться, собственно, не над чем.

Дмитрий40 писал(а):Source of the post
И для каждого теста существуют "псевдопростые" числа, на которых он гарантированно ошибается...

Примеры приведите, пожалуйста. Голословные заявления ничего не доказывают.
Последний раз редактировалось omega 27 ноя 2019, 20:43, всего редактировалось 1 раз.
Причина: test

folk
Сообщений: 4177
Зарегистрирован: 11 сен 2009, 21:00

Как получать большие простые числа?

Сообщение folk » 12 авг 2014, 18:50

omega, попробуйте пожалуйста если будет свободное время и настроение в primesieve такие вот штучки
./primesieve 5e17 5e17+1e12 --count
./primesieve 5e18 5e18+1e12 --count
у вас это наверное в окошечки можно вбить
и сколько у вас памяти на компе?
Последний раз редактировалось folk 27 ноя 2019, 20:43, всего редактировалось 1 раз.
Причина: test

Дмитрий40
Сообщений: 219
Зарегистрирован: 28 май 2014, 21:00

Как получать большие простые числа?

Сообщение Дмитрий40 » 12 авг 2014, 19:00

omega писал(а):Source of the post
Дмитрий40 писал(а):Source of the post И для каждого теста существуют "псевдопростые" числа, на которых он гарантированно ошибается...
Примеры приведите, пожалуйста. Голословные заявления ничего не доказывают.
Псевдопростое число.
Последний раз редактировалось Дмитрий40 27 ноя 2019, 20:43, всего редактировалось 1 раз.
Причина: test

Alexu007
Сообщений: 844
Зарегистрирован: 06 янв 2008, 21:00

Как получать большие простые числа?

Сообщение Alexu007 » 12 авг 2014, 19:12

Да собственно мне они без надобности. Просто заинтересовал сам процесс. Ну, например, диапазоны тех чисел, которые вы исследуете - и далее до 64-битного числа (длинная арифметика это уж точно медленно).

Просто принцип решета Эрастофена: задаём фиксированный массив и начинаем вычёркивать из него всё, что делится на 3, потом на 5, 7. Девятку не проверяем, т.к. она уже вычеркнута делением на 3 - и так далее до корня из размера массива. И, как я понимаю, нельзя начать проверку с любого числа - сперва решето нужно заполнить с начала. Что тут можно сэкономить?

Какой-то другой алгоритм?
Последний раз редактировалось Alexu007 27 ноя 2019, 20:43, всего редактировалось 1 раз.
Причина: test


Вернуться в «Computer Science»

Кто сейчас на форуме

Количество пользователей, которые сейчас просматривают этот форум: нет зарегистрированных пользователей и 3 гостей