Testování prvočíselnosti

Podobné dokumenty
19. a 20. přednáška z kryptografie

Obsah. Euler-Fermatova věta. Reziduální aritmetika. 3. a 4. přednáška z kryptografie

Úvod. Karel Klouda c KTI, FIT, ČVUT v Praze 18. dubna, letní semestr 2010/2011

Úvod do kryptologie. 6. března L. Balková (FJFI ČVUT v Praze) Primality Testing and Factorization 6. března / 41

V každém kroku se a + b zmenší o min(a, b), tedy vždy alespoň o 1. Jestliže jsme na začátku dostali 2

8. RSA, kryptografie s veřejným klíčem. doc. Ing. Róbert Lórencz, CSc.

Kód trezoru 1 je liché číslo.

Pokročilá kryptologie

NPRG030 Programování I, 2016/17 1 / :58:13

Základy algoritmizace a programování

Generátory náhodných a

Iterační výpočty. Dokumentace k projektu č. 2 do IZP. 24. listopadu 2004

Programování: základní konstrukce, příklady, aplikace. IB111 Programování a algoritmizace

grupa těleso podgrupa konečné těleso polynomy komutativní generovaná prvkem, cyklická, řád prvku charakteristika tělesa

Hlubší věty o počítání modulo

Pokročilá kryptologie

Pracovní listy - programování (algoritmy v jazyce Visual Basic) Algoritmus

Komprese dat. Jan Outrata KATEDRA INFORMATIKY UNIVERZITA PALACKÉHO V OLOMOUCI. přednášky

Jazyk C práce se soubory. Jan Hnilica Počítačové modelování 16

Projektč.3dopředmětuIZP. Maticové operace

RSA. Matematické algoritmy (11MAG) Jan Přikryl. Ústav aplikované matematiky ČVUT v Praze, Fakulta dopravní. verze: :01

Příklady: (y + (sin(2*x) + 1)*2)/ /2 * 5 = 8.5 (1+3)/2 * 5 = /(2 * 5) = 1.3. Pavel Töpfer, 2017 Programování 1-3 1

Čínská věta o zbytcích RSA

NPRG030 Programování I, 2010/11

Matematické algoritmy (11MAG) Jan Přikryl. verze: :29

Programování I. Martin Pergel,

NPRG030 Programování I, 2018/19 1 / :25:37

Složitost a moderní kryptografie

Hlubší věty o počítání modulo

Historie matematiky a informatiky Cvičení 1

Základy programování. Úloha: Eratosthenovo síto. Autor: Josef Hrabal Číslo: HRA0031 Datum: Předmět: ZAP

Složitost Filip Hlásek

Obsah. Protokol RSA. Protokol RSA Bezpečnost protokolu RSA. 5. a 6. přednáška z kryptografie

LEKCE 6. Operátory. V této lekci najdete:

Prvočíslo a Ulamova spirála

Prvočísla, dělitelnost

Matematické algoritmy (11MAG) Jan Přikryl

MPI - 7. přednáška. Hledání inverzí v Z n. Rychlé mocnění modulo n. Lineární rovnice v Z + n. Soustavy lineárních rovnic v Z + n.

Hledání rekordně velkých prvočísel

Modulární aritmetika, Malá Fermatova věta.

Diskrétní matematika 1. týden

Datové struktury 2: Rozptylovací tabulky

Úvod RSA Aplikace, související témata RSA. Ing. Štěpán Sem Festival Fantazie, Štěpán Sem

Test prvočíselnosti. Úkol: otestovat dané číslo N, zda je prvočíslem

Práce se soubory. Základy programování 2 Tomáš Kühr

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

Pravděpodobnostní algoritmy

Data v počítači. Informační data. Logické hodnoty. Znakové hodnoty

Úvod do Matlabu. Praha & EU: Investujeme do vaší budoucnosti. 1 / 24 Úvod do Matlabu

Řetězové zlomky. již čtenář obeznámen. Důraz bude kladen na implementační stránku, protože ta je ve

Množina v C++ (set, multiset).

C2110 Operační systém UNIX a základy programování

4a. Makra Visual Basic pro Microsoft Excel Cyklické odkazy a iterace Makra funkce a metody

ALGORITMY TEORIE ČÍSEL

Pumping lemma - podstata problému. Automaty a gramatiky(bi-aag) Pumping lemma - problem resolution. Pumping lemma - podstata problému

5. a 6. přednáška z kryptografie

Základy algoritmizace. Hašování

Kombinatorika, výpočty

B3B33ALP - Algoritmy a programování - Zkouška z předmětu B3B33ALP. Marek Boháč bohacm11

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague

Úvod do programování

Karel Klouda c KTI, FIT, ČVUT v Praze 28. února, letní semestr 2010/2011

Úvod do teorie dělitelnosti

Programování I. Martin Pergel, 10. října Martin Pergel, Programování I

Historie matematiky a informatiky 2 7. přednáška

Předmluva k aktuálnímu vydání Úvod k prvnímu vydání z roku Typografické a syntaktické konvence... 20

5a. Makra Visual Basic pro Microsoft Escel. Vytvořil Institut biostatistiky a analýz, Masarykova univerzita J. Kalina

Gymnázium Vysoké Mýto nám. Vaňorného 163, Vysoké Mýto

Rekurzivní algoritmy

Časová a prostorová složitost algoritmů

Násobení pomocí sčítání

Prvočísla a čísla složená

Algoritmizace a programování

RSA. Matematické algoritmy (11MA) Miroslav Vlček, Jan Přikryl. Ústav aplikované matematiky ČVUT v Praze, Fakulta dopravní. čtvrtek 21.

Zavedení a vlastnosti reálných čísel

Matematické důkazy Struktura matematiky a typy důkazů

MFF UK Praha, 22. duben 2008

Definice 7.2. Nejmenší přirozené číslo k, pro které je graf G k-obarvitelný, se nazývá chromatické číslo (barevnost) grafu G a značí se χ(g).

Matematika pro informatiku 12

Uplatnění metod na zvolený jazyk

Algoritmy okolo teorie čísel

Eliptické křivky a RSA

Usuzování za neurčitosti

Kvantové algoritmy a bezpečnost. Václav Potoček

Pascal. Katedra aplikované kybernetiky. Ing. Miroslav Vavroušek. Verze 7

1 Nejkratší cesta grafem

Systém přirozené dedukce výrokové logiky

Binární vyhledávací stromy pokročilé partie

Úvod do programování - Java. Cvičení č.4

B3B33ALP - Algoritmy a programování - Zkouška z předmětu B3B33ALP. Marek Boháč bohacm11

Moravské gymnázium Brno s.r.o.

Z. Sawa (VŠB-TUO) Teoretická informatika 18. prosince / 67

Přednáška 7. Celočíselná aritmetika. Návratový kód. Příkazy pro větvení výpočtu. Cykly. Předčasné ukončení cyklu.

1. 1 P Ř I R O Z E N Á Č Í S L A

for (i = 0, j = 5; i < 10; i++) { // tělo cyklu }

Anotace. Informace o praktiku z programování!!! Direktivy překladače Soubory (textové) Quicksort Metoda rozděl a panuj

DIPLOMOVÁ PRÁCE. Hana Straková Testování perfektních mocnin

Týden 14. Přednáška. Teoretická informatika průběh výuky v semestru 1. PSPACE, NPSPACE, PSPACE-úplnost

Algoritmy okolo teorie čísel

Transkript:

Dokumentace zápočtového programu z Programování II (NPRG031) Testování prvočíselnosti David Pěgřímek http://davpe.net

Úvodem V různých oborech (například v kryptografii) je potřeba zjistit, zda je číslo (v praxi velké) prvočíslem. Existuje řada prvočíselných testů, já jsem si vybral Rabinův-Millerův. Původní (Millerova) verze testu je deterministická, ale závisí na zatím nedokázané zobecněné Riemannově hypotéze [1]. Později byl test pozměněn na pravděpodobnostní panem Rabinem [2]. Pokud test odpoví, že testované číslo je složené, má vždy pravdu. Odpoví-li, že je prvočíslo, je pravděpodobnost 1/4 k, že číslo je ve skutečnosti složené (k je počet iterací testu a lze jej v programu nastavit). Algoritmus jsem implementoval pro dlouhá čísla, s maximálně 50 ciframi. Poznámka: V této verzi programu je k dispozici i slabší, Fermatův test, který lze zapnout v parametru programu (viz. níže). Pro uživatele Program se standardně přeloží pomocí příkazu make. Ve složce bin je navíc přeložený program pro systém Windows s názvem primality_test.exe. Parametry programu Program bez parametrů Po spuštění bez parametrů, program čte čísla ze standardního vstupu. Uživatel zadává kladná přirozená čísla menší než 10 51. Program poté odpoví 1, pokud zadané číslo je prvočíslo, nebo 0 pokud je složené. Čtení čísel je zastaveno ukončením vstupu (tzv. EOF - End of File). Nepovinné parametry programu bin/primality_test [vstupní soubor] [výstupní soubor] [iterace] [test] vstupní soubor Jméno souboru, ze kterého bude program načítat čísla k testování. Pro načítání ze standardního vstupu vložte místo jména souboru pomlčku. výstupní soubor Jméno souboru, do kterého bude program ukládat výsledky testů. Pro ukládání do standardního vstupu vložte místo jména souboru pomlčku. iterace Číslo mezi 1 až 999 které značí, kolikrát se prvočíselný test provede. Větší počet iterací znamená větší pravděpodobnost, že test správně rozezná prvočíslo od složeného čísla. Velký počet iterací ovšem zpomalí čas testování. Výchozí hodnota je 10. test Písmeno určující, který algoritmus pro testování prvočíselnosti se použije. Zatím je k dispozici Rabinův-Millerův test (písmeno r) a Fermatův test (písmeno f). Výchozí hodnota je r. Možná zlepšení Pro zvýšení rychlosti programu by se hodilo implementovat aritmetické operace (násobení a modulení) jinými, než školními algoritmy. Rovněž by se dala ušetřit i paměť třeba pomocí statické alokace (a použití tzv. arena allocator) a chytřejšího uložení binárního čísla.

Chybové návratové hodnoty V případě, že se vyskytne známý problém, program skončí s nenulovou návratovou hodnotou a vypíše chybovou hlášku. Zde je pro úplnost seznam chybových návratových hodnot a popis chyby. kód Popis chyby 1 Číslo zadané k otestování obsahuje nečíselný znak (např. +12, 1 000, 3 ). 2 Číslo zadané k otestování má více než 50 cifer. 3 V parametru vstupní soubor je zadán soubor, který nelze otevřít (např. neexistuje). 4 V parametru výstupní soubor je zadán soubor, který nelze otevřít. 5 V parametru iterace je zadáno příliš velké číslo (lze zadat číslo mezi 1 až 999). 6 V parametru iterace je zadáno číslo obsahující nečíselný znak. 7 Parametr test musí být buď písmeno f, nebo r. Testovací data Ve složce tests jsou k dispozici čtyři soubory s testovacími daty. carmichael.in composites.in primes_small.in primes_big.in Patnáct složených, carmichaelových čísel. Patnáct složených čísel. Deset prvočísel o nejvýše 10 cifrách. Deset prvočísel s více než 10 a nejvýše 50 ciframi. Pro programátory Teorie za testováním prvočíselnosti Malá Fermatova věta: Nechť p je prvočíslo, pak pro číslo a [1, p), které je s p nesoudělné platí a p 1 1 (mod p) Z této věty se dá vyvodit jednoduchý pravděpodobnostní test prvočíselnosti. Fermatův test prvočíselnosti: Zvolíme počet iterací iterace a číslo n, které chceme otestovat. for i 1 to iterace do Vygenerujeme náhodné a [1, n) if a n 1 1 (mod n) then Číslo n nesplňuje MFV a nemůže tedy být prvočíslo (a je toho Fermatův svědek). Nenašli jsme žádného svědka, n je pravděpodobně prvočíslo. return prvočíslo Časová složitost testu je O(kN 2 ) kde N je počet bitů čísla n a k je počet iterací. Tento test však není všemocný, problém mu dělají takzvaná Carmichaelova čísla, která nesprávně prohlašuje za prvočísla.

Carmichaelovo číslo: Složené číslo n, pro které platí a n 1 1 (mod n) pro všechna a [1, p), která jsou s n nesoudělná. Věta o diskrétní odmocnině: Je-li p liché prvočíslo, pak a [1, p) má buď právě dvě odmocniny, nebo žádnou. Důsledek: Číslo 1 má právě dvě odmocniny: 1 a n 1. Pomocí tohoto důsledku a následujícího lemmatu lze zobecnit Malou Fermatovu větu. Lemma: Nechť n je liché přirozené číslo. Pak n 1 lze napsat jako 2 s t, kde t je rovněž liché přirozené číslo. Zobecněná Malá Fermatova věta: Je-li n je liché prvočíslo, pak podle lemmatu víme že n 1 = 2 s t pro liché t. Nechť a [1, n), pak pro posloupnost a n 1 2 = a 2s 1 t, a 2s 2 t,..., a t (mod n) platí: buď jsou všechny členy posloupnosti rovny 1, nebo existuje k, že k-tý člen posloupnosti je roven n 1 a všechny členy posloupnosti v pořadí před k jsou rovny 1. Nyní podle této věty vylepšíme Fermatův prvočíselnostní test. Tento test se jmenuje Rabinův- Millerův a jeho předností je, že mu nedělají potíže Carmichaelova čísla. Rabinův-Millerův test prvočíselnosti: Zvolíme počet iterací iterace a číslo n, které chceme otestovat. for i 1 to iterace do Nejprve provedeme Fermatův test. Vygenerujeme náhodné a [1, n). if a n 1 1 (mod n) then for x 2 s 1 t to t do if a x = n 1 (mod n) then Odmocnina z 1 je n 1. Zastavíme iteraci, neboť nevíme nic o odmocnině z n 1. break else if a x 1 (mod n) then Odmocnina z 1 není ani n 1 ani 1, tedy n je určitě složené. x = x/2 Nenašli jsme žádného svědka, n je pravděpodobně prvočíslo. return prvočíslo Stejně jako u Fermatova testu, pokud test odpoví složené, má vždy pravdu. Ale jak moc má pravdu, když odpoví prvočíslo?

Věta: Odpoví-li Rabinův-Millerův algoritmus na číslo n prvočíslo, pak pravděpodobnost, že n je složené je nejvýše 1/4 k kde k je počet iterací testu. Časová složitost testu je O(kN 3 ) kde k je počet iterací a N je počet bitů testovaného čísla n. Implementace aritmetických operací V programu jsou implementovány aritmetické operace s velkými čísly v binární soustavě. Tyto operace jsou sčítání, odčítání, násobení, dělení a modulení pomocí školních algoritmů. Dále jsou podporovány operace bitový posun doleva a doprava (v konstantním čase). Poslední operací je modulární umocňování, neboli počítání a n (mod m), která využívá následujících dvou tvrzení. Tvrzení: Pro přirozená čísla a, b a přirozené číslo m 0 platí: a b mod m = (a mod m b mod m) mod m Tvrzení (Mocnění pomocí čtverců): Pro přirozené číslo n a číslo x platí: 1 pro n = 0 ( ) 2 x n = x x n 1 2 pro n liché ( n ) 2 x 2 pro n sudé Algoritmus počítá a n (mod m) v čase O(N) kde N je počet bitů n (aritmetické operace považuji za konstantní). Modulární umocňování: modexp (a, n, m): if n > 0 then if n je liché then return (a modexp(a, n 1, m)) mod m else b = modexp(a, n/2, m) return b 2 mod m else return 1 Reference [1] G. Miller. Riemann s Hypothesis and Tests for Primality. Journal of Computer and System Sciences, 13(3):300-317, 1976 [2] M. Rabin. Probabilistic algorithm for testing primality. Journal of Number Theory, 12(1):128-138, 1980