Иллюстрированный самоучитель по Mathematica 5

Простые числа вида k * 2 n +1

Для чисел вида k*2n +1 существует весьма эффективный критерий простоты. Он состоит в проверке сравнения а2n-1 =-1 (mod k*2n +1) для некоторого а. Однако выбор этого а зависит от k. Оказывается, нужно различать случаи, когда k не делится на 3 и делится на 3. Случай, когда k не делится на 3, совсем прост.

Случай, когда k не делится на 3

Если k не делится на 3, то, как заметил Прот (Proth) в 1878 году, числа k*2n +1 являются простыми при kn + 1 тогда и только тогда, когда 32 n-1 -1 (mod k-2n +l). Впрочем, эта традиционная формулировка критерия Прота несколько некорректна. В ней, например, (молчаливо!) исключается случай n = 1, k = 1. Для n =1, k -1 имеем k = k3 = 2+1= 2" + 1, хотя З2""* =3s0 (mod / n 2n +1), причем *-2"+1 =3-простое число. Дело в том, что если число k-2n +1 простое, то в традиционной формулировке критерия Прота число 3 должно быть квадратичным невычетом по модулю k-2n + l. Но при и= 1, k= 1 число k2n +l =3. Впрочем, n -1, k -1 – единственное решение уравнения k* 2n +1 =3 в целых числах, отличных от 0. (Уравнение k-2" + 1 =3 в целых числах имеет всего два решения: указанное только что решение n = 1, k= 1 и n = 0, k= 2.)

Разыскивая простые числа вида k*2n +1, конечно, нельзя ограничить перебор по и только простыми числами, но все равно многие значения отсеиваются тривиальным образом.

Пример 7.7. Простые числа вида 5-2n + 1.

Рассмотрим, например, случай k = 5. Тогда числа вида 5*2n +1 делятся на 3 при четных n. Так что перебор можем вести только по нечетным n.

Используя функцию PowerMod, очень легко запрограммировать критерий простоты.

Mk nPrime[k_,n_] := Module[{t = k*2^n+1},
If[k<=2^n+1,PowerMod[3,(t-1)/2,t]==t-1,PrimeQ[t]]]

А вот и программа для перебора по нечетным n.

Mk n[k_,n1_]: = Block[{n=1},
While [n<=n1, {If[MknPrime[k,n],Print[n]], n+=2}]];

Теперь можем выполнить перебор.

Mkn[5.300000]

Так можно получить (если хватит терпения) следующие значения n:

1, 3, 7, 13, 15, 25, 39, 55, 75, 85, 127, 1947, 3313, 4687, 5947, 13165, 23473, 26607, 125413, 209787, 240937.

Впрочем, при дневном счете терпение обычно улетучивается после печати числа 13165, если не раньше. Конечно, метод перебора можно усовершенствовать, заметив, что если остаток от деления и на 3 равен 2, то число 5*2n +1 делится на 7. Так что числа, дающие в остатке 2 при делении на 3, можно при переборе пропустить. Можно также пропустить числа, дающие в остатке 1 при делении на 10, поскольку тогда число 5*2n + 1 делится на 11. Можно, конечно, пойти и дальше. Можно, например, взять несколько небольших нечетных простых чисел д, для которых существует решение сравнения 5-2n + 130 (mod q). Пусть s– показатели 2 по модулю q: 2s= 1 (mod q). (Такое 5 можно найти с помощью функции MultiplicativeOrder [2, q].) Тогда при всех n^t (mod s) 5*2n + 1 = 0 (mod q). Если q не является числом вида 5*2n +1, все числа nst (mod s) можно опустить при переборе. Если же q является числом вида 5*2n +1, то нужно оставить только то число rmt (mod s), при котором 5*n + 1 = q. Эта идея вполне реализуема, но не слишком ли она усложняет перебор?

Давайте попробуем. Вот функция, которая по заданному номеру я простого числа q находит t – решение сравнения 5* 2n +1 = О (mod q) и i – показатель 2 по модулю q, если такое решение существует.

:[ n ]: =
51ock[{q= Prime[n],
s=MultiplicativeOrder[2,q],
t=MultiplicativeOrder[2,q,{-PowerMod[5,-I, q]} ] }, If[NumberQft],fs,t}]]
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.