<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://camokathomelab.servebeer.com/mediawiki/index.php?action=history&amp;feed=atom&amp;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</id>
	<title>Тест Миллера — Рабина - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://camokathomelab.servebeer.com/mediawiki/index.php?action=history&amp;feed=atom&amp;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"/>
	<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;action=history"/>
	<updated>2026-07-20T02:15:27Z</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&amp;oldid=prev</id>
		<title>194.54.176.117: /* Реализация */</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&amp;oldid=prev"/>
		<updated>2025-11-11T16:00:45Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Реализация&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;Тест Миллера — Рабина&amp;#039;&amp;#039;&amp;#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;
: &amp;#039;&amp;#039;&amp;#039;Лемма про квадратные корни единицы в конечном поле &amp;lt;math&amp;gt;\mathbb{Z}_p&amp;lt;/math&amp;gt;:&amp;#039;&amp;#039;&amp;#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;) не существует квадратных корней из единицы, кроме чисел &amp;#039;&amp;#039;1&amp;#039;&amp;#039;, &amp;#039;&amp;#039;-1&amp;#039;&amp;#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;
По доказанной выше лемме, на каждом шаге у нас будет получаться число &amp;#039;&amp;#039;1&amp;#039;&amp;#039; или &amp;#039;&amp;#039;-1&amp;#039;&amp;#039; по модулю &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;. &lt;br /&gt;
Если на каком-то шаге у нас получится &amp;#039;&amp;#039;-1&amp;#039;&amp;#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; называют &amp;#039;&amp;#039;&amp;#039;свидетелем простоты&amp;#039;&amp;#039;&amp;#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; существует, согласно &amp;#039;&amp;#039;&amp;#039;теореме Рабина&amp;#039;&amp;#039;&amp;#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;
Предположим, мы хотим определить, является ли &amp;#039;&amp;#039;n&amp;#039;&amp;#039; = 221 простым. Запишем {{nowrap|&amp;#039;&amp;#039;n&amp;#039;&amp;#039; − 1 {{=}} 220}} как 2&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;·55, таким образом &amp;#039;&amp;#039;s&amp;#039;&amp;#039; = 2 и &amp;#039;&amp;#039;d&amp;#039;&amp;#039; = 55. Произвольно выберем число &amp;#039;&amp;#039;a&amp;#039;&amp;#039; такое, что 0 &amp;lt; &amp;#039;&amp;#039;a&amp;#039;&amp;#039; &amp;lt; &amp;#039;&amp;#039;n&amp;#039;&amp;#039;, допустим &amp;#039;&amp;#039;a&amp;#039;&amp;#039; = 174. Переходим к вычислениям:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;a&amp;#039;&amp;#039;&amp;lt;sup&amp;gt;2&amp;lt;sup&amp;gt;0&amp;lt;/sup&amp;gt;·&amp;#039;&amp;#039;d&amp;#039;&amp;#039;&amp;lt;/sup&amp;gt; mod &amp;#039;&amp;#039;n&amp;#039;&amp;#039; = 174&amp;lt;sup&amp;gt;55&amp;lt;/sup&amp;gt; mod 221 = 47 ≠ 1, &amp;#039;&amp;#039;n&amp;#039;&amp;#039; − 1&lt;br /&gt;
* &amp;#039;&amp;#039;a&amp;#039;&amp;#039;&amp;lt;sup&amp;gt;2&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;·&amp;#039;&amp;#039;d&amp;#039;&amp;#039;&amp;lt;/sup&amp;gt; mod &amp;#039;&amp;#039;n&amp;#039;&amp;#039; = 174&amp;lt;sup&amp;gt;110&amp;lt;/sup&amp;gt; mod 221 = 220 = &amp;#039;&amp;#039;n&amp;#039;&amp;#039; − 1.&lt;br /&gt;
&lt;br /&gt;
Так как 220 ≡ −1 mod &amp;#039;&amp;#039;n&amp;#039;&amp;#039;, число 221 или простое, или 174 — ложный свидетель простоты числа 221. Возьмём другое произвольное &amp;#039;&amp;#039;a&amp;#039;&amp;#039;, на этот раз выбрав &amp;#039;&amp;#039;a&amp;#039;&amp;#039; = 137:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;a&amp;#039;&amp;#039;&amp;lt;sup&amp;gt;2&amp;lt;sup&amp;gt;0&amp;lt;/sup&amp;gt;·&amp;#039;&amp;#039;d&amp;#039;&amp;#039;&amp;lt;/sup&amp;gt; mod &amp;#039;&amp;#039;n&amp;#039;&amp;#039; = 137&amp;lt;sup&amp;gt;55&amp;lt;/sup&amp;gt; mod 221 = 188 ≠ 1, &amp;#039;&amp;#039;n&amp;#039;&amp;#039; − 1&lt;br /&gt;
* &amp;#039;&amp;#039;a&amp;#039;&amp;#039;&amp;lt;sup&amp;gt;2&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt;·&amp;#039;&amp;#039;d&amp;#039;&amp;#039;&amp;lt;/sup&amp;gt; mod &amp;#039;&amp;#039;n&amp;#039;&amp;#039; = 137&amp;lt;sup&amp;gt;110&amp;lt;/sup&amp;gt; mod 221 = 205 ≠ &amp;#039;&amp;#039;n&amp;#039;&amp;#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;
Алгоритм Миллера — Рабина параметризуется количеством раундов &amp;#039;&amp;#039;r&amp;#039;&amp;#039;. Рекомендуется брать &amp;#039;&amp;#039;r&amp;#039;&amp;#039; порядка величины &amp;lt;math&amp;gt;\log_2(n)&amp;lt;/math&amp;gt;, где &amp;#039;&amp;#039;n&amp;#039;&amp;#039; — проверяемое число.&lt;br /&gt;
&lt;br /&gt;
Для данного &amp;#039;&amp;#039;n&amp;#039;&amp;#039; находятся такие целое число &amp;#039;&amp;#039;s&amp;#039;&amp;#039; и целое нечётное число &amp;#039;&amp;#039;t&amp;#039;&amp;#039;, что &amp;lt;math&amp;gt;n-1 = 2^s t&amp;lt;/math&amp;gt;. Выбирается случайное число &amp;#039;&amp;#039;a&amp;#039;&amp;#039;, 1 &amp;lt; &amp;#039;&amp;#039;a&amp;#039;&amp;#039; &amp;lt; &amp;#039;&amp;#039;n&amp;#039;&amp;#039;. Если &amp;#039;&amp;#039;a&amp;#039;&amp;#039; не является свидетелем простоты числа &amp;#039;&amp;#039;n&amp;#039;&amp;#039;, то выдаётся ответ &amp;#039;&amp;#039;«n — составное»&amp;#039;&amp;#039;, и алгоритм завершается. Иначе, выбирается новое случайное число &amp;#039;&amp;#039;a&amp;#039;&amp;#039; и процедура проверки повторяется. После нахождения &amp;#039;&amp;#039;r&amp;#039;&amp;#039; свидетелей простоты, выдаётся ответ &amp;#039;&amp;#039;«n — вероятно простое»&amp;#039;&amp;#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;
  &amp;#039;&amp;#039;&amp;#039;Ввод&amp;#039;&amp;#039;&amp;#039;: &amp;#039;&amp;#039;n&amp;#039;&amp;#039; &amp;gt; 2, нечётное натуральное число, которое необходимо проверить на простоту;&lt;br /&gt;
        &amp;#039;&amp;#039;k&amp;#039;&amp;#039; — количество раундов.&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;Вывод&amp;#039;&amp;#039;&amp;#039;: &amp;#039;&amp;#039;составное&amp;#039;&amp;#039;, означает, что &amp;#039;&amp;#039;n&amp;#039;&amp;#039; является составным числом;&lt;br /&gt;
        &amp;#039;&amp;#039;вероятно простое&amp;#039;&amp;#039;, означает, что &amp;#039;&amp;#039;n&amp;#039;&amp;#039; с высокой вероятностью является простым числом.&lt;br /&gt;
 Представить &amp;#039;&amp;#039;n&amp;#039;&amp;#039; − 1 в виде 2&amp;lt;sup&amp;gt;&amp;#039;&amp;#039;s&amp;#039;&amp;#039;&amp;lt;/sup&amp;gt;·&amp;#039;&amp;#039;t&amp;#039;&amp;#039;, где &amp;#039;&amp;#039;t&amp;#039;&amp;#039; нечётно, можно сделать последовательным делением &amp;#039;&amp;#039;n&amp;#039;&amp;#039; - 1 на 2.&lt;br /&gt;
 &amp;lt;u&amp;gt;цикл&amp;lt;/u&amp;gt; А: повторить &amp;#039;&amp;#039;k&amp;#039;&amp;#039; раз:&lt;br /&gt;
    Выбрать случайное целое число &amp;#039;&amp;#039;a&amp;#039;&amp;#039; в отрезке [2, &amp;#039;&amp;#039;n&amp;#039;&amp;#039; − 2]&lt;br /&gt;
    &amp;#039;&amp;#039;x&amp;#039;&amp;#039; ← &amp;#039;&amp;#039;a&amp;#039;&amp;#039;&amp;lt;sup&amp;gt;&amp;#039;&amp;#039;t&amp;#039;&amp;#039;&amp;lt;/sup&amp;gt; mod &amp;#039;&amp;#039;n&amp;#039;&amp;#039;, вычисляется с помощью алгоритма [[Алгоритмы быстрого возведения в степень по модулю|возведения в степень по модулю]]&lt;br /&gt;
    &amp;lt;u&amp;gt;если&amp;lt;/u&amp;gt; &amp;#039;&amp;#039;x&amp;#039;&amp;#039; = 1 или &amp;#039;&amp;#039;x&amp;#039;&amp;#039; = &amp;#039;&amp;#039;n&amp;#039;&amp;#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: повторить &amp;#039;&amp;#039;s&amp;#039;&amp;#039; − 1 раз&lt;br /&gt;
       &amp;#039;&amp;#039;x&amp;#039;&amp;#039; ← &amp;#039;&amp;#039;x&amp;#039;&amp;#039;&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; mod &amp;#039;&amp;#039;n&amp;#039;&amp;#039;&lt;br /&gt;
       &amp;lt;u&amp;gt;если&amp;lt;/u&amp;gt; &amp;#039;&amp;#039;x&amp;#039;&amp;#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; &amp;#039;&amp;#039;x&amp;#039;&amp;#039; = &amp;#039;&amp;#039;n&amp;#039;&amp;#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; &amp;#039;&amp;#039;составное&amp;#039;&amp;#039;&lt;br /&gt;
 &amp;lt;u&amp;gt;вернуть&amp;lt;/u&amp;gt; &amp;#039;&amp;#039;вероятно простое&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Из теоремы Рабина следует, что если &amp;#039;&amp;#039;k&amp;#039;&amp;#039; случайно выбранных чисел оказались свидетелями простоты числа &amp;#039;&amp;#039;n&amp;#039;&amp;#039;, то вероятность того, что &amp;#039;&amp;#039;n&amp;#039;&amp;#039; составное, не превосходит &amp;lt;math&amp;gt;4^{-k}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Также для больших значений &amp;#039;&amp;#039;n&amp;#039;&amp;#039; вероятность объявления составного числа вероятно простым существенно меньше чем 4&amp;lt;sup&amp;gt;−&amp;#039;&amp;#039;k&amp;#039;&amp;#039;&amp;lt;/sup&amp;gt;. Дамгард, Лэндрок и Померандс{{sfn|Damgård, Landrock, Pomerance|1993}} вычислили некоторые точные границы ошибок и предложили метод выбора значения k для получения нужной границы ошибки. Такие границы могут, например, использоваться для генерации вероятно простых чисел. Однако, они не должны использоваться для проверки простых чисел неизвестного происхождения, поскольку в криптографических системах взломщик может попытаться подставить псевдопростое число, в той ситуации, когда требуется простое число. В таких случаях можно положиться только на ошибку 4&amp;lt;sup&amp;gt;−&amp;#039;&amp;#039;k&amp;#039;&amp;#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;
Если число &amp;#039;&amp;#039;a&amp;#039;&amp;#039; является свидетелем простоты &amp;#039;&amp;#039;составного&amp;#039;&amp;#039; нечётного числа &amp;#039;&amp;#039;n&amp;#039;&amp;#039; по Миллеру, то число &amp;#039;&amp;#039;n&amp;#039;&amp;#039;, в свою очередь, называется &amp;#039;&amp;#039;&amp;#039;сильно псевдопростым&amp;#039;&amp;#039;&amp;#039; по основанию &amp;#039;&amp;#039;a&amp;#039;&amp;#039;. Если число &amp;#039;&amp;#039;n&amp;#039;&amp;#039; является сильно псевдопростым по основанию &amp;#039;&amp;#039;a&amp;#039;&amp;#039;, то оно также является [[Псевдопростое число Ферма|псевдопростым Ферма]] по основанию &amp;#039;&amp;#039;a&amp;#039;&amp;#039;, так и [[Псевдопростое число#Псевдопростые Эйлера — Якоби|Псевдопростым Эйлера — Якоби]] по основанию &amp;#039;&amp;#039;a&amp;#039;&amp;#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 &amp;#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>