Miller-Rabinův test je test pravděpodobnostní polynomiální primality . Miller-Rabinův test spolu s Fermatovým testem a Solovay-Strassenovým testem mohou účinně určit, zda je dané číslo složené . Nelze jej však použít k přísnému dokazování , že číslo je prvočíslo . Miller-Rabinův test se však často používá v kryptografii ke generování velkých náhodných prvočísel .
Algoritmus Miller-Rabin je modifikací algoritmu Miller vyvinutého Garym Millerem v roce 1976 . Millerův algoritmus je deterministický , ale jeho správnost se opírá o neprokázanou rozšířenou Riemannovu hypotézu [1] . Michael Rabin jej upravil v roce 1980 [2] . Miller-Rabinův algoritmus nezávisí na platnosti hypotézy, ale je pravděpodobnostní.
Vzhledem k tomu, že kryptografická síla mnoha šifrovacích algoritmů je založena na tajných klíčích, jejichž vytvoření vyžaduje prvočísla (například takto funguje šifra RSA ), je při vytváření takových klíčů důležité mít možnost rychle zkontrolovat, zda velká čísla primálnost. Pravděpodobnostní testy primality, jako je Miller-Rabinův test a Solovay-Strassenův test , vykazují větší efektivitu použití a snadnost vyjádření ve srovnání s deterministickými testy [3] . Algoritmus Miller-Rabin vám umožňuje provést kontrolu v krátkém čase a zároveň poskytnout poměrně malou pravděpodobnost, že číslo je skutečně složené. [čtyři]
Stejně jako testy Fermat a Nightingale-Strassen se i test Miller-Rabin spoléhá na kontrolu řady rovností, které platí pro prvočísla. Pokud alespoň jedna taková rovnost selže, dokazuje to, že číslo je složené [5] .
Pro Miller-Rabinův test se používá následující tvrzení:
Nechť je prvočíslo a , kde je liché. Pak je splněna jakákoli z alespoň jedné z následujících podmínek:
|
V koncovém poli (pro prvočíslo ) nejsou žádné odmocniny jednoty, kromě čísel 1 , -1 |
Nechat:
Pak:
Podle Euklidova lemmatu :
Podle Fermatovy malé věty :
Vytáhneme druhé odmocniny čísla . Podle výše dokázaného lemmatu dostaneme v každém kroku číslo 1 nebo -1 modulo . Pokud v některém kroku dostaneme -1 , pak je splněna druhá z rovností. V opačném případě bude v posledním kroku (protože ), tj. bude splněna první rovnost.
Pokud je toto tvrzení (podmínka 1 nebo 2) pro některá čísla splněno a (ne nutně prvočíslo), pak se toto číslo nazývá Millerův prvočíslo a samotné číslo se nazývá pravděpodobné prvočíslo . (Náhodně existuje 25% pravděpodobnost, že složené číslo zaměníte za prvočíslo, ale lze to snížit kontrolou na jiné .)
V případě , že je splněn protiklad prokázaného tvrzení, to znamená, pokud existuje takový počet , že:
a
pak číslo není prvočíslo. V tomto případě se číslo nazývá svědkem, že číslo je složené.
Pro lichá složená čísla podle Rabinovy věty již neexistují svědci jednoduchosti, kde je Eulerova funkce , takže pravděpodobnost, že náhodně vybrané číslo bude svědkem jednoduchosti, je menší než 1/4 [2] [6] .
Myšlenkou testu je zkontrolovat náhodně vybraná čísla , zda jsou svědky prvotřídnosti čísla . Pokud existuje důkaz, že číslo je složené, pak je číslo skutečně složené. Pokud byla čísla zkontrolována a všechna se ukázala jako prvočísla, pak je číslo považováno za prvočíslo. Pro takový algoritmus bude pravděpodobnost přijetí složeného čísla pro prvočíslo menší [7] .
Pro kontrolu velkých čísel je zvykem volit náhodná čísla, protože rozdělení svědků primality a svědků složeného čísla mezi čísly 1, 2, ..., n − 1 není předem známo. Zejména Arnolt [8] uvádí 397bitové složené číslo, pro které jsou všechna čísla menší než 307 důkazem jednoduchosti.
Předpokládejme, že chceme určit, zda n = 221 je prvočíslo. Zapišme n − 1 = 220 jako 2 2 55, tedy s = 2 a d = 55. Libovolně zvolíme číslo a takové, že 0 < a < n , řekněme a = 174. Přejdeme k výpočtům:
Protože 220 ≡ −1 mod n , 221 je buď prvočíslo, nebo 174 je falešný svědek toho, že prvočíslo je 221. Vezměte další libovolné a , tentokrát zvolte a = 137:
Protože 137 je svědkem toho, že 221 je složené, číslo 174 bylo ve skutečnosti falešným svědkem jednoduchosti. Všimněte si, že algoritmus nám neříká nic o faktorech 221 (což jsou 13 a 17). V některých případech však dodatečné výpočty pomáhají získat faktory čísla. [9]
Miller-Rabinův algoritmus je parametrizován počtem kol r . Doporučuje se vzít r řádově , kde n je číslo, které se má zkontrolovat.
Pro dané n existuje celé číslo s a liché celé číslo t takové, že . Je vybráno náhodné číslo a , 1 < a < n . Jestliže a není svědkem prvočísla čísla n , pak je dána odpověď "n je složená" a algoritmus končí. Jinak se vybere nové náhodné číslo a a postup ověření se zopakuje. Po nalezení r důkazu jednoduchosti je dána odpověď "n je pravděpodobně prvočíslo" a algoritmus končí [5] .
Algoritmus lze napsat v pseudokódu takto:
Vstup : n > 2, liché přirozené číslo, které má být testováno na primálnost; k je počet kol. Výstup : kompozitní , znamená, že n je složené číslo; pravděpodobně prvočíslo znamená, že n je s vysokou pravděpodobností prvočíslo. Znázornění n − 1 jako 2 s · t , kde t je liché, lze provést postupným dělením n - 1 2. smyčka A: opakujte k krát: Vyberte náhodné celé číslo a v intervalu [2, n − 2] x ← a t mod n , vypočítané pomocí umocňovacího algoritmu modulo , pokud x = 1 nebo x = n − 1, pak přejděte k další iteraci smyčky A smyčky B : opakujte s − 1 krát x ← x 2 mod n , pokud x = 1, pak vraťte složenou , pokud x = n − 1, pak přejděte k další iteraci cyklu A vraťte složený návrat pravděpodobně prvočísloZ Rabinovy věty vyplývá, že pokud k náhodně vybraných čísel bylo svědkem prvotřídnosti čísla n , pak pravděpodobnost, že n je složené, nepřesahuje .
Také pro velké hodnoty n je pravděpodobnost deklarování složeného čísla pravděpodobně prvočíslo podstatně menší než 4 − k . Damgard, Landrock a Pomerands [10] vypočítali některé přesné hranice chyb a navrhli metodu pro výběr hodnoty k pro získání požadované hranice chyby. Takové hranice mohou být například použity pro generování pravděpodobných prvočísel. Neměly by se však používat k testování prvočísel neznámého původu, protože v kryptografických systémech se cracker může pokusit nahradit pseudoprvočíslo, když je prvočíslo vyžadováno. V takových případech se lze spolehnout pouze na chybu 4 − k .
Za předpokladu, že čas násobení je logaritmický, při použití rychlého násobení modulo je složitost algoritmu , kde je počet kol. Doba běhu algoritmu je tedy polynomiální.
Pomocí FFT je však možné zkrátit dobu běhu algoritmu na . V tomto případě, pokud vezmeme , kde n je číslo, které se má zkontrolovat, pak se složitost algoritmu rovná . [jedenáct]
Je-li číslo a svědkem jednoduchosti složeného lichého čísla n podle Millera, pak číslo n je zase silně pseudo prvočíslo v základu a . Je-li číslo n silně pseudoprvo v základu a , pak je také Fermatovo pseudoprvo v základu a a Euler-Jacobiho pseudoprvo v základu a . [3]
Například silně pseudoprimes v základu 2 tvoří sekvenci:
2047, 3277, 4033, 4681, 8321, 15841, 29341, 42799, 49141, 52633, 65281, 74665, … ( sekvence OEIS A001262 )a v základu 3 sekvence:
121, 703, 1891, 3281, 8401, 8911, 10585, 12403, 16531, 18721, 19345, 23521, 31621, … ( sekvence OEIS A020229 ) ![]() |
---|
Číselné teoretické algoritmy | |
---|---|
Testy jednoduchosti | |
Hledání prvočísel | |
Faktorizace | |
Diskrétní logaritmus | |
Hledání GCD | |
Modulová aritmetika | |
Násobení a dělení čísel | |
Výpočet druhé odmocniny |