Föreläsning 9: Talteori

Relevanta dokument
Föreläsning 9: Talteori

Föreläsning 8: Aritmetik och stora heltal

Sats 2.1 (Kinesiska restsatsen) Låt n och m vara relativt prima heltal samt a och b två godtyckliga heltal. Då har ekvationssystemet

Föreläsning 8: Aritmetik och stora heltal

Algoritmanalys. Inledning. Informationsteknologi Malin Källén, Tom Smedsaas 1 september 2016

Primtal, faktorisering och RSA

Föreläsning 5: Grafer Del 1

Några satser ur talteorin

n (log n) Division Analysera skolboksalgoritmen för division (trappdivision). Använd bitkostnad.

Algoritmer, datastrukturer och komplexitet

Givet två naturliga tal a och b, som inte båda två är 0, hur räknar man ut största gemensamma delaren av a och b?

Kinesiska restsatsen

Kryptering och primtalsfaktorisering

Offentlig kryptering

Kapitel 2: De hela talen

Föreläsning 11: Beräkningsgeometri

Sökning och sortering

Övningshäfte 6: 2. Alla formler är inte oberoende av varandra. Försök att härleda ett par av de formler du fann ur några av de övriga.

Algoritmer, datastrukturer och komplexitet

TDDI16 Datastrukturer och algoritmer. Algoritmanalys

Data, typ, selektion, iteration

Algoritmer, datastrukturer och komplexitet

Quadratic Sieve. Avancerade algoritmer (2D1440) 8/ Joel Brynielsson, TCS/Nada (f.d. D95)

Lösningar till utvalda uppgifter i kapitel 5

Föreläsningsanteckningar F6

Lösningsförslag till Tentamen i 5B1118 Diskret matematik 5p 22 augusti, 2001

MA2047 Algebra och diskret matematik

Introduktion till formella metoder Programmeringsmetodik 1. Inledning

Tommy Färnqvist, IDA, Linköpings universitet. 2 Rekursion i C Implementation av rekursion Svansrekursion En till övning...

Lite om reella tal. Programmering. I java. Om operatorers associativitet och prioritet

Programmera i C Varför programmera i C när det finns språk som Simula och Pascal??

Hela tal LCB 1999/2000

Talteori (OBS en del frågor gäller diofantiska ekvationer och de tas inte upp från och med hösten 2012)

Gaussiska heltal. Maja Wallén. U.U.D.M. Project Report 2014:38. Department of Mathematics Uppsala University

Dugga Datastrukturer (DAT036)

MA 11. Hur starkt de binder. 2 Reella tal 3 Slutledning 4 Logik 5 Mängdlära 6-7 Talteori 8 Diofantiska ekvationer 9 Fördjupning och kryptografi

RSA-kryptering och primalitetstest

Beräkningsvetenskap föreläsning 2

Låt n vara ett heltal som är 2 eller större. Om a och b är två heltal så säger vi att. a b (mod n)

Introduktion till programmering SMD180. Föreläsning 4: Villkor och rekursion

Några inbyggda funktioner (med resultat!) Introduktion till programmering D0009E. Föreläsning 4: Villkor och rekursion. Modulus-operatorn.

Föreläsning 4: Kombinatorisk sökning

Geometri, talteori och kombinatorik

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Föreläsning 8: Aritmetik I

En studie av heltalens komplexitet

Outline. For. I istället för att följa det normala ordningen, man ändra den. I i Java får man inte göra hopp hur som helst

Grupper och RSA-kryptering

Delbarhet och primtal

Matematisk kommunikation för Π Problemsamling

Datastrukturer, algoritmer och programkonstruktion (DVA104, VT 2015) Föreläsning 6

C++ Funktioner 1. int summa( int a, int b) //funktionshuvud { return a+b; //funktionskropp } Värmdö Gymnasium Programmering B ++ Datainstitutionen

Tentamen ID1004 Objektorienterad programmering October 29, 2013

Föreläsning Datastrukturer (DAT036)

Bakgrund. Bakgrund. Bakgrund. Håkan Jonsson Institutionen för systemteknik Luleå tekniska universitet Luleå, Sverige

Rekursion och induktion för algoritmkonstruktion

Programkonstruktion och Datastrukturer

DD1314 Programmeringsteknik

Föreläsning Datastrukturer (DAT037)

1/15/2013. DD1310/DD1314/DA3009 Programmeringsteknik. Lärandemål... Vilka läser kursen? ...fler lärandemål VARFÖR? Föreläsning 1

Matematisk kommunikation för Π Problemsamling

DEL I. Matematiska Institutionen KTH

MA2047 Algebra och diskret matematik

Programmering för språkteknologer II, HT2014. Rum

Introduktion till algoritmer - Lektion 1 Matematikgymnasiet, Läsåret Lektion 1

LMA033/LMA515. Fredrik Lindgren. 4 september 2013

Algoritmer och datastrukturer H I HÅKAN S T R Ö M B E R G N I C K L A S B R A N D E F E L T

Föreläsning 5 Innehåll

Logik och kontrollstrukturer

public static void mystery(int n) { if (n > 0){ mystery(n-1); System.out.print(n * 4); mystery(n-1); } }

TDIU01 - Programmering i C++, grundkurs

A B A B A B S S S S S F F S F S F S F F F F

Tentamen Datastrukturer, DAT037 (DAT036)

Lösning av några vanliga rekurrensekvationer

Programmeringsteknik I

DD1361 Programmeringsparadigm. Carina Edlund

Tillämpad Programmering (ID1218) :00-13:00

DD1310/DD1314/DA3009 Programmeringsteknik LÄRANDEMÅL... Vilka läser kursen? ...FLER LÄRANDEMÅL. Föreläsning 1

Läsanvisning till Discrete matematics av Norman Biggs - 5B1118 Diskret matematik

Översikt över Visual Basic

Läsanvisning till Discrete matematics av Norman Biggs - 5B1118 Diskret matematik

EXTRA UPPGIFTER I C++ PROGRAMMERING-A

Dagens föreläsning. Repetition. Repetition - Programmering i C. Repetition - Vad C består av. Repetition Ett första C-program

MMA132: Laboration 2 Matriser i MATLAB

Algoritmer, datastrukturer och komplexitet

Obligatorisk uppgift 5

Översikt. Stegvis förfining. Stegvis förfining. Dekomposition. Algoritmer. Metod för att skapa ett program från ett analyserat problem

Dagens Teori. 2.1 Talteori Största gemensamma delaren. Vilket är det största tal som samtidigt är delare till de båda talen.

Programmering I Tobias Wrigstad fredag, 2009 augusti 28

TDIU01 - Programmering i C++, grundkurs

Grundläggande datalogi - Övning 4

Föreläsning 2 Programmeringsteknik och C DD1316. Mikael Djurfeldt

Föreläsning 4. Val, boolska värden, läsbarhet, osv

Bisektionsalgoritmen. Kapitel Kvadratroten ur 2

Lösningsförslag Tentamen i Beräkningsvetenskap I, 5.0 hp,

Lösningsförslag till tentamen Datastrukturer, DAT037,

Övning 2. (Länkade) Listor, noder

RSA-kryptografi för gymnasiet. Jonas Gustafsson & Isac Olofsson

Föreläsning 5 Innehåll. Val av algoritm och datastruktur. Analys av algoritmer. Tidsåtgång och problemets storlek

Transkript:

DD2458, Problemlösning och programmering under press Föreläsning 9: Talteori Datum: 2007-11-13 Skribent(er): Niklas Lindbom och Daniel Walldin Föreläsare: Per Austrin Den här föreläsningen behandlar modulär aritmetik, kinesiska restsatsen, primalitet och faktorisering. 1 Modulär aritmetik Modulär aritmetik innebär beräkningar innehållande mod n. a b(mod n) a b = k n, för något k Z Vid implementation har vi a = b a b + a mod b eller a = b (a div b) +a % b där (a div b) har olika betydelser för: om a 0 : (a div b) = a b om a<0 : (a div b) = a b Där vi använder div för att beteckna heltalsdivision i programspråket. 1.1 Aritmetiska operatorer När man gör beräknigar med addition, subtraktion, multiplikation och division med mod n får man svar tillhörande mängden Z n = {0, 1,...n 1}. Exempelvis addition och subtraktion: (x + y) mod n (x y) mod n 0 x, y < n Det är frestande att implementera mod genom att använda %-operatorn rakt av, men det fungerar inte för subtraktion eftersom: 12%7 = 5 12 mod 7=2 Det kan enkelt avhjälpas genom att stega upp %-operatorn: 1

2 DD2458 Popup HT 2007 Algoritm 1: Implementation of modulo-operatorn. Input: Heltal a, b. Output: x, dära x mod b och 0 x<b. mod(a, b) (1) if (a%b) < 0 (2) return (a%b + b) (3) else (4) return (a%b) 1.1.1 Addition Vid addition enligt (x + y) % n är användningen av %-operatorn onödigt långsam. En aningen snabbare metod av addition kan implementeras som: Algoritm 2: Addition. Input: Heltal x, y, n. Output: (x + y) mod n Addition(x, y, n) (1) z x + y (2) if (z n) (3) z z n (4) return z 1.1.2 Subtraktion Subtraktion enligt (x y) mod n =(n+x y) % n behöver inte heller göras onödigt krånglig då man vet att talen x, y Z n. Detta kan implementeras som: Algoritm 3: Subtraktion. Input: Heltal x, y, n. Output: (x y) mod n Subtraktion(x, y, n) (1) if (y >x) (2) z n + x y (3) else (4) z x y (5) return z

Talteori 3 1.1.3 Multiplikation Multiplikation av två tal z (x y) % n fungerar bra eftersom inget av talen är negativa men det kan förekomma vissa komplikationer vid beräkning av stora tal. Problem: Om n är stort så finns det risk för overflow. Det vill säga om man representerar alla tal med 32-bitars representation kan man bara representera 16 bitars modulär multiplikation. Möjliga lösningar: Använd stora heltal - BigInteger finns färdigt i java. Använd Försiktig multiplikation, se nedan. Om man räknar mod med ett n som ryms i 32 bitar kan man stoppa in alla tal i 64-bitars tal. Försiktig multiplikation Vid implementation: Kom ihåg att multiplikation förhåller sig till addition, som exponent förhåller sig till multiplikation. Vid multiplikation kan man utnyttja x y = x (y mod 2) + x (2 y 2 ) för att utföra en så kallad försiktig multiplikation. DoubleAndAdd är en iterativ implementation av ovanstående, som kör log(y) iterationer. Algoritm 4: Double and Add. Input: Heltal x, y, n. Output: x y DoubleAndAdd(x, y, n) (1) z 0 (2) while y 0 (3) if y mod 2 0 (4) z (z + x) mod n (5) x (x + x) mod n (6) y y 2 (7) return z

4 DD2458 Popup HT 2007 1.1.4 Division Det är viktigt att förstå vad som menas med division i det här fallet. Vid räkning av division tillsammans med modulo-operatorn är det inte helt självklart. Först och främst, vad betyder division? Jo, någon form av multiplikationsinvers. z x y mod n = x y 1 mod n Vi behöver hitta en invers y 1 så att: y y 1 =1mod n För att hitta en sådan invers kan man använda Euklides algoritm som baseras på följande: y 1 : y y 1 =1mod n k, y 1 : y y 1 + k n =1 gcd(y, n) =1 Euklides algoritm Givet a, b Z hittar Euklides algoritm x, y Z så att x a + y b =gcd(a, b) vilket är precis det verktyg vi behöver för att kunna dividera. Algoritm 5: Euklides algoritm. Input: Heltal a, b. Output: Ger x, y som uppfyller x a + y b =gcd(a, b). Euclidean(a, b) (1) if a =0 (2) return (0, 1) (3) else if b =0 (4) return (1, 0) (5) else (6) (y,x ) Euclidean(b, a % b) (7) return (x,y (a div b) x ) Korrekthet Låt d =gcd(a, b) =gcd(b, a mod b) så b y +(a mod b) x = d

Talteori 5 Vi vet att a mod b = a b a b så b y + ( a b a b ) x = d a x + b ( y x a b ) = d Körtid Man kan visa att efter två rekursiva anrop kommer någon av a och b att ha halverats. Det maximala antalet rekursiva anrop, och därmed körtiden, är därför O(log a +logb). 2 Kinesiska restsatsen Problem: { x a1 (mod n 1 ) x a 2 (mod n 2 ) Givet att gcd(n 1,n 2 )=1 Lös ekvationen m.a.p. x Kinesiska restsatsen (el. CRT - Chinese Remainder Theorem) säger att: Det existerar ett unikt x mod M, M = n 1 n 2, som uppfyller ekvationen. Låt: m 1 = n 1 1 mod n 2 m 2 = n 1 2 mod n 1 Och bilda x =(a 1 m 2 n 2 + a 2 m 1 n 1 ) mod M. Vi visar nu att detta x löser ekvationssystemet: x mod n 1 = a 1 n 1 2 n 2 + a 2 m 1 n 1 (mod n 1 )=a 1,eftersomn 1 2 n 2 =1 och a 2 m 1 n 1 (mod n 1 )=0. Pss för den andra ekvationen. Vad gör man om n 1,n 2 ej relativt prima (dvs gcd(n 1,n 2 ) 1) då? Inför variabelbytet x = x a 1,a = a 2 a 1 som ger: x =0 (modn 1 ) x = a (mod n 2 ) Låt d =gcd(n 1,n 2 ), n 1 = d n 1 och n 2 = d n 2 x = k 1 n 1 = k 1 dn 1 x = k 2 n 2 + a = k 2 dn 2 + a Ur ekvationerna ovan får vi a = d (k 1 n 1 k 2n 2 ). Man måste alltså ha ett a

6 DD2458 Popup HT 2007 som är jämnt delbart med d för att få en lösning. Vi kan då skriva: Så att: a = d a x = d x x = k 1 n 1 x = k 2 n 2 + a Och med andra ord: x =0 (modn 1 ) x = a (mod n 2 ) gcd(n 1,n 2 )=1 deär relativt prima - kan lösas på samma sätt som tidigare. Lösning: x = d x + a som är unik mod (n 1 n 2 d)

Talteori 7 3 Primalitet Givet tal N Z +, avgör om N är ett primtal. (n =log 2 N = #bitarin) Naivt: Prova alla tal upp till N som möjliga faktorer. Detta är dock långsamt, O( N)=O(2 n 2 ). 3.1 Primtalsåll - Eratosthenes såll Ide: Skapa en array isprime[1...n] som talar om för varje tal om det är ett primtal eller inte. Konstruktionen börjar med antagandet att alla tal är primtal varefter algoritmen sållar bort alla tal som inte är primtal. Algoritm 6: Implementation av Eratosthenes såll. Input: Storlek N av primtals-sållet. Output: bool-array för uppslagning av primtal. Eratosthenes(N) (1) for i =2to N (2) isprime[i] true (3) for p =2to N (4) if isprime[p] (5) for r =2p, 3p,... to N (6) isprime[r] false Komplexiteten för algoritmen är: ( O N + ) p N N p = O (N ) p N 1 p = O (N log(log(n))) = O (2 n log(n)). Där vi i mittensteget utnyttjade att p N 1 p log(log(n)) + B 1.DärB 1 0.2615 kallas Merten s konstant. Vid implementering finns det många sätt att göra algortimen snabbare och mer minnessnål. Implementationstrick De trick som är listade nedan kommer inte att förbättra den asymptotiska tidskomplexiteten, men programmet kommer att gå betydligt snabbare. Spara bara udda tal i sållet Specialbehandla tal 1 och 2, returnera icke primtal respektive primtal. Lagra endast udda tal från 3 och uppåt.

8 DD2458 Popup HT 2007 Då vi inte lagrar jämna tal kommer minnesanvändningen att halveras. Genom att bara undersöka udda tal blir det färre p att gå igenom i den yttre loopen. Dessutom blir det hälften så många r att undersöka i den innersta loopen (3p, 5p, 7p,...), för varje p. Sammantaget minskar det körtiden för algoritmen ungefär en faktor 4. Lagra 8 bools per byte En listig implementation av arrayen minskar minnesanvändningen avsevärt. Det innbär att vi reducerar minnesanvändningen med en faktor 8 och kommer att göra implementationen snabbare tack vare förbättrad cache-prestanda. Gå inte igenom bool-arrayen onödigt antal gånger För att ytterliggare optimera algoritmen vill vi undvika att titta på tidigare uppslagningar i arrayen. Om till exempel p =7, så har vi redan slagit upp 3 7 och 5 7, närp var 3 och 5. För att undvika titta att på dessa ännu en gång kan den inre loopen bytas från r =3p, 5p, 7p,... till r = p 2,p 2 +2p, p 2 +4p,... Vi kommer dock inte undvika alla tidigare uppslagningar, som tex 3 5 7. 3.2 Miller-Rabin Fermats lilla sats säger att om N primtal gäller a N 1 1(modN) för alla a Z N. Vilket leder oss till en idé: Algoritm 7: Primtalstest. Input: Tal N att testa för primalitet. Output: Sant eller falskt. Primtalstest(N) (1) a random(1,n 1) (2) b = a N 1 mod N (3) if b 1 (4) return N är ej ett primtal (5) else if b =1 (6) return Gissa att N är ett primtal Där random(1,n 1) slumpar ett värde mellan 1 och N 1....Tyvärr visar det sig att detta inte riktigt fungerar. Så kallade Carmichael-tal är ej primtal och uppfyller: a N 1 1(modN) för alla a Z N.

Talteori 9 Miller-Rabin primalitetstest utnyttjar att: Om N är ett primtal finns bara två kvadratrötter till 1(modN) :±1 Om N inte är ett primtal finns minst fyra kvadratrötter. Metod: Skriv N 1=s 2 r (s udda). Tag slumpvis a Z N och låt u 0 = a s,u i = u 2 i 1 (observera u r = a N 1 ). Om nu u 0 1och alla u i 1 (0 i<r)så N ej primtal. Annars gissa att det är ett primtal. Genom att upprepa denna procedur flera gånger kan vi med stor sannolikhet bestämma om N är ett primtal eller inte. Om man kör testet k gånger är sannolikheten att få fel 4 k. Algoritm 8: Miller-Rabin primalitetstest. Input: Tal N atttestaförprimalitetochk antal tester. Output: Sant eller falskt. MillerRabin(N, k) (1) for i =1to k (2) Låt N 1=2 t u, därt 1 och s udda. (3) a random(1,n 1) (4) u 0 a s mod N (5) for j =1to t (6) u j u 2 j 1 mod N (7) if u j =1och u j 1 1och u i 1 N 1 (8) return N är ej ett Primtal (9) if u t 1 (10) return N är ej ett Primtal (11) return N är primtal

10 DD2458 Popup HT 2007 4 Faktorisering För faktorisering av tal finns en uppsjö metoder, bland annat: Naivt O( N) Pollard-ρ O( 4 N) Den naiva lösningen är att testa talet genom att dela talet ifråga med alla heltal N som då givetvis får komplexiteten O( N). En bättre och snabbare lösning fås genom att använda Pollards ρ-algoritm som har komplexitet 4 N. Den bygger på observationen att x och y är kongruenta mod p med sannolikhet 0.5 efter att 1.177 p tal har valts slumpvisa. Om p är en av faktorerna i N, talet vi vill faktorisera, så har vi att 1 < gcd( x y,n) N eftersom p delar både x y och N. 1 Algoritm 9: Pollards ρ-algoritm. Input: N, talet som ska faktoriseras. f(x) är en slumpfunktion modulo N. Output: en icke-trivial faktor från N, annars förkasta. ALGORITM PollardRho(N) (1) x 2 (2) y 2 (3) d 1 (4) while d =1 (5) x f(x) (6) y f(f(y)) (7) d gcd( x y,n) (8) if d = N (9) return failure (10) else (11) return d 1 http://en.wikipedia.org/wiki/pollard_rho, 2007-11-15