Тесты на простоту

Определять, является ли число простым можно с помощью решёт, но этот способ нельзя назвать полноценным тестом на простоту, так как попутно мы проверяем на простоту все числа до исходного. Тесты на простоту делятся на два типа: истинные и вероятностные. Истинные тесты точно отвечают, является ли число простым, вероятностные же могут дать ответ, который будет верным с некоторой возможностью ошибки. Зачастую такие тесты используют в связке: сначала проверяют число вероятностным тестом, а потом подтверждают это детерменированным.

Вероятностные тесты

Тест Ферма

Тест Ферма основывается на малой теореме Ферма, которая гласит

ap    ap11(modp)где p простоеa \rprime p \implies a^{p-1} \equiv 1 \pmod p \quad\text{где}~ p ~\text{простое}

Чтобы узнать, является ли nn простым числом, нужно взять случайное число a<na < n и проверить, выполняется ли an11(modn)a^{n-1} \equiv 1 \pmod n. Число aa называется свидетелем простоты. Если равенство не выполняется, то с полной уверенностью можно сказать, что число составное. Если же nn прошло тест, то всё равно есть вероятность, что оно не простое.

Заметьте, что в малой теореме Ферма импликация идёт только в одну сторону: из взаимной простоты следует сравнение, но обратная импликация не всегда верна. Составные числа nn, удовлетворяющие сравнению an11(modn)a^{n-1} \equiv 1 \pmod n для всех целых aa, взаимнопростых с nn, называются числами Кармайкла. Числа Кармайкла успешно проходят тест Ферма, хотя являются составными.

Давайте посмотрим на наименьшее число Кармайкла — 561=31117561 = 3 \cdot 11 \cdot 17. Из китайской теоремы об остатках следует, что Z561=Z3×Z11×Z17\ZZ_{561} = \ZZ_{3} \times \ZZ_{11} \times \ZZ_{17}. Возьмём aa взаимнопростое со всеми делителями 561561, то есть

a3    a231a11    a10111a17    a16171\align{ a \rprime 3 &\implies a^2 \eqmod{3} 1 \\ a \rprime 11 &\implies a^{10} \eqmod{11} 1 \\ a \rprime 17 &\implies a^{16} \eqmod{17} 1 }

22, 1010 и 1616 являются делителями 560560, значит a5605611a^{560} \eqmod{561} 1.

Такие числа встречаются довольно редко, но их бесконечно много.

Вероятность ошибки одного теста будет εφ(n)/n\varepsilon \le \varphi(n)/n. Выполнив тест Ферма kk раз, получим вероятность верного ответа 1εk1 - \varepsilon^k.

function fermat_test(int n, int k) -> bool: for int i = 0; i < k; i++: select a = random uniform int [2, n-1] if pow(a, n-1) % n != 1: return false return true

Используя алгоритмы быстрого возведения в степень по модулю, можно получить время работы O(klog2nloglognlogloglogn)O(k \log^2n \cdot \log \log n \cdot \log \log \log n).

Тест Соловея-Штрассена

Тест Соловея-Штрассена предполагает проверку квадратичных вычетов, для этого нам понадобится критерий Эйлера.

Критерий Эйлера

pp — простое, p>2p > 2 и apa \rprime p

a(p1)/21(modp) когда a квадратичный вычет по модулю pa(p1)/21(modp) когда a квадратичный невычет\align{&a^{(p-1)/2} \equiv 1 \pmod p ~ \text{когда} ~ a ~ \text{квадратичный вычет по модулю} ~ p \\ &a^{(p-1)/2} \equiv -1 \pmod p ~ \text{когда} ~ a ~ \text{квадратичный невычет}}

Рассмотрим три утверждения:

  1. Существует такой xx, что x2a(modp)x^2 \equiv a \pmod p
  2. a(p1)/21(modp)a^{(p-1)/2} \equiv 1 \pmod p
  3. a(p1)/21(modp)a^{(p-1)/2} \equiv -1 \pmod p

Из p>2p > 2 следует, что 1≢p1(modp)1 \notequiv p-1 \pmod p, а это то же самое, что 1≢1(modp)1 \notequiv -1 \pmod p, поэтому утверждения 22 и 33 не могут выполняться одновременно.

Пусть существует xx такое, что x2a(modp)x^2 \equiv a \pmod p. Возведём левую и правую часть в (p1)/2(p-1)/2 степень и получим xp1a(p1)/2(modp)x^{p-1} \equiv a^{(p-1)/2} \pmod p. По малой теореме Ферма xp11(modp)x^{p-1} \equiv 1 \pmod p, а значит a(p1)/21(modp)a^{(p-1)/2} \equiv 1 \pmod p. Получается, что утверждения 11 и 22 всегда выполняются вместе.

Рассмотрим последовательность

1,2,,p12,p+12,, p11, \, 2, \, \dotsc, \, \frac{p-1}{2} , \, \frac{p+1}{2} , \, \dotsc , \ p-1

Из 1p1(modp)-1 \equiv p-1 \pmod p следует

12(p1)2,22(p2)2,,(p12)2(p+12)2(modp)1^2 \equiv (p-1)^2, \, 2^2 \equiv (p-2)^2, \, \dotsc, \, \left( \frac{p-1}{2} \right)^2 \equiv \left( \frac{p+1}{2} \right)^2 \quad \pmod p

Получается, что сущетвует ровно (p1)/2(p-1)/2 квадратов по модулю pp. Обозначим их a1,a2,,a(p1)/2a_1, \, a_2, \, \dotsm, \, a_{(p-1)/2}. Если aa равно aja_j, то сравнение 11 имеет решение, а это значит, что и второе выполняется для любого aja_j. Следовательно, сравнение 22 имеет ровно (p1)/2(p-1)/2 решений, отсюда же следует, что 33 также имеет (p1)/2(p-1)/2 решений, при каждом из которых первое сравнение не выполняется.

Если число nn простое, то n1=2sdn-1 = 2^s \cdot d, где ss целое, а dd нечётное. Очевидно, что an1n±1{\sqrt {a^{n-1}}} \eqmod{n} \pm 1. Значит, если мы возьмём случайное aa, то оно должно быть либо квадратичным вычетом, либо невычетом по модулю nn. Это можно выразить через символы Якоби следующим образом:

an11иa(n1)/2(ap)(modn)a^{n-1} \equiv 1 \quad \text{и} \quad a^{(n-1)/2} \equiv \legendre{a}{p} \pmod n
function solovay_strassen_test(int n, int k) -> bool: for int i = 0; i < k; i++: select a = random uniform int [2, n-1] if pow(a, (n-1)/2) % n != jacobi(a, p): return false return true

Асимптотическая сложность этого алгоритма равняется O(klog3n)O(k\log^3 n), а вероятность ошибки ε1/2k\varepsilon \le 1/2^k.

Тест Миллера-Рабина

Давайте усовершенствуем разобранные нами тесты. В предыдущем пункте мы выяснили, что n1=2sdn-1=2^s \cdot d, значит мы можем брать корень из aa, пока не выполнится одно из двух:

ad±1илиa2rd1(modn), где r<sa^d \equiv \pm 1 \quad \text{или} \quad a^{2^r \cdot d} \equiv -1 \quad \pmod n, ~ \text{где} ~ r < s

Если при взятии корня мы получили сравнимость по модулю nn с чем-то кроме ±1\pm 1, то число точно составное. Вероятность ошибки этого теста ε1/4\varepsilon \le 1/4. Значит, повторив тест Миллера-Рабина kk раз, мы получим вероятность верного ответа не меньше 11/4k1 - 1/4^k, что является очень хорошим результатом.

function miller_rabin_test(int n, int k) -> bool: for int i = 0; i < k; i++: select a = random uniform int [2, n-1] for int j = n-1; j % 2 == 0; j /= 2: if pow(a, j) % n == n-1: break else if pow(a, j) % n != 1: return false return true

Тест Миллера-Рабина способен определять некоторые числа Кармайкла, например, 561561, но вот 17291729, третье число Кармайкла, успешно проходит тест.

Сложность этого алгоритма составляет O(klog3n)O(k \log^3 n).

Тест Фробениуса

Для использования теста Фробениуса нужно рассмотреть такое понятие как квадратичная иррациональность. Квадратичной иррациональностью будем называть число z=a+bcz = a +b \sqrt c, где aa, bb и cc — целые и cc свободно от квадратов. Сопряжённым к zz будет zˉ=abc\bar{z} = a - b \sqrt c. А остаток от деления определим как zmodn=(amodn)+(bmodn)cz \mod n = (a \mod n) + (b \mod n) \cdot \sqrt c.

Теорема Фробениуса

Пусть nn — простое, символ Якоби (an)=1\legendre{a}{n} = -1 и zZn[c]z \in \ZZ_n [\sqrt c], тогда

znzˉ(modn)z^n \equiv \bar{z} \pmod n

Сутью теста Фробениуса является подбор подходящих коэффициентов aa, bb и cc. Начать проще всего с последнего. Чтобы выполнялась теорема Фробениуса, нам нужно такое cc, что (cn)=1\legendre{c}{n} = -1, в качестве значения cc возьмём 1-1 или наименьшее простое число, удовлетворяющее условию. Если c2c \le 2, то z=2+cz = 2 + \sqrt c, иначе z=1+cz = 1 + \sqrt c. Если znzˉ(modn)z^n \equiv \bar{z} \pmod n, то число простое с вероятностью 1771011 - 7710^{-1}. Несмотря на то, что тест вероятностный, на данный момент неизвестно ни одно составное число, проходящее его, и строго доказано, что таких чисел меньше 2602^{60} не существует.

function frobenius_test(int n) -> bool: tuple [int, complex] z for int c in [-1, 2, 3, 5, 7, ...]: if jacobi(c, n) == -1: if c <= 2: z.first = 2 z.second = sqrt(c) else: z.first = 1 z.second = sqrt(c) if pow(z, n) % n == !z: return true else: return false

Истинные тесты

Тест Люка

Мы уже выяснили, что n1=2sdn-1 = 2^s \cdot d. Можно разложить dd на произведение простых множителей d=q1q2qmd = q_1 \cdot q_2 \cdot \dotsc \cdot q_m. Если число nn простое, то Zn×=n1\lvert \ZZ_n ^ \times \rvert = n-1. В таком случае для каждого qq выполняется

a(p1)/q≢1(modn)a^{(p-1)/q} \notequiv 1 \pmod n

Если nn составное, то либо для него не выполняется тест Ферма, тогда мы точно знаем, что оно не простое, либо an11(modn)a^{n-1} \equiv 1 \pmod n. Если во втором случае будет выполняться a(p1)/q≢1(modn)a^{(p-1)/q} \notequiv 1 \pmod n и поскольку ((n1)/q)\n1((n-1)/q) \divides n-1, мы получим, что в группе есть элемент порядка n1n-1. При этом порядок самой группы равен φ(n)\varphi(n), а это меньше n1n-1, так как число составное. То есть получается, что порядок какого-то элемента группы больше порядка самой группы, что противоречит теореме Лагранжа. Получается, что для составных чисел такое невозможно.

function lucas_test(int n) -> bool: while select a = random uniform int [2, n-1]: if pow(a, n-1) % n != n-1: return false bool flag = true for int q in divisors(n-1): if pow(a, (n-1)/q) % n == 1: flag = false break if flag: return true

Преимуществом этого алгоритма является его точность, он никогда не примет составное число за простое, но тест Люка имеет два существенных недостатка: нам нужно знать делители n1n-1 и перебирать большое количество aa.

Тест Люка-Лемера

Одними из самых лёгких для проверки на простоту являются числа Мерсена, имеющие вид Mp=2p1M_p = 2^p - 1. Этот метод использует рекуррентную последовательность SS, в которой Sj=Sj122S_j = S_{j-1}^2 - 2, а первый элемент равен четырём.

S={4,14,194,37634,}S = \{ 4, \, 14, \, 194, \, 37634, \, \dotsc \}

Если nn — простое нечётное число, то число Мерсена Mn=2n1M_n = 2^n - 1 простое только когда оно делит Sn1S_{n-1}. Получается, что для проверки простоты MnM_n нам всего-то нужно проверить, делится ли Sn1S_{n-1} на MnM_n.

function lucas_lehmer_test(int n) -> bool: int s = 4 int m = 2 << n - 1 for int i = 1; i < n-1; i++: s = (s * s - 2) % m if s == 0: return true else: return false

Асимптотическая сложнось этого теста равна O(n3)O(n^3), но при использовании алгоритмов быстрого умножения больших чисел сложность уменьшается до O(n2lognloglogn)O(n^2 \cdot \log n \cdot \log \log n)

Для доказательства работы этого теста нам понадобятся последовательности Люка. Напомню, что

Un(P,Q)=αnβnαβVn(P,Q)=αn+βnU_n(P, Q) = \frac{\alpha^n - \beta^n}{\alpha - \beta}\\[0.4em]V_n(P, Q) = \alpha^n + \beta^n

Где α\alpha и β\beta — это корни квадратного уравнения

x2Px+Q=0D=P24Qα=P+D2β=P2D2x^2 - Px + Q = 0\\[0.8em]D = P^2 - 4Q\\[0.8em]\alpha = \frac{P + \sqrt D } {2} \quad \beta = \frac{P^2 - \sqrt D } {2}

Также нам понадобятся следующие свойства таких последовательностей:

  1. Vn2DUn2=4QnV_n ^2 - D U_n ^2 = 4Q^n
  2. V2n=Vn22QnU2n=UnVnV_{2n} = V_n ^2 - 2Q^n \qquad U_{2n} = U_n V_n
  3. Vn+UnD2=(P+D2)n\frac{V_n + U_n \sqrt D}{2} = \left( \frac{P + \sqrt D }{2} \right) ^n
  4. Если PP(modN)P' \equiv P \pmod N, QQ(modN)Q' \equiv Q \pmod N, QNQ \rprime N и QP=P22Q(modN)QP' = P^2 - 2Q \pmod N, то

    {QnVn(P,1)V2n(P,Q)(modN)PQn1Un(P,1)U2n(P,Q)(modN)\begin{cases} Q^n V_n (P', 1) \equiv V_{2n} (P, Q) \pmod N \\ PQ^{n-1}U_n(P', 1) \equiv U_{2n}(P, Q) \pmod N \end{cases}
  5. Если pp простое, такое, что 2QDp2QD \rprime p, то p\UΦ(p)(P,Q)p \divides U_{\Phi (p)}(P, Q), где Φ(p)=p(Dp)\Phi(p) = p - \legendre{\sqrt D }{p}, а (Dp)\legendre{\sqrt D }{p} — символ Лежандра.

Пусть N=MpN = M_p, P=2P = 2 и Q=2Q = -2.

Из четвёртого свойства следует, что

2nVn(4,1)V2n(2,2)(modN)2^n V_n(-4, 1) \equiv V_{2n} (2, -2) \pmod N

А по второму свойству

V2n(4,1)=Vn2(4,1)2V_{2n}(-4, 1) = V_n ^2(-4, 1) - 2

Таким образом получаем, что

Sp1V(N+1)/2(4,1)(modN)V(N+1)/2(2,2)2(N+1)/4Sp1(modN)S_{p-1} \equiv V_{(N+1)/2}(-4, 1) \pmod N\\[0.8em]V_{(N+1)/2}(2, -2) \equiv 2 ^{(N+1)/4} S_{p-1} \pmod N

D=224(2)=12D = 2^2 -4 \cdot (-2) = 12, поэтому если NN простое, то (DN)=1\legendre{D}{N} = - 1.

Из свойств 44 и 55 следует, что NN делит UN+1=V(N+1)/2(2,2)U(N+1)/2(2,2)U_{N+1} = V_{(N+1)/2}(2, -2) \cdot U_{(N+1)/2}(2, -2)

А из свойств 11 и 22 получаем, что

VN+1=V(N+1)/222(2)(N+1)/28+4=12(modN)V_{N+1} = V_{(N+1)/2}^2 - 2 \cdot (-2)^{(N+1)/2} \equiv 8 +4 = 12 \pmod N

По третьему свойству

VN+12(1+3)N+12(13)=4(modN)V_{N+1} \equiv 2(1 + \sqrt 3 )^{N+1} \equiv 2(1-3) = -4 \pmod N

И в итоге получаем, что N\Sp1N \divides S_{p-1}. Таким образом мы доказали необходимость условий. Но, чтобы называть тест детерменированным, нам нужно также доказать достаточность.

Если N\Sp1N \divides S_{p-1}, то оно делит и V(n+1)/2V_{(n+1)/2}. По первому свойству NU(N+1)/2N \rprime U_{(N+1)/2}, а по второму N\UN+1N \divides U_{N+1}. Тогда каждый простой делитель NN можно представить как ±1+k2p\pm 1 + k \cdot 2^p, это больше, чем N\sqrt N, а значит, что N=MpN = M_p простое.