Grunder i matematik och logik (2015) Delbarhet och primtal Marco Kuhlmann 1 Inledning RSA (uppkallad efter matematikerna Ron Rivest, Adi Shamir och Leonard Adleman) är en välkänd krypteringsalgoritm. Den använder två nycklar, en oο¬entlig nyckel och en hemlig nyckel. När Alice vill skicka ett meddelande till Bob krypterar hon det med Bobs oο¬entliga nyckel; meddelandet kan sedan bara dekrypteras med Bobs hemliga nyckel. Här är en förenklad beskrivning av hur nycklarna genereras:1 1. Välj slumpmässigt två olika, stora primtal π och π. 2. Låt π = ππ och låt π = (π − 1)(π − 1). 3. Välj ett annat heltal 1 < π < π så att den största gemensamma delaren av π och π är 1. 4. Beräkna sedan ett heltal π sådant att ππ mod π = 1. Den oο¬entliga nyckeln består av talen π och π; den hemliga nyckeln består av talen π och π. För att beskriva och beräkna RSA behöver man känna till ett antal grundläggande koncept från den gren av matematiken som kallas talteori, bland annat primtal, största gemensamma delare och heltalsdivision. Några av dessa koncept behandlas även i denna föreläsning; mera detaljerad information hittar man i kursboken, kapitel 5. Föreläsningen har även ambitionen att ge exempel på hur större matematiska argumentkedjor kan se ut. Sådana kedjor följer ofta mönstret deο¬nition–sats–bevis, där man först deο¬nierar matematiska koncept och sedan bevisar relevanta egenskaper hos dessa koncept. När en sats (eller en lemma, en hjälpsats) väl har bevisats kan den användas som ”makro” i andra bevis. Föreläsningen exempliο¬erar även ett antal bevistekniker, som t.ex. direkt bevis, induktionsbevis, indirekt bevis, bevis av likheter, bevis av unikhet. Notation Symbolen β€ betecknar mängden av alla heltal; symbolen β betecknar mängden av alla naturliga tal (positiva heltal). 1 baserad på http://sv.wikipedia.org/wiki/RSA 1(6) Grunder i matematik och logik (2015) Delbarhet och primtal 2 Delbarhet Vi börjar med en fundamental deο¬nition. Deο¬nition 1 Låt π, π ∈ β€. Vi säger att π delar π om det ο¬nns ett π ∈ β€ sådant att π = ππ. Detta skriver vi som π β£ π. 2 Exempel 1 Det gäller att 8 β£ 32 (ty 32 = 4 ⋅ 8) och att 16 β£ 256 (ty 256 = 16 ⋅ 16), men däremot inte att 8 är en delare till 30 eller att 16 är en delare till 100. 2 Lemma 1 För alla π, π1 , π2 ∈ β€ gäller: 1. Om π β£ π1 och π β£ π2 så även π β£ π1 + π2 . 2. Om π β£ π1 och π β£ π2 så även π β£ π1 − π2 . 2 Bevis. Vi bevisar endast påstående 1; beviset av påståendet 2 är nästan identiskt. Om π β£ π1 och π β£ π2 så ο¬nns π1 , π2 ∈ β€ sådana att π1 = π1 π och π2 = π2 π. Vi kan skriva π1 + π2 = π1 π + π2 π = (π1 + π2 ) ⋅ π . Alltså ο¬nns det ett π ∈ β€ sådant att π1 + π2 = ππ, nämligen π = π1 + π2 . Detta visar att π β£ π1 + π2 . 2 Lemma 2 För alla π, π1 , π2 ∈ β€ gäller: Om π β£ π1 och π β£ π2 så gäller även att π β£ π1 π1 + π2 π2 , för godtyckliga π1 , π2 ∈ β€. 2 Bevis. Generalisering av beviset till Lemma 1. 2 3 Primtal Deο¬nition 2 Ett tal π ∈ β kallas primtal om π > 1 och om dess enda delare är 1 och π. 2 Exempel 2 De tio första primtalen är 2, 3, 5, 7, 11, 13, 17, 19, 23, 29. Det största idag kända primtalet har 17 425 170 siο¬ror. Talet upptäcktes 2013-01-25.2 2 Lemma 3 Varje π ∈ β sådant att π > 1 kan skrivas som en produkt av primtal. 2 Exempelvis är 693 = 32 ⋅ 7 ⋅ 11 och 286 = 2 ⋅ 11 ⋅ 13. 2 http://en.wikipedia.org/wiki/Largest_known_prime_number 2(6) Grunder i matematik och logik (2015) Delbarhet och primtal Bevis. Görs på lektionen. 2 Detta lemma kan förstärkas till följande: Sats 1 (Aritmetikens fundamentalsats) Varje π ∈ β sådant att π > 1 kan skrivas som en produkt av primtal. Denna faktorisering är unik sånär som på ordningen av faktorerna. 2 Denna sats kommer vi tyvärr inte kunna bevisa i ramen av denna föreläsningen. Man känner inte till någon eο¬ektiv metod för att beräkna primtalsfaktoriseringen för ett givet tal. Frågan om det ο¬nns en algoritm som beräknar svaret i polynomisk tid är ett av de viktigaste olösta problem i datalogin. Om det skulle ο¬nnas en sådan metod skulle metoden RSA vara värdelös, eftersom man då skulle kunna räkna ut primtalen π och π och därmed den hemliga nyckeln utifrån talet π i den publika nyckeln. Sats 2 (Euklides sats) Det ο¬nns oändligt många primtal. 2 Bevis. Låt π1 , … , ππ vara en godtycklig men ändligt lång lista av primtal, π ≥ 1. Vi kommer att visa att det ο¬nns minst ett primtal som inte ο¬nns med i denna lista; det måste därför ο¬nnas oändligt många primtal. Låt π = π1 ⋅ β― ⋅ ππ och låt π = π + 1. Om π är ett primtal är beviset klart, för då kan vi konstatera att det ο¬nns det åtminstone ett primtal (nämligen π) som inte ο¬nns med i listan. Om π inte är ett primtal kan vi skriva det som en produkt av primtal (Lemma 3). Låt oss välja något primtal π ur denna primtalsfaktorisering. Vi kommer nu att göra ett indirekt bevis: Vi kommer att anta att π ο¬nns med på vår lista och visa att detta antagande leder till någonting som är omöjligt. Detta innebär att antagandet måste vara falskt, dvs. att π inte kan ο¬nnas med på vår lista. Därmed kommer beviset vara klart. Antag alltså att π ο¬nns med på vår lista. Då skulle vi ha π β£ π och π β£ π och därmed även π β£ π − π, dvs. π β£ 1 (Lemma 1). Detta är omöjligt eftersom den enda delaren som 1 har är 1 och π > 1. 2 4 Största gemensamma delare Deο¬nition 3 Låt π, π ∈ β€. Den största gemensamma delaren till π och π är det största talet π ∈ β bland deras gemensamma delare. Detta tal betecknar vi med sgd(π, π). 2 Exempel 3 sgd(693, 286) = 11 2 Ett sätt att beräkna den största gemensamma delaren till två tal är att bestämma talens primtalsfaktoriseringar och multiplicerar de faktorer som förekommer i båda. Till exempel är 693 = 32 ⋅ 7 ⋅ 11 och 286 = 2 ⋅ 11 ⋅ 13. Dessa gemensamt är faktorn 11. Detta tal är den största 3(6) Grunder i matematik och logik (2015) Delbarhet och primtal gemensamma delaren till 693 och 286. En mycket mer eο¬ektiv metod att beräkna den största gemensamma delaren är Euklides algoritm, som vi kommer att behandla i avsnitt 5. För att motivera den bevisar vi först ett antal räkneregler för den största gemensamma delaren: Lemma 4 För alla π, π ∈ β€ gäller: 1. sgd(π, 0) = π 2. sgd(π, π) = sgd(π, π) 3. sgd(π, π) = sgd(π − π, π) 2 Bevis. Görs på lektionen. 2 Med dessa identiteter kan vi beräkna sgd(693, 286) som i Figur 1. 5 Euklides algoritm Euklides algoritm är en eο¬ektiv algoritm för att beräkna den största gemensamma delaren till två tal π, π ∈ β€. Dess eο¬ektivitet bygger på observationen att beräkningen i Figur 1 har en speciell struktur: Om vi bortser från den sista raden så kan den delas in i faser där varje fas ser ut så här: • Tillämpa identitet 3 så länge som π − π ≥ 0. • Tillämpa identitet 2. I slutet hamnar vi ett läge där vi kan tillämpa identitet 1. Den upprepade tillämpningen av identitet 3 kan undvikas genom att inse att det vi gör med dessa är att beräkna resten av en heltalsdivision. Om vi som exempel tar kedjan från sgd(693, 286) till sgd(121, 286), som består av 2 stycken tillämpningar av identitet 3, så inser vi att 121 är resten av heltalsdivisionen 693/286. Lemma 5 För alla π, π ∈ β med π ≠ 0 ο¬nns unika π, π ∈ β sådana att π = ππ + π och π < π . Talet π kallas kvoten, talet π kallas resten. Vi skriver π som π div π och π som π mod π. 2 Exempel 4 Vi anger kvoten och resten för π = 693 och π = 286: π = 2, π = 121. 2 4(6) Grunder i matematik och logik (2015) Delbarhet och primtal sgd(693, 286) = sgd(693 − 286, 286) = sgd(407, 286) (med identitet 3) = sgd(407 − 286, 286) = sgd(121, 286) (med identitet 3) = sgd(286, 121) (med identitet 2) = sgd(286 − 121, 121) = sgd(165, 121) (med identitet 3) = sgd(165 − 121, 121) = sgd(44, 121) (med identitet 3) = sgd(121, 44) (med identitet 2) = sgd(121 − 44, 121) = sgd(77, 121) (med identitet 3) = sgd(121, 77) (med identitet 2) = sgd(121 − 77, 77) = sgd(44, 77) (med identitet 3) = sgd(77, 44) (med identitet 2) = sgd(77 − 44, 44) = sgd(33, 44) (med identitet 3) = sgd(44, 33) (med identitet 2) = sgd(44 − 33, 33) = sgd(11, 33) (med identitet 3) = sgd(33, 11) (med identitet 2) = sgd(33 − 11, 11) = sgd(22, 11) (med identitet 3) = sgd(22 − 11, 11) = sgd(11, 11) (med identitet 3) = sgd(11 − 11, 11) = sgd(0, 11) (med identitet 3) = sgd(11, 0) (med identitet 2) = 11 (med identitet 1) Figur 1: Beräkning av sgd(693, 286) = 11 med hjälp av reglerna i Lemma 4. 5(6) Grunder i matematik och logik (2015) Delbarhet och primtal a b a % b 693 286 121 286 121 44 121 44 33 44 33 11 33 11 0 11 0 – Figur 2: Euklides algoritm, exempel. Hur kan man räkna ut π div π och π mod π i Python? Med heltalsdivision kan vi förkorta varje fas i vår beräkning genom följande identitet: Lemma 6 För alla π, π ∈ β gäller sgd(π, π) = sgd(π, π mod π). 2 Bevis. Denna identitet kan bevisas genom att kombinera identiteterna 2 och 3 i Lemma 4: sgd(π, π) = sgd(π mod π, π) = sgd(π, π mod π) (π div π stycken tillämpningar av identitet 3) (identitet 2) 2 Nu kan vi ange Euklides algoritm som en enradare i Python: def gcd(a, b): return a if b == 0 else gcd(b, a % b) Ett konkret anrop illustreras i Figur 2. För att se att algoritmen terminerar, notera att 0 ≤ π mod π < π. Funktionens andra argument blir alltså mindre och mindre med varje steg, utan att någon gång bli mindre än 0. Detta innebär att funktionen så småningom anropas med ett andra argument som är 0, och då terminerar den. 6(6)