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 offentlig nyckel och en hemlig nyckel.
När Alice vill skicka ett meddelande till Bob krypterar hon det med Bobs offentliga 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 offentliga 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 definition–sats–bevis, där man först
definierar 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 exemplifierar ä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 definition.
Definition 1 Låt π‘Ž, 𝑏 ∈ β„€. Vi säger att π‘Ž delar 𝑏 om det finns 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å finns π‘š1 , π‘š2 ∈ β„€ sådana att 𝑏1 = π‘š1 π‘Ž och 𝑏2 = π‘š2 π‘Ž. Vi kan skriva
𝑏1 + 𝑏2 = π‘š1 π‘Ž + π‘š2 π‘Ž = (π‘š1 + π‘š2 ) ⋅ π‘Ž .
Alltså finns 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
Definition 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 siffror. 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 effektiv metod för att beräkna primtalsfaktoriseringen för ett
givet tal. Frågan om det finns en algoritm som beräknar svaret i polynomisk tid är ett av de
viktigaste olösta problem i datalogin. Om det skulle finnas 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 finns 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 finns minst ett primtal som inte finns med i denna lista; det måste därför
finnas 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 finns det åtminstone ett primtal (nämligen 𝑏)
som inte finns 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 𝑝 finns 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 finnas med på vår lista. Därmed kommer beviset vara klart. Antag alltså
att 𝑝 finns 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
Definition 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 effektiv 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 effektiv algoritm för att beräkna den största gemensamma delaren till
två tal π‘Ž, 𝑏 ∈ β„€. Dess effektivitet 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 finns 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)