Тест простоти Міллера — Рабіна

Матеріал з testwiki
Версія від 14:09, 28 травня 2024, створена imported>Олюсь
(різн.) ← Попередня версія | Поточна версія (різн.) | Новіша версія → (різн.)
Перейти до навігації Перейти до пошуку

Тест простоти Міллера — Рабіна або тест Міллера – Рабіна — це тест простоти: алгоритм, який визначає чи є надане число простим. Його початкова версія, яку розробив професор Міллер, є детерміністичною, але детермінізм покладається на недоведену узагальнену гіпотезу Рімана;[1] Міхаель Рабін змінив її, щоб отримати безумовний імовірнісний алгоритм.[2]

Вступ

Для багатьох застосувань, як-от криптографія, ми потребуємо великих випадкових простих чисел. На щастя, великі прості не такі вже й рідкісні, тому можливо перевіряти цілі потрібного розміру, щоб знайти серед них просте. Функція розподілу простих чисел π(n) визначає кількість простих чисел, які менші ніж n. Наприклад, π(10)=4. Відомо, що

limnπ(n)n/lgn=1.

Це досить якісне наближена оцінка для π(n). З цього ми маємо, що ймовірність того, що n є простим дорівнює 1/lgn. Геометричний розподіл підказує нам, що очікувана кількість спроб для знаходження простого числа становить lgn. Також ми, звісно, можемо опустити парні числа, що зменшує кількість спроб удвічі.

Наївним способом перевірки чи число просте був би повний перебір можливих дільників. Тобто для числа n потрібно було б перебрати 2,3,,n. Знов-таки, ми можемо пропускати парні числа більші ніж двійка. Якщо вважати, що кожне пробне ділення потребує однаково часу, то складність буде O(n), така складність є експоненційною для n. Алгоритми з такою складністю, зазвичай вважають повільними. Хоча у такого алгоритму є й перевага, він знаходить дільники n, тобто розкладає число.

Ймовірнісні тести простоти

Найвідомішими ймовірнісними тестами простоти є тест Соловея — Штрассена і тест Міллера — Рабіна. В обох випадках базова процедура та сама: ми визначаємо множину W свідків того, що n є складеним. Якщо ми можемо знайти wW, тоді W, і n є складеним числом. У випадку тесту Міллера — Рабіна W:=Wn.

Оцінка кількості свідків

Нехай n буде непарним числом і нехай n1=2tm, з непарним m. Припустимо, що n просте. Тоді квадратними коренями з 1 будуть лише ±1, тобто єдиними розв'язками x21 за модулем 2. Більше того, an11modn для кожного a, яке просте з n. Отже,

an11modn і a(n1)/2±1modn, і
якщо a(n1)/21modn, тоді a(n1)/4±1modn, і
якщо a(n1)/41modn, тоді

Ми бачимо: якщо n є простим, тоді для кожного a за умови, що gcd(a,n)=1, або am1modn, або існує j{0,,t1} з a2jm1modn. Зворотнє твердження також істинне, тобто, якщо n є складеним, тоді існує a з gcd(a,n)=1, таке що am≢1modn і a2jm≢1modn для 0jt1. І точніше:

Теорема: Нехай n буде складеним непарним числом. Нехай n1=2tm, з непарним m. Нехай

Wn={[a]n*|am≢1modn,a2jm≢1modn,0jt1}.

Тоді |Wn|φ(n)/2.

Порівняння з тестом Соловея—Штрассена

Тест Міллера — Рабіна буде кращим вибором:

  1. Легше обчислити тестові умови.
  2. Свідок для тесту Соловея—Штрассена також свідок для тесту Міллера — Рабіна.
  3. У тесті Міллера — Рабіна ймовірність натрапити на свідка за одну випадкову спробу більша ніж 3/4, а у тесті Соловея—Штрассена 1/2.

Псевдокод

МІЛЛЕР-РАБІН(n,k)

  1. якщо n парне тоді
  2. повернути ХИБА
  3. m(n1) div 2;t1
  4. поки m парне
  5. mm div 2;tt+1
  6. для i1 до k
  7. aRandom()modn
  8. uammodn
  9. якщо u1 тоді
  10.   j1
  11.    поки un1 і j<t
  12.     uu2modn;jj+1
  13.    якщо un1 тоді
  14.     повернути ХИБА
  15. повернути ІСТИНА

Імовірність помилки 1/4k.

Див. також

Примітки

Шаблон:Reflist

Джерела

Шаблон:Алгоритми теорії чисел