Rabin-Millerův test prvočíselnosti
Transkript
Rabin-Millerův test prvočíselnosti
2010-02-09_3 Rabin-Millerův test prvočíselnosti Rabin-Millerův test je pravděpodobnostní algoritmus typu Monte Carlo – náhoda použitá v algoritmu ovlivňuje jak dobu běhu algoritmu, tj. po jak dlouhé době se dobereme výsledku, tak i samotnou správnost algoritmu, tj. algoritmus může udělat chybu a rozhodnout špatně, ale tyto případy se snaží minimalizovat. Tento algoritmus má chybu jednostrannou – tj. pokud odpoví číslo složené, víme určitě, že odpověděl správně, ale pokud naopak odpoví prvočíslo, mohl se splést. Pro kratší zápis operace modulo, která je zde poměrně častá si zavedeme zkrácený zápis: zá≡ ݉݁ݏ݅ ݉ݑݖݎí݉݁ ݊ ݈ݑ݀݉ ݐݏ݊ݒݎ Tvrzení: Předpokládejme, že n je liché prvočíslo. Nechť ݊ − 1 = 2 ∙ ݏkde ݏje liché. Dále nechť 1 ≤ ܽ ≤ ݊ − 1. Potom platí ܽ ௦ ≡ 1 ܾ݊݁ܽ ଶ ೕ௦ ≡ − 1 ݊ ݎě݆ܽ݇é 0 ≤ ݆ ≤ ݎ− 1. ೕ Poznámka: Pokud testování pomocí tohoto tvrzení selže, tj. ܽ ௦ ≢ 1 & ܽଶ ௦ ≢ − 1 ∀݆ ∶ 0 ≤ ݆ ≤ ݎ− 1, víme, že ݊ je složené a ܽ je toho svědkem. Použití tohoto tvrzení vlastně jen spočívá v modulárním mocnění čísla ܽ , tedy časová složitost závisí jen na tom, jak rychle zvládneme umocňovat. Co je potřeba pro důkaz tvrzení: ࢇ) ࡹࢇá ࡲࢋ࢘ࢇ࢚࢜ࢇ ࢜ě࢚ࢇ: ܲܽ݇ ݎž݀é ݒݎčíܽ݇ ܽ ݈ݏž݀é ݈ܿ݁é číݒ݇ܽݐ ܽ ݈ݏé, ž݁ ݀݁݊ ě݈í ܽ, ݐ݈ܽí ܽିଵ ≡ 1 ݉ ݀ ࢈) ࡼࢉé: ܲݒݎ ݆݁ ݀ݑ݇čí ݔ ܽ ݈ݏଶ ≡ 1, ≡ ݔ ݉ݐ 1 ܾ݊݁≡ ݔ − 1 Pomocné tvrzení si dokážeme: ݔଶ ≡ 1 ݔଶ −1 ≡ 0 ሺ ݔ− 1) ∙ ሺ ݔ+ 1) ≡ 0 Pokud p nedělí ሺ ݔ− 1) ani ሺ ݔ+ 1) ale dělí jejich součin, potom x nemůže být prvočíslem, což nás vede ke sporu. Z tohoto důvodu bude p dělit buď ሺ ݔ− 1) nebo ሺ ݔ+ 1). Takže platí ≡ ݔ ± 1. Postupně počítáme mocniny, začneme s ܽିଵ pokud nevyjde +1, Fermatův test nám potvrdí షభ složenost čísla ݊. Pokud vyjde 1 a ݊ − 1 je sudé, tak a na polovinu exponentu, tedy ܽ మ musí být opět odmocnina z jedničky, ty jsou dvě (dle pomocného tvrzení b) ). Pokud vyjde něco jiného než ±1 pak víme, že ݊ není prvočíslem. Jinak opět pokračujeme, tedy spočítáme ܽ షభ ర atd. ࡰࢋࢌࢉࢋ: ܵݒě݀݁݇ ܽ ݆݁ čí݈ݏ, ݇ݎ݁ݐé ݀ݎݒݐí ݈ݏž݁݊ ݐݏčí݊ ݈ܽݏ. Vladimír Mach Algoritmus Nechť je testované celé liché číslo, je celé číslo > 0 určující počet testování. RabinMillerTest(n, k) 1. Rozložit n na tvar ݊ − 1 = 2 ∙ ݏ, kde s je liché 2. Vybereme náhodné celé číslo a z rozsahu 1 < a < n 3. 4. 5. 6. ೕ Pro každé ݆ = 0, … , ݎ− 1 spočteme ݔ = ܽଶ ௦ ݉݊ ݀ Pokud ∄݅, ݅ = 0, … , ݎ− 1 | ݔ = −1 & ܽ ௦ ݉ ≠ ݊ ݀1 : vrať n je složené Kroky 2. – 4. (nazvěme je Testem) opakujeme k-krát Vrať n je prvočíslo Pozorování: Umocňování po čtvercích: ہౢౝ ۂ ݔ ݏč ݔ ݆݇ܽ ݁݉݁ݐଵ , ݔଶ , ݔସ = ሺ ݔଶ )ଶ , … , ݔଶ మ , ݇ ݈ݖݎ ݅ݏží݉݁ ݀ݒ݆݇ݒ݀ é ݕݒܽݐݏݑݏሺ݇ ݉ ݕ݀݁ݐá݉݁ ݆ܽ݇ݑݏ č݁)ݕ݆݇ݒ݀ ݊݅݊ܿ݉ ݐ ܽ ݉ůž݁݉݁ ݏčí ݔ ݐܽݐ = ݔଶ భ ା⋯ାଶ = ݔଶ భ ∙ … ∙ ݔଶ , ݈ܿ݁݇݁݉ ݐ ݕ݀݁ݐřܾܱ݁ ݆݁݉݁ݑሺlog ݇) ݊áܾ݊݁ݏí. Časová složitost Nejdůležitější, a také časově nejnáročnější, operací je mocnění modulo n v 3. kroku algoritmu. Podle předchozího pozorování spočítáme ݔ௦ (mod n) za ܱሺlog ݊) operací násobení modulo n. Každé ೕ násobení, za využití „školního“ algoritmu, nás stojí čas ܱሺlog ଶ ݊). Poté, co spočítáme ݔ௦ další ݔଶ ௦ získáme dalším mocněním po čtvercích, které nám opět zabere ܱሺlog ݊) operací modulo n. Když to dáme dohromady, získáváme časovou složitost ܱሺlog ଷ ݊) pro jeden Test (kroky 2. – 4. v algoritmu). Protože Test provádíme k-krát, výsledná časová složitost je ࡻሺ ⋅ ܗܔ ) Mezi méně náročné operace patří rozklad v prvním kroku, který nás stojí v nejhorším případě ܱሺlog ݊), než získáme liché ݏ. Pravděpodobnost výsledku Pokud algoritmus během svého běhu ohlásí, že ݊ je složené, víme zcela jistě, že ݊ prvočíslem není. Pokud dojde do konce (6. krok algoritmu), je pravděpodobné, že ݊ opravdu prvočíslo bude, ale nevíme to jistě. Pravděpodobnost, že se spleteme, závisí na tom, kolikrát opakujeme kroky 2. – 4., parametr k nám určuje spolehlivost algoritmu. Následující lemma nám pomůže tuto pravděpodobnost vyčíslit. ࡸࢋࢇ: ܲ ݆݁ ݊ ݀ݑ݇čí݈ݏ ݈ݏž݁݊é, ݏ݈݁ܽ ݆݁ݑݐݏ݅ݔ݁ ݇ܽň 3ൗ4 ݒݏě݀݇ů ܽ ܽݏݖݎ ݒℎ ݑ1 < ܽ < ݊ ݐℎ, ž݁ ݊ ݆݁ čí݈ݏ ݈ݏž݁݊é. Z toho tedy víme, že pokud algoritmus ohlásí, že n je prvočíslo, tak pravděpodobnost toho, že se ଵ spleteme, je: = ቀସቁ Tedy např. pro ݇ = 50 1 1 ହ 1 = ൬ ൰ = ൬ ൰ = ହ =ሶ 10ିଷ 4 4 4 Čím větší ݇ budeme volit, tím lépe budeme minimalizovat chybu. ~2~ Zdroje: • • • • Wolfram [http://mathworld.wolfram.com/Rabin-MillerStrongPseudoprimeTest.html] Martin Mareš - Algoritmy okolo teorie čísel [http://mj.ucw.cz/papers/numth.ps] (9. 1. 2008) Wikipedia [http://en.wikipedia.org/wiki/Modular_exponentiation] Fact-Archive Encyclopedia [http://fact-archive.com/encyclopedia/Miller-Rabin_primality_test] Příloha 1: Implementace Rabin-Millerova testu v jazyce PHP za pomoci knihovny BC Math (http://php.net/manual/en/book.bc.php), která implementuje práci s dlouhými čísly. function RabinMillerTest($n, $presnost = 100) { $s = $n - 1; $r = 0; //rozklad cisla $n na $n -1 = 2^$r * $s, kde $s je liché while($s % 2 == 0) { $s = $s / 2; $r++; } for($i = 0; $i < $presnost; $i++) { $a = rand(1, $n - 1); $x = bcmod(bcpow($a, $s), $n); if($x == 1) continue; $continue = false; for($j = 0; $j < $r; $j++) { $x = bcmod(bcpow($a, bcpow(2,$j)*$s), $n); if($x == $n - 1) { $continue = true; break; } } if($continue) continue; return false; } return true; } Funkce RabinMillerTest vrací false pokud je $n číslo složené, jinak true, tj. pokud $n je pravděpodobně prvočíslem. ~3~ 1. Pokud ݔିଵ ≠ 1: vrať n je složené (a je toho svědkem, podle Fermatovy věty) Předpokládejme, že výběr náhodného čísla z daného intervalu má konstantní složitost ܱሺ1). Provádíme tyto operace při testování + jejich časová složitost: 1. Rozklad čísla .. ܱሺܰ) 2. Jedno umocnění .. ܱሺܰ ଶ ) Mocnění se provádí O(1 + log n) krát, což dává O(N) mocnění. Celý test opakujeme k-krát. Tím Tedy máme časovou složitost ܱሺ1 + ݊ ∙ log ଷ ݊) = ܱሺ݊ ∙ log ଷ ݊) na jedno kolo, které provedeme kkrát. Složitost celkem je ܱሺ݇ ∙ ݊ ∙ log ଷ ݊ + log ݊) = ܱሺ݇ ⋅ ݊ ∙ log ଷ ݊) získáváme výslednou časovou složitost Oሺ݇ ⋅ ܰ ଷ ) ~4~
Podobné dokumenty
Příručka Sinumerik 840D-soustružení
spuštění WinNC přiřazeny speciální funkce pro ovládání programu SINUMERIK a ovládání
stroje. Zde vytvořené programy je možno přenést na obráběcí stroj. Při instalaci WinNC je nutno
použít variantu ...
NP-úplné a NP-těžké úlohy, Cookeova věta, heuristiky na - OI-Wiki
- ILP je lineární programování, kde proměnné jsou celá čísla
Rozhodovací úloha: Je dán prostý neorientovaný graf G = (V,E) bez smyček a číslo k. Lze
graf obarvit pomocí 3 barev?
Dokazuje se soustav...
article.download
narodí jako extrémně nezralé, což se týká všech systémů organismu. V takovém případě j pak nutné
klást si otázku, v jakých situacích a za jakých podmínek a v jakém modu rozhodování má být
poskytnut...