Primtal Rekursion Kernebegreber, anvendelser og fundamenter i datalogi Torsdag den 17. marts 2005 Nils Andersen A.K. Dewdney kap. 50+24 Primtalsformler Stokastisk primtalstest Deterministisk primtalstest Sierpinskis kurve 1
Primtal og sammensatte tal De positive hele tal IN 1 = {1, 2, 3,...} a er et multiplum af b b går op i a b er divisor i a Z q : a = q b b a divisorer(n) = {d IN 1 d n} primtal = {p IN 1 divisorer(p) = 2} Hovedsætning: Hvert positivt helt tal kan på en og pånær rækkefølgen kun på en måde skrives som et produkt af primtal. (Tallet 1 dannes som det tomme produkt.) (Entydig korrespondance mellem de positive hele tal og uendelige følger af naturlige tal, som kun på endeligt mange pladser er forskellige fra nul.) Eratosthenes sigte: sieve (p : xs) = [x x <- xs; x mod p <> 0] primes = map hd (iterate sieve [2..]) 2
Primtalsformler 2 q + 1 kan kun være primtal for q = 2 n. Pierre de Fermat (1601(?) 1665) påstod i 1640 i et brev til Marin Mersenne (1588 1648), at tallene F n = 2 2n +1 var primtal for hvert naturligt tal n: F 0 = 3, F 1 = 5, F 2 = 17, F 3 = 257, F 4 = 65537 er alle primtal, men (Euler 1732) F 5 = 4294967297 = 641 6700417, og F 6, F 7,... er også sammensatte. 2 q 1 kan kun være primtal for q primtal. Mange af Mersenne-tallene M n = 2 n 1 er primtal, og blandt dem de største kendte primtal (den 26. februar 2005: 2 25964951 1). Wilsons sætning: n > 1 er primtal (n 1)! 1 (mod n). Fermats lille sætning: For primtal p vil p a a p 1 1 (mod p). Antallet af primtal n er omtrentligt n ln n. 3
Primtalsundersøgelse Prime(n) n er et primtal Prøv at dividere n med de ulige tal 3, 5,..., n (eksponentiel tid). Prime co N P Pratt (1975): Prime N P Manindra Agrawal, Neeraj Kayal, Nitin Saxena (2002): Prime P Faktisk at finde divisorer i n synes at have meget større kompleksitet end at afgøre, hvorvidt n er sammensat. 4
Stokastisk primtalstest Lad n være et ulige tal 3 og t være den ulige del af n 1, det vil sige n 1 = 2 s t, hvor s er hel og t er ulige. Vi vil så sige, at et heltal b, 0 < b < n, er et stærkt indicium for, at n er et primtal, hvis gcd(b, n) = 1 (b t 1 b t 1 (mod n) b 2t 1 b 22t 1... b 2s 1t 1 (mod n)) Hvis n er et ulige primtal, vil alle tallene b, 0 < b < n, være stærke indicier for det. Sætning (Rabin): Hvis n er ulige og sammensat, vil højst 25% af tallene b, 0 < b < n, være stærke indicier for, at n er et primtal. Miller-Rabins Monte-Carlo-metode til primtalstest (med fejlsandsynlighed 25%): s := 0; t := n 1; while even(t) do s := s + 1; t := t div 2 od; Vælg et tilfældigt b, 0 < b < n; if gcd(b, n) > 1 then return sammensat; a := b t mod n; if a = 1 then return måske primtal; to s do if a = n 1 then return måske primtal; a := a 2 mod n od; return sammensat 5
Deterministisk primtalstest I polynomiumsringen Z n [x] vil der for et helt tal a, hvor gcd(a, n) = 1, gælde (x + a) n = x n + a hvis og kun hvis n er et primtal. For at reducere antallet af led på venstre side betragter man i stedet (x + a) n = x n + a (mod x r 1) i Z n [x] og det blev vist, at hvis dette stemmer for et passende r og et vist antal a er, er n et primtal, og at størrelsen af r og antallet af a er kan begrænses af et polynomium i log n. Beviset sikrer en køretid på O((log n) 16.5 ). 6
Sierpinskis kurve Grænsekurven udfylder et kvadrat. En tegneposition har et punkt og en retning: ; zig og zag tegner fra til : zig zag Rekursiv opbygning af zig n: zag n 2 zig n 2 zig n 2 zag n 2 7
Mundtlig opgave Opgave til mundtlig gennemgang torsdag den 31. marts (Kapitel 50 opgave 1): I et mørkt rum er der to krukker bolsjer. I den ene er der appelsinbolsjer, i den anden halvt appelsinbolsjer og halvt lakridsbolsjer. Hvor mange bolsjer skal man spise for at kunne skelne mellem de to krukker med 99%s sikkerhed? Skriftlig opgave Opgave til skriftlig aflevering torsdag den 31. marts: Skriv et program, som udtegner Sierpinskis kurve. Valg af programmeringssprog og tegnesystem overlades til opgaveløserne, men vælger man at skrive et SML-program, hvis resultattekst kan gives som kilde til LAT E X, kan programskitsen på næste side benyttes: 8
fun putline (x,y,dx,dy) = "\\put(" ^ tiltekst x ^ "," ^ tiltekst y ^ "){\\line(" ^ tiltekst dx ^ "," ^ tiltekst dy ^ "){1}}\n"; fun drawzig 1 (x,y,dx,dy) = (putline (x,y,~dy,dx) ^ putline (x-dy,y+dx,~dx,~dy), (x-dy-dx,y+dx-dy,~dx,~dy)) drawzig n tp = let val (to1,tp1) = drawzig (n div 2) tp val (to2,tp2) = drawzag (n div 2) tp1 val (to3,tp3) = drawzig (n div 2) tp2 val (to4,tp4) = drawzag (n div 2) tp3 in (to1^to2^to3^to4,tp4) end and drawzag..... ; fun sierpinski n = let val (to,tp) = drawzig n (0,0,0,~1) val (to,_) = drawzig n tp in "\\documentclass{article}\n\ \\\begin{document}\n\ \\\setlength{\\unitlength}{10pt}\n\ \\\begin{picture}(32,32)\n" ^ to ^ to ^ "\\end{picture}\n\\end{document}\n" end; 9
Værdien af print (sierpinski 16); videregives til et LAT E X-system. Særligt interesserede kan løse opgave 1 i kapitel 24, det vil sige modificere programmet, så kurven ikke får dobbeltpunkter, men tegnes med afskårne eller afrundede hjørner. 10