[Перевод] Простые числа Мерсенна и тест Люка-Лемера

10cb6c0150d14791994e2894be597805.png

Перевод поста Джона Макги (John McGee) «Mersenne Primes and the Lucas–Lehmer Test».
Код, приведенный в статье, можно скачать здесь.
Выражаю огромную благодарность Полине Сологуб за помощь в переводе и подготовке публикации

Содержание


 — Введение.
 — Теорема множителей Эйлера и Мерсенна
 — Люка и Лемер
 — От ${M_{13}}$ до ${M_{20}}$
 — Совершенные числа
 — 21-е, 22-е и 23-е числа Мерсенна
 — 24-е, 25-е и 26-е числа Мерсенна.
 — 27-е и 28-е числа Мерсенна
 — 29-е число Мерсенна
 — 30-е и 31-е числа Мерсенна
 — Великий интернет-поиск чисел Мерсенна
 — Факторизация чисел Мерсенна

Введение.


Простое число Мерсенна — простое число вида ${M_p} = {2^p} - 1$ (значение степени р также должно быть простым). Эти простые числа получили свое название от имени французского математика и религиозного ученого Мерсенна, который и составил данный список простых чисел этой формы в первой половине семнадцатого века. Первые четыре из них были известны уже давно: ${M_2} = 3$, ${M_3} = 7$, ${M_5} = 31$ и ${M_7} = 127$.

Мерсенн утверждал, что значение ${2^p} - 1$ будет простым для простых чисел $p \leqslant 257$, принадлежащих множеству $p \in \left\{ {{\text{2}}{\text{,3}}{\text{,5}}{\text{,7}}{\text{,13}}{\text{,17}}{\text{,19}}{\text{,31}}{\text{,67}}{\text{,127}}{\text{,257}}} \right\}$. Во всем ли он был прав, можно проверить с помощью функции Wolfram Language — PrimeQ, в которой используются современные методы тестирования чисел на простоту, для которых не требуется поиска конкретного множителя, чтобы доказать, что число составное.

fb793e4916a25032ff32d99d1a7e38b9.png

f0011f93b9c83452d1e3637a78ba3c7b.png

Вполне возможно, что его утверждение о том, что ${M_{67}}$ — простое число, просто опечатка, и на самом деле он имел в виду ${M_{61}}$. Несложно понять, что проверка на простоту была при жизни Мерсенна делом затруднительным, поскольку проверка делением была одним из немногих доступных инструментов. Например, для ${M_{257}}$ наименьшим множителем оказывается 15-значное число, так что даже с современными методами факторизации его не так-то легко найти. В функции FactorInteger используются наиболее совершенные методы, которые позволяют применять метод факторизации в отношении больших целых чисел.

7aca055dd6520d85015f4b3734611adf.png

4ae1f85a161e80796c0e265284b535a4.png


Теорема множителей Эйлера и Мерсенна


Первые важные достижения в области проверки на простоту принадлежат великому математику Леонарду Эйлеру, который незадолго до 1772 года уточнил, что ${M_{31}}$ является простым. Он сделал это, продемонстрировав, что любой простой делитель ${M_{31}}$ должен быть равен 1 или 62 (mod 248).

25e0fcccdaf9d82b967b3b267ee8f493.png

db55b85c28709642cca197c3da10d74b.png

Такой относительно короткий список даже во времена Эйлера мог быть проверен с помощью пробного деления (вручную). Ему принадлежит применение теоремы Мерсенна, в которой говорится, что если $q$ является делителем ${M_p}$, то $q \equiv 1 \vee - 1\left( {\bmod 8} \right)$, $q \equiv 1\left( {\bmod p} \right)$ и $q \equiv 2kp + 1$ для некоторого целого положительного числа $k$. Эти факты значительно ограничивают количество возможных делителей ${M_p}$. С помощью функций, представленных ниже, демонстрируется использование этой теоремы с целью предоставления списка возможных делителей ${M_p}$, меньших, чем $\sqrt {{2^p} - 1} $.

812ba2145dc129ead03cebc5b5b1ecb6.png

dc90f39f91d1c745dad617aade144925.png

ca7cad72165edf56aa03c7e5576d36ce.png

4d3fbc61747e4962a0278eb138d83da3.png

Мы используем эти функции, чтобы быстро найти делитель ${2^{41}} - 1$. Обратите внимание, что $q$ является делителем ${2^{p}} - 1$ тогда и только тогда, когда ${2^p} \equiv 1\left( {\bmod q} \right)$. Это дает возможность использовать функцию PowerMod, что обеспечивает эффективное возведение в степень по модулю.

a5a727f6af68761c3e34b122315dfb45.png

0c6a0ca65c7bd383afa84360d24d66d3.png

27189f16615be5812866f6b359507181.png

b7e45563c2c1f138f2e751cb5e457440.png

744bcdb6f1b7c50c609b61c90eace8c3.png

a3031a04df99a01e41896a664f06d73c.png

1d4947edf6f1c6139d38e43df89b2426.png

494bd2b4b24ad61a21e87f4b65e783b4.png

c297c27bcbad271f7e97e2a7c108ef2a.png

Ниже приводится число Мерсенна с 161649 знаками:.

7f6c16d770056f3630e43342dfa7005c.png

9a4afca136300d2c66f9d3c803326c7e.png

3ba82a400c5586899c31549ea73683d1.png

c850c1eb03414875717c1cd4833f5941.png

2c08db92a6be78e7c28a941391873771.png

47603a0948f906dfed7c076f7ebb28ce.png

f326b8ad70090f733fa375808c26b6fc.png

e60a3ab275c4b4c8869eec265c6b1de4.png


Люка и Лемер


Следующим важным шагом стало открытие Эдуардом Люка метода для проверки простоты чисел данной формы. Он использовал свой метод в 1876 году для проверки, является ли ${M_{127}}$ (самое большое число Мерсенна «докомпьютерной» эпохи) простым. В начале двадцатого века, когда основы двоичной арифметики и алгебры стали широко известны, Дерек Генри Лемер усовершенствовал метод Люка. Полученный в результате тест простоты чисел Люка-Лемера обеспечивал эффективную проверку, если число данной формы являлось простым. Проверка проводилась с помощью сравнения по модулю:

0735a27164c3ea06b77bee1848987fb8.png

Это означает, что $k$ идентично числу, представленному его $p$ битами низшего порядка, плюс — числами, представленными остальными битами. Это соотношение может применяться рекурсивно до тех пор, пока $k < {2^p} - 1$.

Рассмотрим следующий пример. Здесь мы покажем, что inline-1_3.png для $k = {\text{1234567891}}$. Обратите внимание, что c120e4910de28f9f7595b685cadc756a.png (23 бита низшего порядка) и 24ec69496dd665e7a882a8a1c39345d2.png — означает, что остальные биты сдвинуты в крайнее нижнее положение.

3802c7541de078e0d99e55bcf90a4508.png

f700b35847ab6ff8578721b5de36fc8a.png

c7b54c1c556a8b486a4c2fefb27817eb.png

d13720b2210413742e2c5dc62e3c187b.png

a90059d6ef45104508af9ff9b37c1599.png

ebebbaec53a5ec493f78810da1ac4b2d.png

28fa6ea8e88121787f4e5dbd6c4d1b68.png

142e9429cbf50139f40a36bbb8bd789e.png

13d3ceac0161f4b8d8df92788d77ac1b.png

b9ca6043a3e2e37a6dcfb79874016820.png

a7140f2e2e1e0f37a0371a36e43fd8b7.png

Функция ниже задает этот метод для вычисления $k\bmod \left( {{2^p} - 1} \right)$ с использованием только битовых операций (без деления). Обратите внимание на то, что ${2^n} - 1$ имеет двоичную форму ${111...111_2}$, при этом нет ни одного 0, и поэтому она также служит в качестве маски для $p$ битов низшего порядка числа $k$.

dfe30e0169bf7af28123ed91611c3a79.png

Следующая функция реализует тест простоты Люка-Лемера (LLT). Определим последовательность ${s_0} = 4$, ${s_i} = s_{i - 1}^2 - 2;i > 0$» />. Тогда <img src= является простым тогда и только тогда, когда ${s_{p - 1}} \equiv 0\left( {\bmod {M_p}} \right)$.

fff5c8d424d479cf20d82631d91b3640.png

Опыт показывает, что основное время выполнения этих функций тратится на целочисленную арифметику.

Чтобы проверить, является ли ${2^p} - 1$ простым, лучше сначала проверять простоту на небольших простых делителях и выполнять другие проверки простоты. Сначала мы используем теорему делителей простых чисел Мерсенна, закодированную в checkMPDivisors, а затем функцию PrimeQ. Если это не сработает, применим тест Люка-Лемера.

6885147b23721b9cc6ed3d9d9a5edbd0.png

Здесь мы представляем расширенную версию функции PrimeQ, которая применяет тест Люка-Лемера для больших чисел вида ${2^p} - 1$.

dff09aa137ae5c75b8dbb76673545d0d.png

От ${M_{13}}$ до ${M_{20}}$


Первым простым числом Мерсенна, обнаруженным на компьютере с помощью теста Люка-Лемера, стало ${M_{521}}$, найденное Рафаэлем Робинсоном 30 января 1952 года на базе лампового компьютера SWAC (Standards Western Automatic Computer). Ниже вы видите блок памяти этого компьютера, содержащий 256 слов по 37 бит каждое.

0db748049464c65e9763afbfcc847bc9.jpg

20-е простое число Мерсенна было обнаружено Александром Гурвицем в ноябре 1961 года в результате проведения 50-минутного теста Люка-Лемера на IBM 7090. Ниже мы воспроизводим эти результаты (на это потребовалось около 151 секунд машинного времени на современном одноядерном ноутбуке).

61215cff984b7fc8bf6e8cf474409bd7.png

04107b131170b786e4a2eaa7e46cad56.png

94b25736bf71ca9f8d8555b9ede60166.png

fbaa0337dfd2060f57f85b5312826e24.png

13e9ebfd275dcbcce698ef110cb5d4ef.png

08f48a23815feed3b5d282642a175d89.png

0344c9e9c5977f5313707fa56a300da2.png

Одной из особенностей Wolfram Language, делающей его пригодным для такого рода работы, является его быстрая целочисленная арифметика. Поиск простых чисел Мерсенна стал настоящим вызовом на рассвете эпохи компьютеризированного поиска. Исследователи адаптировали методы быстрого преобразования Фурье для преобразования задачи умножения двух больших целых чисел в простое поэлементное произведение трансформированных цифр. Быстрое умножение целых чисел необходимо для шага возведения в квадрат в тесте Люка-Лемера. В Wolfram Language используются новейшие алгоритмы, оптимизированые для работы с точными целыми числами с миллиардами символов. Например, убедимся, что последнее из них, — ${M_{4423}}$, — на самом деле простое число Мерсенна, и продемонстрируем все его цифры.

aa68ceea616b74003e43a6c507d651d0.png

027c92dbdcee812effe58715fb29aaf1.png

4717189284225afcd0686aa3da5e695d.png

Совершенные числа


Существует интересная связь между простыми числами Мерсенна и совершенными числами. Совершенное число — это число, равное сумме всех своих делителей (отличных от самого числа). Евклид предполагал, а Эйлер доказал, что все четные совершенные числа, имеют вид $P = {2^{p - 1}}\left( {{2^p} - 1} \right) = {2^{p - 1}}{M_p}$. Функция Wolfram Language PerfectNumberQ проверяет, является ли число совершенным. Продемонстрируем это свойство на ${M_{31}}$.

41e356e46e02fb0d5723faf8cc53f683.png

0ea875ed061cdf9d6a75659c7f1b688e.png

3d6c5bda72accb8520e1ecd27c98d872.png

4a64b77c91c235ab095784299b73e8f4.png

e1721d4268dd5626e550cf0197be5825.png

382210672c8f996ff735b904f4d9b39c.png

71af0a22e62c7f8b9705ee272949cb17.png

1182c2c3fef787366b06ea3eaff3765d.png

21-е, 22-е и 23-е числа Мерсенна


Перейдем к переоткрытию 21-го, 22-го и 23-го чисел Мерсенна (будем обозначать их далее в форме вида $\# 21$): $\# 21 = {M_{9689}}$, $\# 22 = {M_{9941}}$, $\# 23 = {M_{11213}}$. Все они были обнаружены Дональдом Гиллисом, который запускал LLT на ILLIAC II всю весну 1963 года (см. здесь). Для проверки всех чисел вида ${2^p} - 1$ для простых чисел в промежутке $7927 \leqslant p \leqslant 17389$ нам понадобилось около 6 минут.

7ca7ae955fa510e59d9e283e5ecf00c4.png

ff5c02fbc6cafc2eb13a760be38e30ea.png

5ccd0d9660f826e55d8fc2e983e45833.png

6d7ab203ac9cf13fdd9f93a19f72d80e.png

3b2e0f715a8716d303d10fa2bda77931.png

35515aa7abd4c90a6bca7e56960f8b0e.png

5a5722622f423c07626cb00e1578662c.png

965ceff2328f25e71ffa90b558b3289f.png

92952a970d3aa53cf5aa0da45f5ea238.png

9a8c07a2488fe0769022cc77df362940.png

240b1c8bf4268f7749f5fa97397acdaa.png

24-е, 25-е и 26-е числа Мерсенна


Далее мы расширяем поиск, чтобы найти $\# 24 = {M_{19937}}$, $\# 25 = {M_{21701}}$, $\# 26 = {M_{23209}}$. Последнее из них было обнаружено в феврале 1979 г. Лэндоном Куртом Ноллом и Лорой Никель. Они искали в диапазоне от ${M_{21001}}$ до ${M_{24499}}$ на суперкомпьютере CDC Cyber 174 (почитать об этом можно здесь). Наши расчеты становятся более долгими, так что мы начинаем использовать параллельную обработку. Поскольку тесты независимы, для ускорения работы мы можем использовать ParallelMap. Проверка диапазона $17393 \leqslant p \leqslant 27449$ занимает приблизительно три с половиной минуты (используются 4 ядра).

eb7d5d37f04c0068f1b79d7e856db35a.png

269fe9e59c435df099d97a7c2c8a1e90.png

ae6c2efaa626e5f6f9fc052dc8c58727.png

9cbbdfdb8bd4aa79fea79af68577d3e2.png

033234f59332a671c96a7c4f4ef9220a.png

1808a336090cd6f0f1a3cc71b3e9a975.png

7b6760e5a73d3a5ec81a5d818d0775a1.png

cbe6beb650cdaff98cae97bbe4bc0ebc.png

8b441c4db52cfb8a198bc55e092b5014.png

026c803e20fcbf19b989f5e9d8355d75.png

Обратите внимание на то, что специализированный тест Люка-Лемера значительно быстрее, чем более общая функция PrimeQ (для данных чисел Мерсенна).

41f80a6a764eecd98fff38b858015a53.png

538507e64f97365e2c5234ed7ff8b835.png

3ac3d344f992816fa49f6ec34ea8da4e.png

3cbce72351ed11ceb5cceaffdb6708fd.png

27-е и 28-е числа Мерсенна


Далее мы проверили диапазон $27457 \leqslant p \leqslant 48611$, чтобы найти число $\# 27 = {M_{44497}}$. Оно было обнаружено в апреле 1979 года Гарри Нельсоном и его командой (они использовали суперкомпьютер Cray-1). Наш поиск завершился за 15 минут.

366aa3f25f01ff0b1588288a54af8cf5.png

87b504f15f3b14b2765af5e5522cf4d4.png

82d27f233c3013731cbc8d1aae682aee.png

a681cecfb73e6eedfe4993b3ca2f110c.png

eac294addbb11510c268a542803ee4e7.png

e0e9b81d89c04ee0a3c22d05cb204e8d.png

fa546e4b1a2f00a6629c490ec0f38165.png

947d91450bb2e2d95d49f4df99b3ac56.png

Следующее число Мерсенна, $\# 28 = {M_{86243}}$. Оно был открыто в сентябре 1982 года Дэвидом Словински — также на Cray-1. Этот суперкомпьютер весил около 5 тонн и потреблял около 115 киловатт электроэнергии, а его вычислительная производительность достигала 160 мегафлопс. Он поставлялся с 1 миллионом 64-разрядных слов памяти (8 мегабайт), а стоил около 16000000$ в сегодняшних ценах. Ниже показана деталь его системы охлаждения. Для сравнения: Raspberry Pi весит несколько унций, работает на 4 Вт, обеспечивает около 410 мегафлопс и снабжен 1Гб оперативной памяти, и это все — за 40$. А еще он поставляется сразу с системой Mathematica.

214f036d2b4a131b9247275ef684a607.jpg

0eb903aa6ec5f8fd5a36436c1e2e4de9.jpg

Число $\# 28 = {M_{86243}}$ содержит 25962 цифры. Это значение мы нашли за 1 час и 14 минут (на моем ноутбуке, а не на Raspberry Pi), проводя испытания в диапазоне $48619 \leqslant p \leqslant 87533$.

00b38ff46e71a0c1479181bd6c8b1ce7.png

0c73203e2ec12047a0fe24afaa1b3b54.png

8c33452c152579d779663847912c1c36.png

e0bf025ba4a9cdff4d2bc3ca71ed748e.png

a039c204824598041a90ddeee295c81f.png

d679d130eb1815a5bf5a8bfa3db206f2.png

8084e42b486c7e734c6ac489b0d4523b.png

883f74f93bfa5738733254432978e4af.png

166fc486ebf141967ac3e533d35fb6b1.png

59aa3b25b20d93a8b3d0d500434718d3.png


29-е число Мерсенна


Поскольку теперь нам требуется более серьезное компьютерное время, мы также производим отметку времени для каждого прогона. Теперь мы проверяем диапазон $87557 \leqslant p \leqslant 110597$. Через 1 час и 44 минут компьютер показал: $\# 29 = {M_{110503}}$. Это число впервые было обнаружено 29 января 1988 года Уокер Колкуиттом и Люком Уэлшем (суперкомпьютер NEC DX-2; статью можно найти здесь).

22eb037c4b53059c0d20d2cbd8099598.png

0b4b1bc6a326b0fa05e2fcd38d4fe2ee.png

d66b82a54ff721936d07b13be8cb7dd7.png

42f64f08f35e5d59e37c41459e3ee7a7.png

78070f5e3fcd4d0832a20abfb3d6dbdd.png

fa8cb9847ade5fbb78f9b89b7dff9a56.png

aa0658b84881ff21f96a3984823f0185.png

75968b26e35a2d8c692d2dd1c131aa26.png

697669efd17893fa02d0c6b276501a52.png

68abe340d5a406d4e2c1e0d67eca33af.png

8b8e8b9daaee0dfe79089c824be36ed8.png

f470af11d2aa46c31ca3e46f3dadec6c.png

6f93ca537d9baf535ebd5bc8285e1015.png

4080992f0026ba72969d9ffed8f71c85.png

8efbc7d33c92f6e4e9191bb1606ec09f.png


30-е и 31-е числа Мерсенна


Следующие два простых числа Мерсенна: ${M_{132049}}$ и ${M_{216091}}$, — были на самом деле обнаружены еще до 29-го (той же командой, которая обнаружила и 28-е). Они использовали Cray X-MP, чтобы найти 30-е число Мерсенна в сентябре 1983 года и 31-е — в сентябре 1985 года. Проверим $\# 30 $ с помощью функции поиска в диапазоне $110603 \leqslant p \leqslant 139901$. Для проверки каждого ${M_p}$ в этом диапазоне понадобилось 4 часа и 8 минут.

d30d3dbfa743e72be0f9af7295f5e1cc.png

8d64d8619a92699a03111bf68a709900.png

7584887ee376bd99203c88ead54b8070.png

db0ed58b90501bc04cbaa2d431ee4a99.png

dae34e05fd5b676c9c5d0ae9302bf3cb.png

e6e4d2c0273aefd2a5f6e9bf753f48fa.png

bfbbe434d8ff537d623f89d7f91496b3.png

e973283bc8928f440b89b9247a5ba65d.png

45256dcb09bb9fe65e0bc5b20e94edf4.png

e35b153c3870be9ecff1aa592fa63d5e.png

e3bcefc14d25d6669b278b820e4285e9.png

d86572ca9d21d707e6441c493cac0f50.png

2d3b522bbf1a0058222829ce7208f9d0.png

a90bf047fba2f7c4a5d2f01c8685b14f.png

ee8732dc5a5d8e8ad2eadd6db64538e2.png

Великий интернет-поиск чисел Мерсенна


С открытием 34-го простого числа Мерсенна — ${M_1257787}$ — в сентябре 1996 года закончилась эпоха суперкомпьютеров для поиска простых чисел Мерсенна. Следующие 15 были найдены добровольцами Великого интернет-поиска простых чисел Мерсенна (GIMPS), в рамках которого проводится вариант теста Люка-Лемера (в качестве фонового процесса) на персональных компьютерах. Этот масштабный проект распределенных вычислений в настоящее время достигает уровня производительности, эквивалентного приблизительно 300 терафлопс в секунду, причем задействуется время простоя более чем 1,3 миллиона компьютеров.

710b442396bab93d91ac3386df89d872.png

Проверим 34-е число Мерсенна с помощью теста Люка-Лемера. На этом этапе мы достигли предела возможностей личного компьютера. На тестирование тысячи чисел Мерсенна в этом диапазоне потребуется много дней. Интересно отметить, что тест Люка-Лемера часто используется в качестве стресс-теста надежности компьютерного оборудования и программного обеспечения, так как даже одна арифметическая ошибка среди миллиардов вычислений, необходимых для тестирования одного большого простого числа, повлечет за собой неправильный вывод, что будет означать потерю числа Мерсенна или ложный ответ. Тот факт, что мы проверили каждое ${M_p}$ для простых чисел в промежутке между 2 и 139901, убедительно доказывает надежность арифметики больших чисел и бинарных операций в системе Mathematica и языке Wolfram Language.

450e772719165780aac89b5bedba9d0c.png

01b71896b8d9650d16a483c84c72bd4b.png

ed16daa5c7084b15e39aea65538085c1.png


Факторизация чисел Мерсенна


Как мы уже видели, количество возможных множителей в разложении чисел вида ${2^p} - 1$ согласно теореме множителей Мерсенна ограниченно. Это позволило провести эффективный компьютеризированный поиск делителей больших чисел этой формы. На момент написания этой статьи все числа Мерсенна (до ${2^{1201}} - 1$) были полностью разложены на множители (иллюстрации можно найти здесь). Проект GIMPS также привел к открытию крупных множителей многих чисел Мерсенна в качестве побочного продукта проверки простоты чисел. Новую статью, которая представляет собой современный подход к решению этой проблемы (наряду с 17 новыми факторизациями), можно найти здесь. Наибольшее факторизованное число составило ${2^{1199}} - 1$; его наименьший из найденных делителей имеет 76 десятичных цифр. Его наименьший делитель равен 23. Общее время, необходимое для того, чтобы получить этот результат составляет 7500 лет (речь о компьютерном времени).

Мы можем быстро найти несколько первых множителей ${2^{1201}} - 1$ с помощью функции FactorInteger.

903bb97f9c4860766df9443536cf89e0.png

5852c1d3fe0c39258e56c69245d185ca.png

Все простые числа Мерсенна, обнаруженные на сегодняшний день, каталогизированы в Wolfram Language (до 44-го). Доступ к этой информации обеспечивается функциями MersennePrimeExponent и MersennePrimeExponentQ.

9358b5814b36e37290497f4d7bf9fa76.png

701bbabe09905b4f23058304a6b50d7b.png

c93b42f20d336a0772e9e141c506e996.png

19d61f2530aa3ba52e15f70aae67b414.png

36b5031a6dc62eda2f0ef563553d683e.png

b62d886a393e7bafa30898901f0c019a.png

Если вас заинтересовала эта тема, вы можете найти более подробную информацию на следующих веб-сайтах:

  • GIMPS
  • Страницы простых чисел
  • Простые числа

Комментарии (0)

© Habrahabr.ru