<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://camokathomelab.servebeer.com/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=194.54.176.117</id>
	<title>wiki12 - Вклад [ru]</title>
	<link rel="self" type="application/atom+xml" href="https://camokathomelab.servebeer.com/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=194.54.176.117"/>
	<link rel="alternate" type="text/html" href="https://camokathomelab.servebeer.com/mediawiki/index.php/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/194.54.176.117"/>
	<updated>2026-07-22T00:42:23Z</updated>
	<subtitle>Вклад</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://camokathomelab.servebeer.com/mediawiki/index.php?title=%D0%A2%D0%B5%D1%81%D1%82_%D0%9C%D0%B8%D0%BB%D0%BB%D0%B5%D1%80%D0%B0_%E2%80%94_%D0%A0%D0%B0%D0%B1%D0%B8%D0%BD%D0%B0&amp;diff=7824</id>
		<title>Тест Миллера — Рабина</title>
		<link rel="alternate" type="text/html" href="https://camokathomelab.servebeer.com/mediawiki/index.php?title=%D0%A2%D0%B5%D1%81%D1%82_%D0%9C%D0%B8%D0%BB%D0%BB%D0%B5%D1%80%D0%B0_%E2%80%94_%D0%A0%D0%B0%D0%B1%D0%B8%D0%BD%D0%B0&amp;diff=7824"/>
		<updated>2025-11-11T16:00:45Z</updated>

		<summary type="html">&lt;p&gt;194.54.176.117: /* Реализация */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Тест Миллера — Рабина&#039;&#039;&#039; — [[класс BPP|вероятностный полиномиальный]] [[тест простоты]]. Тест Миллера — Рабина, наряду с [[Тест Ферма|тестом Ферма]] и [[Тест Соловея — Штрассена|тестом Соловея — Штрассена]], позволяет эффективно определить, является ли данное число [[Составное число|составным]]. Однако, с его помощью нельзя строго доказать [[Простое число|простоту числа]]. Тем не менее тест Миллера — Рабина часто используется в [[Криптография|криптографии]] для получения больших [[случайное простое число|случайных простых чисел]].&lt;br /&gt;
&lt;br /&gt;
== История ==&lt;br /&gt;
Алгоритм Миллера-Рабина является модификацией [[Тест Миллера (теория чисел)|алгоритма Миллера]], разработанного [[Миллер, Гари (информатик)|Гари Миллером]] в [[1976 год]]у. Алгоритм Миллера является [[Детерминированный алгоритм|детерминированным]], но его корректность опирается на недоказанную [[Гипотеза Римана|расширенную гипотезу Римана]]{{sfn|Miller|1975}}. [[Рабин, Майкл Озер|Майкл Рабин]] модифицировал его в [[1980 год]]у{{sfn|Rabin|1980}}. Алгоритм Миллера — Рабина не зависит от справедливости гипотезы, но является вероятностным.&lt;br /&gt;
&lt;br /&gt;
== Применение ==&lt;br /&gt;
Так как криптостойкость многих алгоритмов шифрования основывается на секретных ключах, для создания которых необходимы простые числа (например, так работает шифр [[RSA]]), то при создании таких ключей важно уметь достаточно быстро проверять большие числа на простоту. Вероятностные тесты простоты, такие как тест Миллера-Рабина и [[Тест Соловея — Штрассена]], показывают большую эффективность использования и простоту выражения по сравнению с детерминированными тестами{{sfn|Menezes, Oorschot, Vanstone|1996|pp=141}}. Алгоритм Миллера-Рабина позволяет выполнять проверку за малое время и давать при этом достаточно малую вероятность того, что число на самом деле является составным.{{sfn|Кормен|2015|страницы=147}}&lt;br /&gt;
&lt;br /&gt;
== Принцип работы алгоритма ==&lt;br /&gt;
Как и тесты [[Тест Ферма|Ферма]] и [[Тест Соловея — Штрассена|Соловея — Штрассена]], тест Миллера — Рабина опирается на проверку ряда равенств, которые выполняются для простых чисел. Если хотя бы одно такое равенство не выполняется, это доказывает что число составное&amp;lt;ref name=&amp;quot;algorithms&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для теста Миллера — Рабина используется следующее утверждение:&lt;br /&gt;
&lt;br /&gt;
{{Теорема|1=Пусть &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; — простое число и &amp;lt;math&amp;gt;n-1 = 2^s d&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; — нечётно. Тогда для любого &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; из &amp;lt;math&amp;gt;\mathbb{Z}_n&amp;lt;/math&amp;gt; выполняется хотя бы одно из условий:&lt;br /&gt;
# &amp;lt;math&amp;gt;a^{d} \equiv 1\pmod{n} &amp;lt;/math&amp;gt;&lt;br /&gt;
# Существует целое число &amp;lt;math&amp;gt;r &amp;lt; s&amp;lt;/math&amp;gt; такое что &amp;lt;math&amp;gt;a^{2^{r}d} \equiv -1\pmod{n} &amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Доказ1|qed=&amp;amp;nbsp;|&lt;br /&gt;
&lt;br /&gt;
: &#039;&#039;&#039;Лемма про квадратные корни единицы в конечном поле &amp;lt;math&amp;gt;\mathbb{Z}_p&amp;lt;/math&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
{{Теорема|1=В конечном поле &amp;lt;math&amp;gt;\mathbb{Z}_p&amp;lt;/math&amp;gt; (для простого &amp;lt;math&amp;gt;p&amp;lt;/math&amp;gt;) не существует квадратных корней из единицы, кроме чисел &#039;&#039;1&#039;&#039;, &#039;&#039;-1&#039;&#039;}}&lt;br /&gt;
&lt;br /&gt;
{{Доказ1|qed=&amp;amp;nbsp;|&lt;br /&gt;
Пусть:&lt;br /&gt;
: &amp;lt;math&amp;gt;{a} \equiv {\sqrt{1} }\pmod{p} &amp;lt;/math&amp;gt;&lt;br /&gt;
Тогда:&lt;br /&gt;
: &amp;lt;math&amp;gt;a^{2} \equiv 1\pmod{p} &amp;lt;/math&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt;a^{2} {-1}\equiv 0\pmod{p} &amp;lt;/math&amp;gt;&lt;br /&gt;
: &amp;lt;math&amp;gt; (a + 1)( a - 1) \equiv 0\pmod{p}&amp;lt;/math&amp;gt;&lt;br /&gt;
По [[Лемма Евклида|лемме Евклида]]:&lt;br /&gt;
: &amp;lt;math&amp;gt;\bigg [ \begin{matrix} {a - 1} \equiv {0}\pmod{p} \\ {a + 1} \equiv {0}\pmod{p} \end{matrix} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;math&amp;gt;\bigg [ \begin{matrix} {a}\equiv {1}\pmod{p} \\ {a}\equiv {-1}\pmod{p} \end{matrix} &amp;lt;/math&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
По [[Малая теорема Ферма|малой теореме Ферма]]:&lt;br /&gt;
: &amp;lt;math&amp;gt;a^{n-1} \equiv 1\pmod{n}.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Будем извлекать квадратные корни из числа &amp;lt;math&amp;gt;a^{n-1}&amp;lt;/math&amp;gt;.&lt;br /&gt;
По доказанной выше лемме, на каждом шаге у нас будет получаться число &#039;&#039;1&#039;&#039; или &#039;&#039;-1&#039;&#039; по модулю &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. &lt;br /&gt;
Если на каком-то шаге у нас получится &#039;&#039;-1&#039;&#039;, то выполняется второе из равенств. &lt;br /&gt;
Иначе на последнем шаге &amp;lt;math&amp;gt;\sqrt[ {{2}^{s} } ]{a^{n-1} } =a^{d} &amp;lt;/math&amp;gt; (т. к. &amp;lt;math&amp;gt;n-1 = 2^s d&amp;lt;/math&amp;gt;) т. е. выполнится первое равенство.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Если это утверждение (условие 1 или 2) выполняется для некоторых чисел &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; (не обязательно простого), то число &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; называют &#039;&#039;&#039;свидетелем простоты&#039;&#039;&#039; числа &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; по Миллеру, а само число &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; — [[Вероятно простое число|вероятно простым]]. (При случайно выбранном &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; вероятность ошибочно принять составное число за простое составляет 25 %, но её можно уменьшить, выполнив проверки для других &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;.)&lt;br /&gt;
&lt;br /&gt;
В случае когда выполняется [[контрапозиция]] доказанного утверждения, то есть если найдётся число &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; такое, что:&lt;br /&gt;
: &amp;lt;math&amp;gt;a^{d} \not\equiv 1\pmod{n}&amp;lt;/math&amp;gt;&lt;br /&gt;
и&lt;br /&gt;
: &amp;lt;math&amp;gt;\forall r:\ 0\le r\le s-1:\ a^{2^rd} \not\equiv -1\pmod{n},&amp;lt;/math&amp;gt;&lt;br /&gt;
то число &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; не является простым. В этом случае число &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; называют свидетелем того, что число &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; составное.&lt;br /&gt;
&lt;br /&gt;
У нечётных составных чисел &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; существует, согласно &#039;&#039;&#039;теореме Рабина&#039;&#039;&#039;, не более &amp;lt;math&amp;gt;\varphi(n)/4&amp;lt;/math&amp;gt; свидетелей простоты, где &amp;lt;math&amp;gt;\varphi(n)&amp;lt;/math&amp;gt; — [[функция Эйлера]], таким образом вероятность того, что случайно выбранное число &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; окажется свидетелем простоты, меньше 1/4{{sfn|Rabin|1980}}{{sfn|Schoof|2008}}.&lt;br /&gt;
&lt;br /&gt;
Идея теста заключается в том, чтобы проверять для случайно выбранных чисел &amp;lt;math&amp;gt;a&amp;lt;n&amp;lt;/math&amp;gt;, являются ли они свидетелями простоты числа &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. Если найдётся свидетель того, что число составное, то число действительно является составным. Если было проверено &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; чисел, и все они оказались свидетелями простоты, то число считается простым. Для такого алгоритма вероятность принять составное число за простое будет меньше &amp;lt;math&amp;gt;(1/4)^{k}&amp;lt;/math&amp;gt;{{sfn|Monier|1980}}.&lt;br /&gt;
&lt;br /&gt;
Для проверки больших чисел принято выбирать числа &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; случайными, так как распределение свидетелей простоты и свидетелей составного числа среди чисел 1, 2, …, n − 1 заранее неизвестно. В частности Арнольт{{sfn|Arnault|1995}} приводит 397-разрядное составное число, для которого все числа меньше 307 являются свидетелями простоты.&lt;br /&gt;
&lt;br /&gt;
== Пример ==&lt;br /&gt;
&lt;br /&gt;
Предположим, мы хотим определить, является ли &#039;&#039;n&#039;&#039; = 221 простым. Запишем {{nowrap|&#039;&#039;n&#039;&#039; − 1 {{=}} 220}} как 2&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;·55, таким образом &#039;&#039;s&#039;&#039; = 2 и &#039;&#039;d&#039;&#039; = 55. Произвольно выберем число &#039;&#039;a&#039;&#039; такое, что 0 &amp;lt; &#039;&#039;a&#039;&#039; &amp;lt; &#039;&#039;n&#039;&#039;, допустим &#039;&#039;a&#039;&#039; = 174. Переходим к вычислениям:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;a&#039;&#039;&amp;lt;sup&amp;gt;2&amp;lt;sup&amp;gt;0&amp;lt;/sup&amp;gt;·&#039;&#039;d&#039;&#039;&amp;lt;/sup&amp;gt; mod &#039;&#039;n&#039;&#039; = 174&amp;lt;sup&amp;gt;55&amp;lt;/sup&amp;gt; mod 221 = 47 ≠ 1, &#039;&#039;n&#039;&#039; − 1&lt;br /&gt;
* &#039;&#039;a&#039;&#039;&amp;lt;sup&amp;gt;2&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;·&#039;&#039;d&#039;&#039;&amp;lt;/sup&amp;gt; mod &#039;&#039;n&#039;&#039; = 174&amp;lt;sup&amp;gt;110&amp;lt;/sup&amp;gt; mod 221 = 220 = &#039;&#039;n&#039;&#039; − 1.&lt;br /&gt;
&lt;br /&gt;
Так как 220 ≡ −1 mod &#039;&#039;n&#039;&#039;, число 221 или простое, или 174 — ложный свидетель простоты числа 221. Возьмём другое произвольное &#039;&#039;a&#039;&#039;, на этот раз выбрав &#039;&#039;a&#039;&#039; = 137:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;a&#039;&#039;&amp;lt;sup&amp;gt;2&amp;lt;sup&amp;gt;0&amp;lt;/sup&amp;gt;·&#039;&#039;d&#039;&#039;&amp;lt;/sup&amp;gt; mod &#039;&#039;n&#039;&#039; = 137&amp;lt;sup&amp;gt;55&amp;lt;/sup&amp;gt; mod 221 = 188 ≠ 1, &#039;&#039;n&#039;&#039; − 1&lt;br /&gt;
* &#039;&#039;a&#039;&#039;&amp;lt;sup&amp;gt;2&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;·&#039;&#039;d&#039;&#039;&amp;lt;/sup&amp;gt; mod &#039;&#039;n&#039;&#039; = 137&amp;lt;sup&amp;gt;110&amp;lt;/sup&amp;gt; mod 221 = 205 ≠ &#039;&#039;n&#039;&#039; − 1.&lt;br /&gt;
&lt;br /&gt;
Так как 137 свидетель того, что 221 составное, число 174 на самом деле было ложным свидетелем простоты. Заметим, что алгоритм ничего не говорит нам о множителях числа 221 (которые равны 13 и 17). Однако в некоторых случаях дополнительные вычисления помогают получить множители числа.{{sfn|Baillie, Wagstaff|1980}}&lt;br /&gt;
&lt;br /&gt;
== Алгоритм Миллера — Рабина ==&lt;br /&gt;
&lt;br /&gt;
=== Реализация ===&lt;br /&gt;
Алгоритм Миллера — Рабина параметризуется количеством раундов &#039;&#039;r&#039;&#039;. Рекомендуется брать &#039;&#039;r&#039;&#039; порядка величины &amp;lt;math&amp;gt;\log_2(n)&amp;lt;/math&amp;gt;, где &#039;&#039;n&#039;&#039; — проверяемое число.&lt;br /&gt;
&lt;br /&gt;
Для данного &#039;&#039;n&#039;&#039; находятся такие целое число &#039;&#039;s&#039;&#039; и целое нечётное число &#039;&#039;t&#039;&#039;, что &amp;lt;math&amp;gt;n-1 = 2^s t&amp;lt;/math&amp;gt;. Выбирается случайное число &#039;&#039;a&#039;&#039;, 1 &amp;lt; &#039;&#039;a&#039;&#039; &amp;lt; &#039;&#039;n&#039;&#039;. Если &#039;&#039;a&#039;&#039; не является свидетелем простоты числа &#039;&#039;n&#039;&#039;, то выдаётся ответ &#039;&#039;«n — составное»&#039;&#039;, и алгоритм завершается. Иначе, выбирается новое случайное число &#039;&#039;a&#039;&#039; и процедура проверки повторяется. После нахождения &#039;&#039;r&#039;&#039; свидетелей простоты, выдаётся ответ &#039;&#039;«n — вероятно простое»&#039;&#039;, и алгоритм завершается&amp;lt;ref name=&amp;quot;algorithms&amp;quot;&amp;gt;{{Книга|автор = Томас Кормен, Чарльз Лейзерсон, Рональд Ривест, Клиффорд Штайн|заглавие = Алгоритмы: построение и анализ|издание = 3|место = Москва|издательство = Вильямс|год = 2013|страницы = 1012—1015|страниц = 1328|isbn = 978-5-8459-1794-2}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Алгоритм может быть записан на [[Псевдокод (язык описания алгоритмов)|псевдокоде]] следующим образом:&lt;br /&gt;
 &lt;br /&gt;
  &#039;&#039;&#039;Ввод&#039;&#039;&#039;: &#039;&#039;n&#039;&#039; &amp;gt; 2, нечётное натуральное число, которое необходимо проверить на простоту;&lt;br /&gt;
        &#039;&#039;k&#039;&#039; — количество раундов.&lt;br /&gt;
 &#039;&#039;&#039;Вывод&#039;&#039;&#039;: &#039;&#039;составное&#039;&#039;, означает, что &#039;&#039;n&#039;&#039; является составным числом;&lt;br /&gt;
        &#039;&#039;вероятно простое&#039;&#039;, означает, что &#039;&#039;n&#039;&#039; с высокой вероятностью является простым числом.&lt;br /&gt;
 Представить &#039;&#039;n&#039;&#039; − 1 в виде 2&amp;lt;sup&amp;gt;&#039;&#039;s&#039;&#039;&amp;lt;/sup&amp;gt;·&#039;&#039;t&#039;&#039;, где &#039;&#039;t&#039;&#039; нечётно, можно сделать последовательным делением &#039;&#039;n&#039;&#039; - 1 на 2.&lt;br /&gt;
 &amp;lt;u&amp;gt;цикл&amp;lt;/u&amp;gt; А: повторить &#039;&#039;k&#039;&#039; раз:&lt;br /&gt;
    Выбрать случайное целое число &#039;&#039;a&#039;&#039; в отрезке [2, &#039;&#039;n&#039;&#039; − 2]&lt;br /&gt;
    &#039;&#039;x&#039;&#039; ← &#039;&#039;a&#039;&#039;&amp;lt;sup&amp;gt;&#039;&#039;t&#039;&#039;&amp;lt;/sup&amp;gt; mod &#039;&#039;n&#039;&#039;, вычисляется с помощью алгоритма [[Алгоритмы быстрого возведения в степень по модулю|возведения в степень по модулю]]&lt;br /&gt;
    &amp;lt;u&amp;gt;если&amp;lt;/u&amp;gt; &#039;&#039;x&#039;&#039; = 1 или &#039;&#039;x&#039;&#039; = &#039;&#039;n&#039;&#039; − 1, &amp;lt;u&amp;gt;то&amp;lt;/u&amp;gt; перейти на следующую итерацию цикла А&lt;br /&gt;
    &amp;lt;u&amp;gt;цикл&amp;lt;/u&amp;gt; B: повторить &#039;&#039;s&#039;&#039; − 1 раз&lt;br /&gt;
       &#039;&#039;x&#039;&#039; ← &#039;&#039;x&#039;&#039;&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; mod &#039;&#039;n&#039;&#039;&lt;br /&gt;
       &amp;lt;u&amp;gt;если&amp;lt;/u&amp;gt; &#039;&#039;x&#039;&#039; = 1, &amp;lt;u&amp;gt;то&amp;lt;/u&amp;gt; перейти на следующую итерацию цикла B&lt;br /&gt;
       &amp;lt;u&amp;gt;если&amp;lt;/u&amp;gt; &#039;&#039;x&#039;&#039; = &#039;&#039;n&#039;&#039; − 1, &amp;lt;u&amp;gt;то&amp;lt;/u&amp;gt; перейти на следующую итерацию цикла A&lt;br /&gt;
    &amp;lt;u&amp;gt;вернуть&amp;lt;/u&amp;gt; &#039;&#039;составное&#039;&#039;&lt;br /&gt;
 &amp;lt;u&amp;gt;вернуть&amp;lt;/u&amp;gt; &#039;&#039;вероятно простое&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Из теоремы Рабина следует, что если &#039;&#039;k&#039;&#039; случайно выбранных чисел оказались свидетелями простоты числа &#039;&#039;n&#039;&#039;, то вероятность того, что &#039;&#039;n&#039;&#039; составное, не превосходит &amp;lt;math&amp;gt;4^{-k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Также для больших значений &#039;&#039;n&#039;&#039; вероятность объявления составного числа вероятно простым существенно меньше чем 4&amp;lt;sup&amp;gt;−&#039;&#039;k&#039;&#039;&amp;lt;/sup&amp;gt;. Дамгард, Лэндрок и Померандс{{sfn|Damgård, Landrock, Pomerance|1993}} вычислили некоторые точные границы ошибок и предложили метод выбора значения k для получения нужной границы ошибки. Такие границы могут, например, использоваться для генерации вероятно простых чисел. Однако, они не должны использоваться для проверки простых чисел неизвестного происхождения, поскольку в криптографических системах взломщик может попытаться подставить псевдопростое число, в той ситуации, когда требуется простое число. В таких случаях можно положиться только на ошибку 4&amp;lt;sup&amp;gt;−&#039;&#039;k&#039;&#039;&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Сложность работы ===&lt;br /&gt;
Считая, что время умножения логарифмическое, используя [[Возведение в степень по модулю#Алгоритм быстрого возведения в степень по модулю|быстрое умножение по модулю]], сложность работы алгоритма &amp;lt;math&amp;gt;O(k\log^3n)&amp;lt;/math&amp;gt;, где &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; — количество раундов. Таким образом, время работы алгоритма полиномиально.&lt;br /&gt;
&lt;br /&gt;
Однако, используя [[БПФ]], возможно сократить время работы алгоритма до &amp;lt;math&amp;gt;O(k\log^2(n)\log(\log(n))\log(\log(\log(n)))) = \widetilde O(k\log^2(n))&amp;lt;/math&amp;gt;. В таком случае, если брать &amp;lt;math&amp;gt;k = \log_2(n)&amp;lt;/math&amp;gt;, где n — проверяемое число, то сложность работы алгоритма равна &amp;lt;math&amp;gt;\widetilde O(\log^3n)&amp;lt;/math&amp;gt;.&amp;lt;ref&amp;gt;{{Книга|автор = Брюс Шнайер |заглавие = Прикладная Криптография |издание = |место = Москва |издательство = Триумф |год = 2013 |страницы = 298 |страниц = 816 |isbn =}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Сильно псевдопростые числа ==&lt;br /&gt;
Если число &#039;&#039;a&#039;&#039; является свидетелем простоты &#039;&#039;составного&#039;&#039; нечётного числа &#039;&#039;n&#039;&#039; по Миллеру, то число &#039;&#039;n&#039;&#039;, в свою очередь, называется &#039;&#039;&#039;сильно псевдопростым&#039;&#039;&#039; по основанию &#039;&#039;a&#039;&#039;. Если число &#039;&#039;n&#039;&#039; является сильно псевдопростым по основанию &#039;&#039;a&#039;&#039;, то оно также является [[Псевдопростое число Ферма|псевдопростым Ферма]] по основанию &#039;&#039;a&#039;&#039;, так и [[Псевдопростое число#Псевдопростые Эйлера — Якоби|Псевдопростым Эйлера — Якоби]] по основанию &#039;&#039;a&#039;&#039;.{{sfn|Menezes, Oorschot, Vanstone|1996|pp=141}}&lt;br /&gt;
&lt;br /&gt;
Например, сильно псевдопростые числа по основанию 2 образуют последовательность:&lt;br /&gt;
: 2047, 3277, 4033, 4681, 8321, 15841, 29341, 42799, 49141, 52633, 65281, 74665, … ({{OEIS|A001262}})&lt;br /&gt;
а по основанию 3 — последовательность:&lt;br /&gt;
: 121, 703, 1891, 3281, 8401, 8911, 10585, 12403, 16531, 18721, 19345, 23521, 31621, … ({{OEIS|A020229}})&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
{{примечания|3}}&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
* {{source|Q21950754|ref=Miller|ref-year=1975}} &amp;lt;!-- Riemann’s Hypothesis and Tests for Primality // STOC &#039;75 --&amp;gt;&lt;br /&gt;
* {{source|Q21950792|ref=Rabin|ref-year=1980}} &amp;lt;!-- Rabin M. O. Probabilistic algorithm for testing primality // J. Number Theor. --&amp;gt;&lt;br /&gt;
* {{source|Q21950824|ref=Baillie, Wagstaff|ref-year=1980}} &amp;lt;!-- Lucas Pseudoprimes --&amp;gt;&lt;br /&gt;
* {{source|Q27940855|ref=Monier|ref-year=1980}} &amp;lt;!-- Evaluation and Comparison of Two Efficient Probabilistic Primality Testing Algorithms // Theoretical Computer Science --&amp;gt;&lt;br /&gt;
* {{source|Q27940868|ref=Damgård, Landrock, Pomerance|ref-year=1993}} &amp;lt;!-- Average Case Error Estimates for the Strong Probable Prime Test // Math. Comp. --&amp;gt;&lt;br /&gt;
* {{source|Q27940862|ref=Arnault|ref-year=1995}} &amp;lt;!-- Constructing Carmichael Numbers which are Strong Pseudoprimes to Several Bases // Journal of Symbolic Computation --&amp;gt;&lt;br /&gt;
* {{source|Q21725116|ref=Menezes, Oorschot, Vanstone|ref-year=1996}} &amp;lt;!-- Handbook of Applied Cryptography --&amp;gt;&lt;br /&gt;
* {{source|Q27940816|ref=Schoof|ref-year=2008}} &amp;lt;!-- Four Primality Testing Algorithms // Algorithmic Number Theory: Lattices, Number Fields, Curves and Cryptography --&amp;gt;&lt;br /&gt;
* {{source|Q27940937|ref=Кормен|ref-year=2015}} &amp;lt;!-- Алгоритмы: Вводный курс --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
* {{книга |автор=Ю. В. Нестеренко. |часть=Глава 4.4. Как отличить составное число от простого |заглавие=Введение в криптографию |ответственный=Под ред. В.&amp;amp;nbsp;В.&amp;amp;nbsp;Ященко |год=2001 |издательство=Питер |isbn=5-318-00443-1 |страниц=288 |ссылка=http://nature.web.ru/db/msg.html?mid=1157083&amp;amp;uri=book.html|ссылка часть=http://nature.web.ru/db/msg.html?mid=1157083&amp;amp;uri=node32.html |archive-url=https://web.archive.org/web/20080225102710/http://nature.web.ru/db/msg.html?mid=1157083&amp;amp;uri=book.html|archive-date=2008-02-25}}&lt;br /&gt;
* [http://rosettacode.org/wiki/Miller-Rabin_primality_test Примеры реализации алгоритма на многих языках программирования]&lt;br /&gt;
* {{статья |автор=С.&amp;amp;nbsp;Б.&amp;amp;nbsp;Гашков |ссылка=http://new.math.msu.su/department/dm/dmmc/PUBL/Rab-mill.ps |заглавие=Упрощённое обоснование вероятностного теста Миллера&amp;amp;nbsp;— Рабина для проверки простоты чисел}}&lt;br /&gt;
* {{MathWorld|urlname=Rabin-MillerStrongPseudoprimeTest|title=Rabin-Miller Strong Pseudoprime Test}}&lt;br /&gt;
* [http://miller-rabin.appspot.com &amp;quot;SPRP records&amp;quot;]&lt;br /&gt;
* {{книга |автор=Crandall, R. and Pomerance, C. |часть=Probable primes and witnesses |заглавие=Prime Numbers |год=2001 |издательство=Springer-Verlag |isbn=978-0387252827}}&lt;br /&gt;
&lt;br /&gt;
{{Внешние ссылки}}&lt;br /&gt;
{{Теоретико-числовые алгоритмы}}&lt;br /&gt;
&lt;br /&gt;
{{Добротная статья|Теория информации и криптография}}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Тесты простоты]]&lt;/div&gt;</summary>
		<author><name>194.54.176.117</name></author>
	</entry>
</feed>