Discrete Structuren voor Informatici

advertisement
Discrete Structuren voor Informatici
1
Eenvoudige telproblemen
Dit zijn aantekeningen voor het college Discrete Structuren voor Informatici,
Blok A, herfst 2008. We behandelen een aantal telproblemen, recurrente
betrekkingen, binomiaalcoëfficiënten, en belangrijke basisbegrippen uit de
getaltheorie. We beginnen met een rijtje praktische telproblemen en zullen
zien dat voor de oplossing ervan bepaalde technieken telkens terugkomen.
Een lijstje:
1. Hoeveel rijtjes ter lengte n zijn er met de symbolen 0 en 1.
2. Hoeveel verschillende deelverzamelingen heeft een verzameling met n
elementen.
3. Hoeveel elementen heeft het cartesisch product V × W van twee verzamelingen, als |V | = m en |W | = n.
4. Hoeveel verschillende Hongaarse nummerborden zijn er (een Hongaars
nummerbord bestaat uit drie letters gevolgd door drie cijfers).
5. Hoeveel relaties zijn er op een verzameling V met n elementen (een
relatie R op V is per definitie een deelverzameling van V × V , de
verschillende soorten relaties vormen een belangrijk onderwerp van de
rest van deze cursus).
6. Hoeveel getallen zijn er waarvan de cijfers allemaal verschillend zijn.
7. Hoeveel verschillende ’woorden’ zijn er van 5 letters.
8. Op hoeveel manieren kun je 10 personen in paren verbinden (bijvoorbeeld om een tennisronde te spelen).
1
9. Hoeveel verschillende n keer n matrices zijn er waarvan alle elementen
0 of 1 zijn. Hoeveel daarvan hebben een even, hoeveel een oneven
determinant.
10. Hoeveel verschillende bridgeverdelingen zijn er.
11. Hoelang duurt het om een lijst te sorteren.
12. Hoeveel ja/nee vragen heb je nodig om iets te weten te komen.
We zullen de meeste van deze vragen beantwoorden, sommige moeten nog
een paar jaartjes wachten.
Probleem 1: Hoeveel rijtjes ter lengte n zijn er met de symbolen 0 en 1 (zeg
an ).
Voor een probleem als dit begint men, om een idee te krijgen eerst voor kleine
waarden van n alle rijtjes te genereren. Voor n = 1: 0 of 1; voor n = 2: 00,
01, 10, 11; voor n = 3 vinden we zo acht rijtjes, en we zien dat het aantal elke
keer verdubbelt. Dit leidt ons tot het vermoeden dat het antwoord 2n is. Dit
willen we natuurlijk bewijzen, en dat kan op tal van manieren. Het kortste
bewijs is natuurlijk dat rijtjes ter lengte n precies de binaire representaties
van de getallen 0 tot en met 2n − 1 geven. Maar we kunnen ook proberen
te bewijzen dat er geldt an = 2an−1 , en dan met inductie concluderen dat
an = 2n . Waarom is an gelijk aan 2an−1 . We onderscheiden twee soorten
rijtjes, rijtjes die beginnen met 0, en rijtjes die beginnen met 1. Van beide
soorten zijn er precies an−1 , omdat de rest van het rijtje gewoon weer een
willekeurig rijtje met nullen en énen is, maar nu van lengte n − 1.
Probleem 2: Hoeveel verschillende deelverzamelingen heeft een verzameling
met n elementen (zeg an ).
Ook hier beginnen we weer met kleine waarden van n. Voor n = 0 hebben we
de lege verzameling, en deze heeft 1 deelverzameling, namelijk zichzelf. Voor
n = 1 is de verzameling een singleton: V = {a}, en er zijn twee deelverzamelingen, ∅ en {a}. Voor n = 2 en V = {a, b} vinden we ∅, {a}, {b} en
{a, b}. Voor n = 3 vinden we 8 deelverzamelingen, en we zien weer dat
het aantal elke keer verdubbelt. Kunnen we weer bewijzen dat an = 2an−1 ?
Laat n > 0, en kies een element a uit V . We onderscheiden twee soorten
deelverzamelingen, die welke a bevatten en die welke a niet bevatten. Van
beide soorten zijn er precies an−1 , omdat de rest van de deelverzameling een
2
willekeurige deelverzameling van V \ {a} is.
We zien dat dit probleem dezelfde oplossing heeft als het vorige en ook de bewijzen lijken sprekend op elkaar. Dit suggereert dat er een verband is tussen
de twee getelde objecten. Kunnen we een bijectie (een één op één afbeelding)
verzinnen tussen 0/1 rijtjes en deelverzamelingen maken zodat duidelijk is
dat er van beide evenveel zijn?
Probleem 3. Hoeveel elementen heeft het cartesisch product V × W van twee
verzamelingen.
Volgens de definitie geldt V × W = {(v, w) | v ∈ V, w ∈ W }. Voor elke v ∈ V
kunnen we |W | = n paren maken, dus |V × W | = |V | × |W | = mn. Deze
uitkomst rechtvaardigt de notatie V × W , de reden om dit tel probleem op
te nemen zijn de volgende twee vragen.
Probleem 4. Hoeveel Hongaarse nummerborden zijn er. Een Hongaars nummerbord kun je zien als een geordend zestal (letter,letter,letter,cijfer,cijfer,cijfer),
en dus als een element van de product verzameling A × A × A × C × C × C.
Hier is A het alfabet, een verzameling van 26 letters, en C de verzameling
cijfers, met 10 elementen. We vinden dus als antwoord 263 103 .
Probleem 5. Hoeveel relaties zijn er op een verzameling V met n elementen.
Een relatie is een deelverzameling van V × V . Deze verzameling heeft n2
2
elementen. Het aantal deelverzamelingen daarvan is dus 2n .
Probleem 6. Hoeveel getallen zijn er waarvan alle cijfers verschillend zijn.
Het is duidelijk dat zo’n getal ten hoogste 10 cijfers heeft, verder is het eerste
cijfer (per definitie) niet 0, tenzij het getal 0 is. Dit is een voorbeeld van een
probleem waarbij je een object in stappen construeert, waarbij je voor elke
volgende stap een aantal mogelijkheden hebt dat onafhankelijk is van de
keuzes die je gemaakt hebt in de vorige stappen. Als voorbeeld kiezen we
het aantal getallen met 6 cijfers. Voor het eerste cijfer hebben we 9 mogelijkheden, want 0 is verboden. Onafhankelijk van onze keuze hebben we voor
het tweede cijfer 9 mogelijkheden, één cijfer is afgevallen, maar 0 is nu weer
toegestaan. Voor het derde cijfer hebben we 8, daarna 7 daarna 6, daarna 5
mogelijkheden. We vinden in totaal 9.9.8.7.6.5 mogelijkheden.
3
Probleem 7. Hoeveel ’woorden’ zijn er van 5 letters. We staan elke combinatie
van 5 letters toe als woord, dus bijvoorbeeld qxntk en aartb zijn allebei
toegestaan. We zien dus dat we kijken naar de verzameling A×A×A×A×A,
waar A het alfabet is. Het antwoord is dus 265 .
Probleem 8. Op hoeveel manieren (an ) kunnen we 2n personen in paren
verbinden.
Hier kunnen we weer beginnen met kleine waarden van n. Voor n = 1 zijn
er twee personen, die noodzakelijk een paar vormen. Voor n = 2 hebben
we vier personen. Een willekeurige persoon heeft drie mogelijke partners,
daarna ligt het tweede paar vast, dus a2 = 3. Voor n = 3 hebben we zes
personen. Een willekeurige persoon heeft 5 mogelijke partners, daarna zijn er
nog 4 ongepaarde personen over, maar dit is het vorige probleem, we kunnen
het dus op 3 manieren afmaken: a3 = 5.3. We zien dat het probleem voor n
eenvoudig reduceert tot het probleem voor n − 1: Een willekeurige persoon
heeft 2n − 1 mogelijke partners. Is die gekozen dat moeten we om het af
te maken de overige 2n − 2 personen paren. Dus an = (2n − 1)an−1 , en er
volgt an = (2n − 1)(2n − 3)(2n − 5) . . . 5.3.1. In sommige analyse leerboeken
vinden we hiervoor ook wel de notatie (2n − 1)!!.
Probleem 9. Hoeveel n keer n matrices met nullen en énen zijn er.
Dit probleem heeft niets met lineaire algebra te maken. We kunnen de rijen
achter elkaar zetten, en dan krijgen we gewoon één lange 0/1 rij ter lengte
2
n2 . Het antwoord is dus weer 2n . Dit is hetzelfde als het aantal relaties op
een verzameling met V elementen. Vind zelf uit waarom.
Hoeveel van deze matrices hebben een oneven determinant. Dit probleem
hoort wel tot de lineaire algebra. Voor de liefhebbers is hier een mooie
formule:
(2n − 1)(2n − 2)(2n − 4)(2n − 8) . . . (2n − 2n−1 ).
Voor n = 3 vinden we zo 168 matrices met een oneven, en 344 met een even
determinant.
Probleem 10. Dit komt later.
Probleem 11. Hoelang duurt het om een lijst te sorteren.
Het antwoord op deze vraag hangt af van het soort vragen dat we kunnen
4
stellen. We gaan hier uit van de situatie dat we telkens voor twee items a
en b kunnen vragen of testen: komt a voor b. Laat de lijst n items bevatten.
Het totale aantal mogelijkheden waarop deze geordend kunnen zijn is dan
n! = n(n − 1)(n − 2) . . . 2.1. Na elke test valt afhankelijk van het resultaat
een gedeelte van de mogelijkheden af, of het complementaire gedeelte. Als
we pech hebben is dus na elke vraag tenminste de helft van het aantal mogelijkheden overgebleven. We moeten dus verwachten m vragen te moeten
stellen, waarbij n!/2m < 2. Hoe groot is m dan? Om dat te weten te komen
moeten we iets weten over hoe snel sommige functies groeien.
Probleem 12. Hoeveel ja/nee vragen heb je nodig om iets te weten te komen.
Bekend is het volgende probleem. Ik neem een getal onder de duizend in
gedachten. Jij mag tien ja/nee vragen stellen, bijvoorbeeld is het getal even,
of is het getal kleiner dan 500. Kun je na afloop het getal raden? Eenvoudiger is de volgende versie: ik heb een rijtje nullen en énen ter lengte
10 opgeschreven. Jij mag tien ja/nee vragen stellen. Kun je dan het getal
vinden: het antwoord hier is duidelijk, je vraagt: is het eerste getal een nul,
is het tweede getal een nul,..., is het tiende getal een nul. Mijn antwoorden verraden dan natuurlijk het getal. Het vorige probleem is een beperkte
versie van dit probleem, immers alleen een bepaald soort vraag is toegestaan, en het is niet duidelijk of er altijd een geschikte vraag is om het aantal
mogelijkheden ruwweg te halveren.
2
Recurrente betrekkingen
We willen informatie als een rijtje nullen en énen opslaan op een schijf. Er
is ruimte voor n symbolen. Om technische redenen mogen er geen twee énen
naast elkaar staan. Laat an het aantal van zulke rijtjes zijn. Natuurlijk geldt
dat an ≤ 2n , het totale aantal 0/1-rijtjes. Ook hier kunnen we weer voor
kleine n alle rijtjes genereren. n = 1: 0 en 1; n = 2 00, 01, 10; n = 3
000, 001, 010, 100, 101; voor n = 4 vinden we 8 mogelijkheden. We krijgen
het rijtje 2, 3, 5, 8, 13, 21, . . .. We vermoeden dat elk getal in deze rij de som
is van zijn twee voorgangers: an = an−1 + an−2 . Als dit zo is kunnen we
natuurlijk razendsnel de rij genereren. Kunnen we dit bewijzen? Om dit
in te zien kijken we naar het begin van een rijtje ter lengte n. Zo’n rijtje
begint met een 0 of met een 1, maar als het met een 1 begint, dan komt
5
daarna noodzakelijk een 0. We hebben dus rijtjes van de vorm 0(staart) en
10(staart). De staart kan zelf weer zo’n rijtje zijn, in het eerste geval ter
lengte n − 1, in het tweede geval ter lengte n − 2. We vinden dus inderdaad
an = an−1 + an−2 (voor n > 2).
We zien dat de rij sterk stijgt. Het vermoeden is gerechtvaardigd dat an
ruwweg gelijk is aan c.an voor zekere c en 1 < a < 2. Is er een rij an van
deze vorm die voldoet aan de recurrente betrekking an = an−1 + an−2 ? Er
moet dan gelden dat
c.an = c.an−1 + c.an−2 ,
voor alle n. Dit zijn oneindig veel vergelijkingen met maar twee onbekenden,
maar in feite zijn ze allemaal√gelijkwaardig met de enkele vergelijking a2 =
a + 1, met oplossing a = (1 ± 5)/2.
√ Wen zullen zien dat inderdaad geldt dat
an ongeveer gelijk is aan c.((1 + 5)/2) voor zekere c.
We maken het bovenstaande precies. We hebben√gezien dat de vergelijking
√
x2 − x − 1 = 0 de twee oplossingen heeft x1 = (1 + 5)/2 en x2 = (1 − 5)/2.
Hieruit volgt dat elke rij van de vorm an = Axn1 + Bxn2 voldoet aan de
recurrente betrekking an = an−1 + an−2 . Immers
an − an−1 − an−2 = Axn−2
(x21 − x1 − 1) + Bx2n−2 (x22 − x2 − 1) = 0.
1
Voor onze rij geldt a1 = 2 en a2 = 3. Wanneer we A en B kunnen bepalen
zodat alles klopt, dan blijft het kloppen, want de rest van de rij ligt dan vast.
We gaan nu recurrente betrekkingen in zijn algemeenheid bekijken.
De eenvoudigste recurrente betrekking: an = an−1 . De rij is constant, an = a0
voor alle n.
Nog steeds eenvoudig: an = an−1 + c waarbij c een constante is. We hebben
nu een rekenkundige reeks, an = a0 + nc.
Eenvoudig of lastig: an = an−1 + cn . Hier is cn een bekende, eenvoudige of ingewikkelde functie van n. Er geldt an = a0 +c1 +c2 +. . .+cn . Voor eenvoudige
functies cn is zo een expliciete formule voor an te bepalen, bijvoorbeeld, als
cn = n dan geldt an = a0 +1+2+3+. . .+n = a0 +n(n+1)/2. Nog een typisch
voorbeeld: an = an−1 + 2n , Nu krijgen we an = a0 + 2 + 22 + 23 + . . . + 2n =
a0 + 2n+1 − 2.
Te reduceren tot het vorige geval is de recurrente betrekking an = c.an−1 .
We krijgen de meetkundige reeks an = cn .a0 . We bekijken twee varianten:
an = cn .an−1 , waarbij cn weer een bekende, eenvoudige of ingewikkelde functie van n is. Er geldt nu an = cn .cn−1 . . . . .c1 .a0 , en afhankelijk van de vorm
6
van cn kunnen we hieruit een formule voor an vinden. Als an = n.an−1 dan
zien we dat an = n!.a0 . Als cn = (1+1/n) = (n+1)/n, dan geldt (ga na!) dat
c1 .c2 . . . . .cn = n+1 en dus an = (n+1)a0 . Iets lastiger is het als we te maken
hebben met een ’stoorterm’ s. Het eenvoudigste voorbeeld is an = c.an−1 + s.
Voor c = 1 hebben we dit al gezien, we krijgen een rekenkundige reeks. Als
c 6= 1 dan kunnen we het probleem terugbrengen tot een eerder probleem
door het ’verschuiven’ van de rij an . Laat an = bn + λ, voor een geschikt
gekozen λ. Nu wordt onze betrekking bn + λ = c.(bn−1 + λ) + s, hetgeen we
kunnen herschrijven als bn = c.bn−1 + (c − 1)λ + s. Kiezen we nu λ zo dat
de ’stoorterm’ (c − 1)λ + s nul is, dan hebben we voor bn een eenvoudiger
probleem, namelijk bn = cn .b0 . Zo krijgen we dus, met λ = −s/(c − 1) dat
an + s/(c − 1) = cn .(a0 + s/(c − 1).
Ook voor ingewikkelder stoortermen sn een bekende functie van n kan de recurrente betrekking zo soms worden opgelost an = c.an−1 + sn : We brengen
nu het probleem terug tot een eerder probleem door een nieuwe rij bn = an /cn
te beschouwen. Hiervoor geldt: bn = bn−1 + sn /cn . Hiervan is, als boven, de
oplossing bn = b0 + s1 /c + s2 /c2 + . . . + sn /cn , en dan an = b.cn .
We bekijken nu recurrente betrekkingen van de vorm an = P an−1 + Qan−2 .
Hier zijn P en Q (bekende) constanten, en verder nemen we aan dat de eerste
twee termen a0 en a1 gegeven zijn. Omdat elke term berekend kan worden uit
de vorige twee, ligt hiermee de rij an vast. We maken even een uitstapje naar
lineaire algebra. Als we afzien van de begincondities a0 =iets, en a1 =ook
iets, dan geldt voor de oplossingen van deze recurrente betrekking dat ze de
volgende twee eigenschappen hebben: als bn en cn voldoen, dan voldoet ook
de rij dn = bn + cn . Ook de rij λ.bn voldoet. Hieruit volgt dat de oplossingen
van de recurrente betrekking zonder begincondities een vectorruimte vormen,
en wel van dimensie 2, omdat de waarden van de rij voor n = 0 en n = 1,
die vrij zijn, de rest vastleggen. Om de algemene oplossing te vinden van
de recurrente betrekking te vinden volstaat het dus om twee ’onafhankelijke’
oplossingen te vinden, en dan hiervan een lineaire combinatie te maken die
aan de begincondities a0 =iets, en a1 =ook iets voldoet.
Als voorbeeld nemen we weer de rij van Fibonacci. Deze rij heeft als begin
waarden f0 = 0 en f1 = 1. De recurrente betrekking is fn = fn−1 + fn−2 ,
voor n ≥ 2. Zien we af van de begincondities, dan zien we dat fn = xn een
oplossing is als√geldt dat xn = xn−1 + xn−2 oftewel x2 − x − 1 = 0. Dit geldt
5)/2. De algemene√oplossing voor deze recurrente betrekking
voor x = (1 ± √
is fn = a((1 + 5)/2)n + b((1 − 5)/2)n , waarbij a en b berekend kunnen
7
√
√
worden uit√
a + b = f0 = 0√en a(1 + 5)/2 + b(1 − 5)/2 = f1 = 1. We krijgen a = 1/ 5 en b = −1/ 5. Als tweede voorbeeld nemen we de recurrente
betrekking tn = 4tn−1 − 4tn−2 , t0 = 1, t1 = 1. Voor een oplossing van de
vorm tn = xn geldt nu dat x2 − 4x + 4 = 0, en dus x = 2. We hebben pech,
de karakteristieke vergelijking heeft maar één nulpunt. In dit geval wordt
een tweede oplossing gegeven door de rij tn = n.2n , en de algemene oplossing
is nu tn = (an + b).2n . We kunnen met behulp van t0 en t1 nu weer a en
b uitrekenen: n = 0 : b = t0 = 1, n = 1 : 2(a + b) = 1, dus a = −1/2.
Waar komt die extra oplossing tn = n.2n eigenlijk vandaan: We kunnen de
recurrente betrekking herschrijven tot tn − 2tn−1 = 2(tn−1 − 2tn−2 ), dus voor
de ’verschilrij’ vn = tn − 2tn−1 geldt de eenvoudigere betrekkking vn = 2vn−1 .
Hiervan is de algemene oplossing vn = c.2n , en in ons geval vn = −2n /2 en nu
moeten we nog oplossen tn = 2tn−1 −2n−1 , en deze kunnen we zoals we eerder
gezien hebben vereenvoudigen door un = tn /2n te stellen, waarna we krijgen:
un = un−1 − 1/2, u0 = 1, en dus un = 1 − n/2 en daarmee tn = (1 − n/2)2n .
3
Binomiaalcoëfficiënten
Onze eerste telprobleem vroeg naar het aantal 0/1-rijtjes ter lengte n. We
vragen nu meer gedetailleerd naar het aantal zulke rijtjes met precies k énen.
Equivalent hiermee is de vraag naar het aantal k-deelverzamelingen
van een
n-verzameling. Het antwoord op deze vraag duiden we aan met nk wat we
uitspreken als n boven k of ook wel als n kies k. In oudere literatuur vindt
men ook wel Ckn of Cn,k of varianten hiervan. Zonder een expliciete formule
kunnen we natuurlijk al wel opmerken dat
!
!
!
!
n
n
n
n
+
+ ... +
+ ... +
= 2n ,
0
1
k
n
door het totaal aantal 0/1-rijtjes op te splitsen naar het aantal énen wat er in
voorkomt, respectievelijk het totale aantal deelverzamelingen in de aantallen
deelverzamelingen met een bepaalde cardinaliteit.
De
volgende betrekking stelt ons in staat snel een tabel te genereren
voor
n
n
voor kleine waarden van n en k. We merken eerst op dat 0 = nn = 1,
k
want er is maar één rijtje met alleen maar nullen, of alleen maar énen. We
bekijken het geval 0 < k < n: Er geldt nu
!
!
!
n
n−1
n−1
=
+
.
k
k
k−1
8
Als het rijtje begint met 0, dan is de staart een rijtje ter lengte n − 1 met k
énen. Begint het rijtje met een 1, dan is de staart een rijtje ter lengte n − 1
met k − 1 énen. Deze recurrente betrekking stelt ons in principe instaat
elke binomiaalcoëfficiënt uit te rekenen, maar het aantal stappen wordt al
snel astronomisch. Om een eenvoudige uitdrukking te krijgen gaan we eerst
anagrammen tellen, met behulp van het zogenaamde ’schaapherdersprincipe’.
Dit ontleedt zijn naam aan het volgende (misschien niet erg realistische) voorbeeld. Wij liggen in de wei en zien een kudde schapen, dicht opeengepakt,
zodat we alleen een grote wolk witte wol zien met hier en daar een oog of
een neus. Wel kunnen we eenvoudig vaststellen dat er 80 poten op de grond
staan. Er van uitgaand dat elk schaap 4 poten heeft, en dat deze allemaal
op de grond staan concluderen we dat er 20 schapen zijn.
We willen dus iets tellen, schapen, maar dat is lastig, iets anders, poten, is
wel eenvoudig, en aangezien elk schaap hetzelfde aantal poten heeft, weten
we ook het aantal schapen.
Hoeveel anagrammen heeft het woord FLIPJE. Een anagram is een woord
dat ontstaat door de letters in een willekeurige volgorde te zetten. Omdat FLIPJE zes verschillende letters heeft is het antwoord eenvoudig: 6! =
6.5.4.3.2.1, het totale aantal permutaties van 6 dingen.
Hoeveel anagrammen heeft het woord SCHAAPS. Dit is lastiger, de letters zijn niet verschillend. Sommige permutaties van de letters leveren hetzelfde anagram op. Laten we de A’s verschillend maken, de eerste heet
A1 , de tweede A2 . Hetzelde voor de S’en. Het aantal anagrammen van
S1 CHA1 A2 P S2 is nu 7! want alle letters zijn verschillend. Dit zijn de poten,
makkelijk te tellen. De schapen zijn de anagrammen, de poten de anagrammen met gelabelde A’s en S’en. Het is duidelijk dat elk schaap(s) op vier
manieren gelabeld kan worden, de A’s op twee manieren, en onafhankelijk hiervan de S’en, dus hier heeft elk schaap 4 poten, en het totaal aantal schapen,
dus anagrammen is 7!/4 = 1260.
We bekijken een ander onzinwoord: HAHAHAHAH. Labelen we de letters, dan krijgen we 4 gelabelde H’s en 3 gelabelde A’s. Nu zijn de letters
verschillend en het aantal permutaties (poten) is dus 7! = 5040. Hoeveel
poten heeft een schaap? Van elk schaap kunnen de H’s op 4! = 24 manieren
gelabeld worden, en onafhankelijk daarvan de A’s op 3! = 6 manieren. Elk
schaap heeft dus 4!.3! = 144 poten. Het aantal schapen, dus anagrammen
van HAHAHAHA is daarmee 7!/(3!.4!).
Terug naar ons 0/1-probleem, vervangen we in een HAHAHAH-anagram de
H’s door 0 en de A’s door 1, dan zien we dat we precies alle rijtje krijgen ter
9
lengte 7 met precies drie énen. Een rijtje ter lengte n met k énen en n − k
nullen is hetzelfde als een anagram van 1.(k).10.(n − k).0. Kopiëren we de
redenatie van boven dan vinden we dus de expliciete formule:
!
n
n!
=
.
k
k! (n − k)!
Voor kleine (en grote) waarden van k is het beter deze formule iets te vereenvoudigen. Door de factoren van (n − k)! weg te strepen tegen corresponderende termen in de teller krijgen we
!
n
n(n − 1) . . . (n − k + 1)
.
=
k!
k
n
=
1 n
randgevallen 0
In het bijzonder geldt
n,
n
2
n
n
= n(n − 1)/2,
n
3
= n(n − 1)(n − 2)/6.
Om ook de
=
= 1 te krijgen spreken we af dat 0! = 1.
Waar komt de naam binomiaalcoëfficiënten vandaan? We bekijken de machten
van het binoom (tweeterm) a + b. We stellen per definitie (a + b)0 = 1, verder
is (a+b)1 natuurlijk a+b en (a+b)2 = a2 +2ab+b2 . Als we (a+b)3 uitrekenen,
door consequent de distributiviteit van vermenigvuldigen en optellen toe te
passen dan krijgen we:
(a + b)3 = aaa + aab + aba + abb + baa + bab + bba + bbb = a3 + 3a2 b + 3ab2 + b3 .
We zien dat we in eerste instantie 8 = 23 termen krijgen, alle rijtjes ter lengte
3 met a’s en b’s, de anagrammen aab, aba, baa, leveren in het eindresultaat
2
natuurlijk allemaal dezelfde
term
a b,dus de coëfficiënten herkennen we als
de binomiaal coëfficiënten 30 , 31 , 32 en 33 .
Algemeen geldt dat
!
!
!
!
n n 0
n n−1 1
n n−k k
n 0 n
(a + b) =
a b +
a b + ... +
a b + ... +
ab .
0
1
k
n
n
In deze formule interpreteren we a0 en b0 per definitie als 1 (we hadden ze
natuurlijk ook gewoon niet op kunnen schrijven). Deze formule staat bekend
als het binomium van Newton. Niet omdat deze door Newton ontdekt is,
want hij is al veel ouder, maar Newton had de geniale gedachte om hem te
gebruiken voor ’onzinwaarden’ van n. We nemen a = 1 en b = x:
!
!
n
n 2
(1 + x) = 1 +
x+
x + ....
1
2
n
10
De formule
n
k
= n(n − 1) . . . (n − k + 1)/k! heeft betekenis voor elk reëel of
zelfs complex getal n, dus bijvoorbeeld (volgens deze formule)
en
−1/2
2
−1
k
= (−1)k ,
= 3/8. Zo kunnen we ons dus afvragen wat de formule
(1 + x)1/2 = 1 + x/2 − x2 /8 + 3x3 /96 + . . .
die we krijgen door n = 1/2 te nemen zou kunnen betekenen. Nemen we
voor x een klein getal, bijvoorbeeld x = 0, 0201, dan weten we enerzijds dat
(1 + x)1/2 = 1, 01, deze formule geeft ons
(1, 0201)1/2 = 1 + 0, 01005 − 0, 00005050125 + iets heel kleins,
√
√
Meer
praktisch:
hoe
groot
is
10,
we
schrijven
10
=
9(1
+
1/9),
dus
10 =
q
3 (1 + 1/9). Newton:
(1 + 1/9)1/2 ' 1 + 1/18 − 1/648 = 683/648,
√
dus misschien is 10 ongeveer 683/216. We berekenen (683/216)2 = 466489/46656,
iets kleiner dan 10.
We besluiten onze telaktiviteiten met een viertal problemen uit de statistiek.
Drie ervan zijn we al tegengekomen, de vierde is wat lastiger, maar levert
een eenvoudige binomiaalcoëffiënt op als antwoord.
In een vaas bevinden zich n genummerde ballen (denk aan het trekken van
winnende lotto combinaties, dus de ballen hebben nummers 1, . . . , n). Uit
deze vaas worden k ballen getrokken, we beschouwen nu de volgende telproblemen: Hoeveel mogelijke resultaten zijn er als de volgorde van de nummers
van belang is, en hoeveel als deze niet van belang is.
Het eerste probleem hebben we al bekeken: hoeveel woorden zijn er met 5
verschillende letters: 26.25.24.23.22.21. Hier hebben we eigenlijk hetzelfde
probleem, iedere trekking levert ons een woord ter lengte k op uit een alfabet
met n letters” n(n − 1) . . . (n − k + 1).
Als de volgorde niet van belang is, dan is het resultaat
een deelverzameling
n
van {1, . . . , n} ter grootte k. Dit aantal is k , zoals we hierboven gezien
hebben.
We bekijken nu de volgende variant: Een getrokken bal wordt teruggelegd
in de vaas. Opnieuw willen we weten hoeveel mogelijkheden er zijn voor
de trekking. Als de volgorde van belang is, dan is het resultaat van een
trekking eenvoudig een rijtje getallen ter lengte k, waarbij elk van de getallen
11
1, 2, . . . , n is. Dit is dus nk , het aantal elementen van de verzameling Ak =
A × A × . . . × A, met k A’s.
Nieuw, en belangrijk, is het geval waar de ballen worden teruggelegd, maar
waar de volgorde van de getrokken ballen niet van belang is. Als voorbeeld bekijken we het vijfmaal trekken met teruglegging uit een vaas met
drie ballen. Wat kan het resultaat zijn, als de volgorde niet van belang is:
11111, 11112, 11113, 11122, 11123, 11133, dit zijn de mogelijkheden als drie
keer 1 getrokken wordt. We zien dat elke rij bestaat uit een aantal énen, een
aantal tweeën, en een aantal drieën, samen 5. Dit brengt ons op het idee
om de rij te coderen door een 0/1 rij: Eerst beginnen we met zoveel 0’en
als het aantal énen in de rij, dan volgt een 1. Vervolgens een aantal nullen
corresponderend met het aantal 2’en in de rij, dan weer een 1, tenslotte
zoveel nullen als het aantal 3’en in de rij. Onze voorbeeld rijtjes zijn dus als
volgt gecodeerd: 0000011, 0000101, 0000110, 0001001, 0001010, 0001100. We
zien dat onze rijtjes een code opleveren met precies 5 nullen en 2 énen, maar
omgekeerd levert ook elk 0/1 rijtje vandeze
vorm een 1/2/3 rijtje op. Het
5+2
aantal rijtjes met 5 nullen en 2 énen is 2 . Veralgemenen we dit dan zien
we dat een (gesorteerd) rijtje ter lengte k van elementen van de verzameling {1, . . . , n} gecodeerd kan worden door een 0/1 rijtje met k nullen (elk
element dat voorkomt geeft een nul) en n − 1 énen (tussen elk tweetal opvolgende symbolen komt een ’scheidingséén). Het totale aantal
wordt
dus gelijk
n+k−1
aan het aantal 0/1-rijen met k nullen en n − 1 énen, dus
.
k
4
Rekenen met gehele getallen
De basisoperaties van het rekenen op de basisschool zijn optellen, aftrekken,
vermenigvuldigen en delen. Deze operaties hebben niet alleen zin voor getallen, maar ook voor meer algemene objecten, zoals functies en in het bijzonder
veeltermen. Sommige eigenschappen zijn algemener geldig, andere gaan verloren bij meer algemene structuren. We beginnen dus met een preciezere
studie van de gehele getallen Z = {. . . , −2, −1, 0, 1, 2, 3, . . .}, en met name
het begrip deelbaarheid.
Laten a en b twee gehele getallen zijn. Als er een geheel getal q is zó dat
b q = a, dan noemen we b een deler van a. Dus 2 is een deler van 6, ook is
−3 een deler van 6. Elk getal is een deler van 0, in het bijzonder is 0 een
deler van 0, hoewel 0/ 0 niet gedefinieerd is!
12
Als b 6= 0 dan ligt q éénduidig vast en we zeggen dat q het quotiënt is van a
en b. We schrijven q = a/ b. In dit geval heet a een veelvoud van b.
Algemener hebben we voor elk tweetal gehele getallen de volgende stelling
(delen met rest):
Voor elk geheel getal a en elk positief geheel getal b bestaan er unieke gehele
getallen q en r, met 0 ≤ r < b, waarvoor geldt: a = q b + r.
Hoewel dit voor je gevoel misschien vanzelf spreekt, is er om dit te bewijzen
het principe van volledige inductie nodig. Dit principe wordt gebruikt in
vrijwel elke uitspraak over de natuurlijke getallen, dus het loont de moeite
om dit nog even uitgebreid te behandelen. Stel S is een deelverzameling van
de natuurlijke getallen met de eigenschap dat als s een element is van S, dan
is ook het volgende getal s + 1 een element van S. Hoe ziet S er dan uit? Het
kan natuurlijk dat S de lege verzameling is, maar zodra S een element bevat,
dan bevat hij ook een kleinste element, zeg k, en daarmee het volgende, het
volgende, het volgende enzovoort. Kortom S bestaat uit alle getallen groter
dan of gelijk aan k.
Het principe van inductie zegt dat als we een bepaalde eigenschap P kunnen
bewijzen voor zeker getal k ∈ N, en als we kunnen bewijzen dat wanneer
getal t ≥ k de eigenschap P heeft, dat dan ook de opvolger van t dus t + 1
eigenschap P heeft, dan geldt eigenschap P voor alle natuurlijke getallen
groter dan of gelijk aan k. Immers, de deelverzameling S van natuurlijke
getallen groter gelijk aan k waarvoor eigenschap P geldt bevat als kleinste
getal k, en heeft de eigenschap dat van elk getal in S ook de opvolger in S zit.
Meestal gebruiken we het principe van (volledige) inductie in de volgende
vorm. We willen een uitspraak bewijzen voor alle natuurlijke getallen. Voor
het getal 0 is het meestal eenvoudig na te gaan dat de uitspraak waar is. Dan
laten we zien dat als de uitspraak geldt voor alle getallen kleiner dan zeker
getal a, de uitspraak ook geldt voor het getal a. Op die manier is duidelijk
dat we de eigenschap ook weer kunnen bewijzen voor het getal a + 1, met
andere woorden, we zijn precies in de vorige situatie, en de uitspraak geldt
13
dus voor alle natuurlijke getallen.
In ons geval gaat het bewijs voor niet negatieve a nu als volgt: Als a = 0 dan
is a = 0 b + 0. Bekijk vervolgens a > 0 en stel nu dat we voor alle getallen a0
kleiner dan a al weten dat er een schrijfwijze is a0 = q b + r, met 0 ≤ r < b.
Als a < b dan kunnen we q = 0 en r = a nemen. Als b ≤ a dan a − b ≥ 0
en a − b is kleiner dan a. Dus we kunnen schrijven a − b = q 0 b + r en dus
a = q b + r met q = q 0 + 1. (Merk op dat we alleen hebben laten zien dat a
zo geschreven kan worden, nog niet dat deze schrijfwijze uniek is, maar dit
laten we aan de lezer over.)
Een andere belangrijke eigenschap van de gehele getallen is het bestaan van
een GGD (grootste gemene deler) en een KGV (kleinste gemene veelvoud).
Gemeen betekent hier natuurlijk gemeenschappelijk.
Het getal d heet een gemeenschappelijke deler van a en b als d zowel a als
b deelt. Voor een (positief) geheel getal a geven we met D(a) de verzameling positieve delers van a aan. Dus D(6) = {1, 2, 3, 6}. De gemeenschappelijke delers van a en b (of nog meer getallen) geven we aan met
D(a, b) = D(a) ∩ D(b). Het bestaan van een GGD betekent dat er een getal c
is waarvoor geldt dat D(a, b) = D(c). Met andere woorden: c is een deler van
a en b, en elke gemeenschappelijke deler van a en b is een deler van c. Voorbeeld: D(12, 18) = {1, 2, 3, 4, 6, 12} ∩ {1, 2, 3, 6, 9, 18} = {1, 2, 3, 6} = D(6).
Waarom is dit eigenlijk zo?
Beschouw D(a, b), we nemen voor het gemak a, b > 0. Elke gemeenschappelijke deler van a en b is tevens deler van getallen van de vorm k a + l b, dus
D(a, b) = D(a, b, a − b) = D(a, b, a − b, a − 2b) etc. Stel nu dat a groter is dan
b, dus a = q b + r als hierboven. Dan is dus D(a, b) = D(a, b, r) = D(b, r),
want r = a−q b en a = q b+r. Dit proces kunnen we herhalen, en de getallen
worden steeds kleiner. Het eindigt als r = 0, en daar D(c, 0) = D(c), immers,
elk getal is een deler van 0, vinden we dat D(a, b) = D(c) voor zeker getal c,
de GGD van a en b, soms, als verwarring uitgesloten is, eenvoudig genoteerd
als (a, b).
We hebben al gezien dat elke gemeenschappelijke deler van a en b ook elke
lineaire combinatie k a + l b deelt. Voor de GGD geldt de heel belangrijke
14
omkering van deze uitspraak:
Als (a, b) = c dan bestaan er getallen k en l zó dat c = k a + l b.
Deze getallen (k en l) kunnen worden gevonden met het (uitgebreide) algorithme van Euclides. Euclides is vooral bekend vanwege de ’Elementen’ een
meetkunde (leer)boek dat de wiskundige kennis uit de oudheid samenvatte,
en eeuwenlang op alle Europese scholen is onderwezen.
Een voorbeeld maakt duidelijk hoe het werkt: (verzin zelf een computerprogramma dat de nodige boekhouding doet). We bepalen de GGD van de
getallen 202 en 142, en vinden tegelijkertijd getallen k en l zó dat k 202 +
l 142 = 2 (de GGD).
202 − 142 =
142 − 2 · 60 =
60 − 2 · 22 =
22 − 16 =
16 − 2 · 6 =
6−4=
4−2·2=
202
142
60
22
16
6
4
2
0
=
1 · 202
=
=
1 · 202
= −2 · 202
=
5 · 202
= −7 · 202
=
19 · 202
= −26 · 202
=
71 · 202
−
+
−
+
−
+
−
1 · 142
1 · 142
3 · 142
7 · 142
10 · 142
27 · 142
37 · 142
101 · 142
Wat is hier gebeurt? Elke volgende regel ontstaat uit de vorige door een
deling met rest te maken, en dan de nieuwe rest rnieuw uit te drukken in de
oorspronkelijke getallen door de geschikte combinatie van de twee vorige rijen
te nemen.
We zien dus twee belangrijke eigenschappen van de GGD: Als c = (a, b) dan
is elke gemeenschappelijke deler van a en b ook een deler van c. En c is het
kleinste positieve getal van de vorm c = k a + l b (immers c is een deler van
elk getal van deze vorm).
Getallen paren a, b met GGD 1 heten relatief priem (of met een lelijk anglicisme ook wel copriem). Als a en b relatief priem zijn dan zijn er dus getallen
k en l met k a + l b = 1 (en omgekeerd).
15
We besluiten met een nuttig gevolg van deze eigenschap:
Als a en b relatief priem zijn, en a is een deler van b c, dan is a een deler van
c.
Immers: Laat k a + l b = 1. Dan c = 1 c = (k a + l b)c = k a c + l b c en we
zien dat a alle termen van het rechterlid deelt (en dus c).
We zijn nu in staat het volgende probleem op te lossen: Gegeven drie getallen
a, b en c, vind alle paren k, l zó dat k a + l b = c.
Omdat de GGD van a en b een deler is van k a + l b voor alle mogelijke
paren k, l is duidelijk dat we alleen oplossingen vinden in het geval dat c een
veelvoud is van de GGD (a, b). In dit geval kunnen we alles delen door deze
GGD, en dan vinden we de vergelijking k a0 + l b0 = c0 (waarbij ∗0 = ∗/(a, b))
en nu hebben a0 en b0 GGD 1. We laten nu verder de accenten weg. Omdat we k en l kunnen vinden met k a + l b = 1 kunnen we natuurlijk ook
een oplossing voor c vinden, gewoon door alles met c te vermenigvuldigen.
Verder kunnen we altijd nieuwe oplossingen vinden door bij k een veelvoud
van b op te tellen, en het corresponderende veelvoud van a van l af te trekken.
In feite tellen we er een oplossing van de vergelijking x a + y b = 0 bij op.
Maar omdat (a, b) = 1 moet in zo’n oplossing x een veelvoud van b zijn (want
b deelt x a en dus x want (a, b) = 1).
Voorbeeld: Vind alle oplossingen van k 12 + l 18 = 24. We delen door
de GGD en krijgen k 2 + l 3 = 4, met hetzij de voor de hand liggende
oplossing (k, l) = (2, 0) dan wel de systematische Euclidisch Algorithme
oplossing: (k, l) = (−4, 4). De algemene oplossing wordt nu gekregen door
(k, l) = (2 + 3 m, −2 m), of ook (k, l) = (−4 + 3 n, 4 − 2 n).
Een belangrijke rol in de getaltheorie, en zijn recente praktische toepassingen,
vormen de priemgetallen. Priemgetallen zijn getallen groter dan één die geen
andere delers hebben dan één en zichzelf. De priemgetallen onder de honderd
zijn
2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97.
Een algorithme uit de oudheid om een lijst van ‘alle’ priemgetallen te maken
staat bekend als de zeef van Erathostenes. We maken een tabel van de
16
getallen tot n2 voor zekere n, bijvoorbeeld n = 10. Het getal één strepen
we door. We zetten een cirkel om het volgende getal (dus twee) en strepen
alle tweevouden door. We zetten een cirkel om het volgende getal (dus drie)
en strepen alle drievouden door. We zetten een cirkel om het volgende getal
(dus vijf) en strepen alle vijfvouden door. Als we dit ook voor zeven gedaan
hebben zijn alle overgebleven getallen priem, want een niet priem onder de
honderd heeft een priemdeler kleiner dan tien. Om te beginnen twee en drie:
2
11
21
31
41
51
61
71
81
91
3
13
23
33
43
53
63
73
83
93
5
15
25
35
45
55
65
75
85
95
7
17
27
37
47
57
67
77
87
97
9
19
29
39
49
59
69
79
89
99
2
11
31
41
3
13
23
43
53
61
71
73
83
91
5
25
35
55
65
85
95
7
17
37
47
67
77
19
29
49
59
79
89
97
Dan vijf en zeven:
2
11
31
41
61
71
91
3
13
23
43
53
73
83
5
7
17
37
47
67
77
2
19
29
11
31
41
49
59
61
71
79
89
97
3
13
23
43
53
5
7
17
19
29
37
47
59
67
73
83
79
89
97
Een stelling die ook de naam van Euclides draagt is de uitspraak dat er
oneindig veel priemgetallen zijn. Stel je hebt een eindig lijstje van priemgetallen. Bijvoorbeeld {2, 3, 5, 7, 11, 13}. Neem het product van alle priemgetallen uit de lijst en tel er één bij op : 2 ∗ 3 ∗ 5 ∗ 7 ∗ 11 ∗ 13 + 1 = 30031. De
kleinste deler (groter dan één) van dit getal is natuurlijk priem (in dit geval
is dat 59), maar niet één van de getallen uit jouw lijst. Jouw lijst bevat dus
niet alle priemgetallen.
17
Er is natuurlijk inmiddels veel meer bekend over priemgetallen, maar er zijn
nog ook heel veel vragen onbeantwoord. Een belangrijke stelling, de Priemgetallenstelling vertelt hoeveel priemgetallen er ongeveer zijn. Naarmate een
getal groter is, is het natuurlijk onwaarschijnlijker dat het priem is, immers
het aantal mogelijke delers neemt telkens toe.
De stelling zegt dat het aantal priemgetallen kleiner dan het getal n ongeveer
gelijk is aan n/ log(n). Hierbij is log(n) de natuurlijke logarithme, soms
ook aangeduid met ln(n). Met de Mathematica functie PrimePi[n] kun je
het aantal priemen kleiner dan n opvragen, zo is bijvoorbeeld het aantal
priemen onder de 109 (volgens Mathematica) gelijk aan 50.847.534, terwijl
de schatting n/ log(n) de (afgeronde) waarde 48.254.942 geeft.
Een ‘elementair’ bewijs voor deze stelling werd gegeven door Pál (Paul)
Erdős, een beroemde Hongaarse wiskundige.
Vooral in de cryptografie (de wetenschap van het ‘geheimschrift’, toegepast
in ‘internet security’, het bankwezen, en natuurlijk defensie) wordt gebruik
gemaakt van grote priemgetallen. De ‘kans’ dat een getal met n (decimale)
cijfers priem is, is ongeveer één op 2n (preciezer: één op 2.30259n). Een snelle
manier om een grote priem te vinden is gewoon: schrijf een groot getal op
(van honderd cijfers) en test of het priem is. Doe dit een paar honderd keer
en vrijwel zeker heb je er een gevonden, vooral als je zo slim bent geweest
geen even getallen, of getallen die op een vijf eindigen op te schrijven. Ook
drievouden zijn eenvoudig te vermijden. Binnenkort zien we hoe je betrekkelijk snel kunt zien of een groot getal (hoogstwaarschijnlijk) priem is.
Voor een priemgetal p en een ander getal a zijn er maar twee mogelijkheden
voor de GGD, of het is één, of het is p, namelijk wanneer a een veelvoud
is van p. Hieruit volgt onmiddellijk de volgende belangrijke eigenschap: Als
een priemgetal p een deler is van a b dan is p een deler van a of van b (of
allebei natuurlijk). Hieruit volgt dan weer de meer algemene eigenschap dat
als p een deler is van a1 a2 . . . ak dan is p een deler van één van de factoren
a1 , a2 , . . . , ak . Een belangrijk gevolg van deze eigenschap is de uniciteit van
de priemontbinding van gehele getallen.
Elk positief geheel getal n kan geschreven worden als het product van priemge-
18
tallen. Deze schrijfwijze is uniek, op de volgorde van de factoren na. Dus
120 = 2 ∗ 2 ∗ 2 ∗ 3 ∗ 5 bijvoorbeeld.
Dat elk getal het product is van priemgetallen is duidelijk: Het getal 1
is misschien een beetje een raar voorbeeld, want 1 heeft geen priemdelers.
Wiskundigen zitten daar niet mee. Een product met nul factoren is per definitie één.
Elk getal groter dan één is hetzij priem, hetzij het product van twee kleinere
getallen, die (met inductie) geschreven kunnen worden als het product van
priemfactoren.
Nu nog de uniciteit. Stel n = p1 p2 . . . pk is een manier om n te schrijven als
product van priemen. Als p voorkomt in een manier om n als product van
priemen te schrijven dan is p natuurlijk een deler van n, dus van p1 p2 . . . pk .
Maar dat betekent dat een van de pi deelbaar is door p. Omdat ook pi priem
is is dus p gelijk aan pi . Maak het bewijs nu zelf af (inductie).
De (unieke) ontbinding in priemfactoren levert ook een andere manier om te
kijken naar de GGD en de (eigenlijk het) KGV van twee getallen. Als een
priem p een deler is van de getallen a en b dan is deze priem natuurlijk ook
een deler van de GGD. Preciezer, als pe de hoogste macht van p is die zowel
a als b deelt, dan deelt pe ook de GGD (en wel ‘precies’). Hieruit volgt dat
de GGD van a en b het product is van deze getallen. Voor het KGV vinden
we omgekeerd dat als pe de hoogste macht van de priem p is die voorkomt
in a dan wel b, en we nemen het product van deze getallen, dan hebben we
duidelijk een gemeenschappelijk veelvoud, en het is ook het kleinste gemeenschappelijke veelvoud, want voor elke priem p moet de exponent natuurlijk
tenminste gelijk zijn aan de exponent van p in de ontbinding van a en van b
om een veelvoud te kunnen zijn.
Uit bovenstaande beschouwingen volgt een nuttig verband tussen GGD en
KGV: Voor elk tweetal getallen a,b geldt: GGD ∗ KGV = a b. Immers, voor
elke priem geldt dat hij voorkomt in het product rechts met exponent de som
van zijn exponent in a en b, en links met de som van het minimum en het
maximum van zijn exponent in a en b, maar hoe je het ook wendt of keert,
daar komt hetzelfde uit.
19
Dit heeft als plezierige consequentie dat je om het KGV van twee getallen (a
en b) te weten te komen de getallen niet in factoren hoeft te ontbinden (dit
is namelijk een bekend ‘moeilijk’ probleem, hoewel er een snel algorithme
voor is dat helaas alleen werkt op zogenaamde ‘quantumcomputers’, die nog
even niet bestaan), maar kunt volstaan met het berekenen van de GGD (een
van de eenvoudigste algorithmen aller tijden), en vervolgens te gebruiken dat
KGV = a b/ GGD.
5
Modulo rekenen
In het vorige hoofdstuk hebben we gekeken naar het rekenen met gehele
getallen, in het bijzonder optellen, vermenigvuldigen, deelbaarheid, en ontbinding in priemfactoren. We gaan nu kijken naar afgeleide structuren. Als
kind hebben we misschien al gemerkt dat het product van twee even getallen
altijd even is, en de som van twee oneven getallen altijd even. Ook is het
product van twee oneven getallen altijd oneven. Even of oneven betekent
niets anders dan dat de rest bij deling door twee nul is, dan wel één. Ook
voor willekeurige getallen kunnen we op zo’n manier rekenen.
Laat n een natuurlijk getal zijn. De getallen a en b heten congruent modulo
n, als a en b bij deling door n dezelfde rest hebben. Notatie: a = b mod n.
Dus alle oneven getallen zijn congruent 1 modulo 2. Verder is bijvoorbeeld
13 = 7 mod 3. Een andere manier om te beschrijven dat a = b mod n is
dat n | a − b. Congruent zijn modulo n verdeelt de gehele getallen in n verschillende congruentieklassen. Namelijk de getallen die 0, 1, . . . , n − 1 zijn
modulo n. Het is duidelijk dat als we een getal dat a modulo n is optellen
bij een getal dat b modulo n is, de som gelijk is aan a + b mod n. Ook voor
het product van een getal dat a modulo n is met een getal dat b modulo n is
geldt dat het resultaat gelijk is aan ab modulo n.
Een voorbeeld: Stel a = 3 mod 7 en b = 4 mod 7. Dus a = 7q1 + 3 en
b = 7q2 + 4. Dan is ab = (7q1 + 3)(7q2 + 4) = 49q1 q2 + 28q1 + 21q2 + 12 =
7(7q1 q2 + 4q1 + 3q2 + 1) + 5 = 5 mod 7.
Op deze manier kunnen we met de getallen {0, 1, . . . , n − 1} optellen en
vermenigvuldigen (modulo n) op een manier die veel lijkt op optellen en vermenigvuldigen in Z. Dus a + b = b + a, a(b + c) = a b + a c etcetera. De rol
20
van 0 en 1 is ook hetzelfde. Ze zijn het neutrale element voor de optelling,
respectievelijk de vermenigvuldiging.
Een vroeger veelgebruikt hulpmiddel bij het controleren van berekeningen is
de zogenaamde negenproef. Deze berust op het feit dat als je de rest wilt
weten van een getal bij deling door 9, je gewoon de cijfers bij elkaar optelt,
van het resultaat weer, enzovoort, net zolang totdat je een getal onder de 10
krijgt. Dit getal is dan de rest bij deling door negen. Voorbeeld: Het getal
123456789 geeft na deling door negen een rest van 1 + 2 + . . . + 9 = 45 en
dus 4 + 5 = 9 (en dus 0).
Waarom is dit zo? Neem bijvoorbeeld het getal 123. De cijfers in dit getal
betekenen in werkelijkheid 123 = 1 · 100 + 2 · 10 + 3 · 1. Maar omdat 10 = 1
mod 9 en dus ook 100 = 10 · 10 = 1 mod 9 is dit getal 1 + 2 + 3 = 6 mod 9.
De negenproef kan (kon) gebruikt worden om een optelling van veel getallen
van veel cijfers snel te controleren. Van elk getal werd de rest modulo 9
bepaald met de negenproef, ook van de som, en tenslotte werd gecontroleerd
of de som van de resten de rest van de som was.
Minder bekend, maar op hetzelfde principe berustend, is een snelle manier om
de rest van een getal bij deling door elf te bepalen. We nemen weer het getal
123456789. Bij deling door 11 levert dit de rest 9−8+7−6+5−4+3−2+1 = 5.
Opnieuw is de verklaring dat opeenvolgende machten van 10 bij deling door
11 een rest hebben van 1, −1, 1, −1, . . ..
De structuur van de getallen {0, 1, . . . , n−1} met optellen en vermenigvuldigen
modulo n geven we aan met Z/nZ of meer vollediger (Z/nZ, +, ∗, 0, 1), om
aan te geven dat we een optelling hebben met neutraal element 0 en een
vermenigvuldiging met neutraal element 1.
Optellen en vermenigvuldigen in Z/nZ gedragen zich zoals verwacht. Iets
totaal anders is het met delen. In Z bestaan geen inverses, dat wil zeggen,
als a 6= ±1 dan is 1/a geen geheel getal. We zeggen dat b de (multiplicatieve)
inverse is van a in Z/nZ als geldt dat a b = 1 mod n. Dus bijvoorbeeld als
21
n = 10 dan is de inverse van 3 gelijk aan 7 omdat 3 ∗ 7 = 21 = 1 mod 10.
Wanneer bestaat zo’n inverse?
Als GGD(a, n) = 1, dan bestaan er getallen k en l zó dat k a + l n = 1. In
dit geval is dus k a = 1 mod n, want k a − 1 is deelbaar door n. Dus k is de
inverse van a (modulo n). Omgekeerd, als k de inverse is van a in Z/nZ, dan
is k a gelijk aan 1 modulo n, dus k a − 1 = l n voor zekere l, dus k a − l n = 1.
Maar dan is de GGD van a en n dus 1.
Een speciaal geval treedt op als n = p een priemgetal is. In dit geval geldt
voor elk getal k met 0 < k < p dat GGD(k, p) = 1, met andere woorden, elk
element ongelijk 0 in Z/pZ is inverteerbaar. In plaats van 1/k schrijven we
ook vaak k −1 .
We nemen bijvoorbeeld p = 7: 1 ∗ 1 = 2 ∗ 4 = 3 ∗ 5 = 6 ∗ 6 = 1. Of p = 13:
1 ∗ 1 = 2 ∗ 7 = 3 ∗ 9 = 4 ∗ 10 = 5 ∗ 8 = 6 ∗ 11 = 12 ∗ 12 = 1. Voor een niet
priemgetal als 15 vinden we alleen inverses voor getallen die niet door 3 of
5 deelbaar zijn: 1 ∗ 1 = 2 ∗ 8 = 4 ∗ 4 = 7 ∗ 13 = 11 ∗ 11 = 14 ∗ 14 = 1 mod
15. Merk op dat modulo 15 de vergelijking x2 − 1 = 0 vier oplossingen heeft,
terwijl deze vergelijking modulo een priemgetal altijd alleen maar de twee
oplossingen x = 1 en x = p − 1(= −1) heeft (waarom?). Het kan nog erger,
we zullen zo dadelijk zien dat er modulo 105 = 3 ∗ 5 ∗ 7 zelfs acht oplossingen
zijn (raad zelf hoeveel oplossingen er zijn modulo 1155 = 3 ∗ 5 ∗ 7 ∗ 11).
Met behulp van de inverse kunnen we het volgende type vergelijking oplossen
in de verzameling van de gehele getallen Z. Gegeven zijn getallen a, b en n
met GGD(a, n) = 1. Los op de vergelijking a x = b mod n. Dit type vergelijking heet ook wel een lineaire congruentie. Laat k de inverse zijn van a
modulo n. Dan is dus k a x = k b mod n. Omdat k a = 1 mod n volgt hieruit
dat x = k b mod n.
Voorbeeld, los op 5 x = 4 mod 7. De inverse van 5 mod 7 is 3 want
3 ∗ 5 = 15 = 1 mod 7. We vermenigvuldigen dus met 3 en vinden x = 12
mod 7, of te wel, x = 5 mod 7.
Meer algemeen kunnen we nu ook oplossen de vergelijking a x = b mod n,
met GGD(a, n) = c. We herhalen, de gegeven vergelijking vraagt naar alle
22
x zó dat n een deler is van a x − b. Omdat c een deler is van n en ook een
deler van a moet c noodzakelijk ook een deler zijn van b = a x − q n (hierbij is
q = (a x − b)/n). Als dit niet het geval is zijn er dus zeker geen oplossingen.
In het geval dat b wel deelbaar is door c, dan kunnen we schrijven a = c a1 ,
b = c b1 en n = c n1 , met GGD(a1 , n1 ) = 1. We zoeken alle x zó dat c n1
een deler is van c a1 x − c b1 . Maar dit is het zelfde als n1 is een deler van
a1 x − b1 , of te wel a1 x = b mod n1 . Dit lossen we op als voorheen en de
oplossing is x = k b mod n1 met k de inverse van a1 modulo n1 .
Voorbeeld, los op 21x = 43 mod 35. De GGD van 21 en 35 is 7. Omdat
7 geen deler is van 43 heeft deze vergelijking geen oplossingen (in Z). Los
op 21x = 28 mod 35. Nu is 28 deelbaar door 7 en de vergelijking is dus
equivalent met 3x = 4 mod 5. De inverse van 3 mod 5 is 2 want 2 ∗ 3 = 6 = 1
mod 5, en dus is de oplossing x = 8 mod 5, of liever x = 3 mod 5.
We kunnen ook iets anders naar het probleem hierboven kijken: Stel de vraag
is, los op de vergelijking 21x = 28 in Z/35Z. De oplossing die we vonden was
x = 3 mod 5. In onze nieuwe omgeving betekent dit dat de oplossingsverzameling gegeven wordt door {3, 8, 13, 18, 23, 28, 33}.
We gaan nu kijken naar stelsels van lineaire congruenties. We beginnen eenvoudig. Los op het paar vergelijkingen: x = 0 mod 2 en x = 0 mod 3. Dus
2 is een deler van x en 3 is een deler van x. Dit betekent dus gewoon dat
2 ∗ 3 = 6 een deler moet zijn van x. Meer algemeen: x = 0 mod a en x = 0
mod b heeft als oplossing x = 0 mod KGV(a, b), immers x is een veelvoud
van a en van b en dus van de KGV.
Voorbeeld: Los op x = 0 mod 21 en x = 0 mod 35. De KGV van 21 en 35 is
105, dus de oplossing is x = 0 mod 105.
Nu maken we het iets lastiger. We bekijken het paar: x = 3 mod 5 en x = 2
mod 7. Na enig proberen vinden we een oplossing x = 23. Laat y = x − 23.
Dan is dus y = 0 mod 5 en y = 0 mod 7. Deze vergelijking kunnen we al
aan: de oplossing is y = 0 mod 35. Dus van onze oorspronkelijke vergelijking
is de oplossing x = 23 mod 35.
23
Kunnen we de oplossing x = 23 ook systematisch vinden? Natuurlijk, dat
gaat als volgt: we lossen eerst de twee vergelijkingen afzonderlijk op: x = 3
mod 5 betekent x = 5k + 3 voor zekere k, en x = 2 mod l betekent x =
7l + 2 voor zekere l. Aangezien x = x krijgen we 5k + 3 = 7l + 2 of te wel
5k − 7l = −1, een oude bekende. Deze lossen we op, bijvoorbeeld met het
algoritme van Euclides, en we vinden k = 4 en l = 3, en dus x = 23. We
kunnen natuurlijk ook meteen het algemene antwoord vinden uit k = 4 + 7n
(en l = 3 + 5n), waaruit volgt dat x = 23 + 35n, of gewoon x = 23 mod 35.
Het bovenstaande laat zich uitbreiden tot grotere stelsels: Los op x = 0 mod
2, mod 3 en mod 5. Dus x is een gemeenschappelijk veelvoud van 2, 3 en
5 en dus van de KGV, in dit geval gewoon 2 ∗ 3 ∗ 5 = 30. Het moeilijkere
geval verloopt analoog: Los op x = 3 mod 5, x = 2 mod 7 en x = 2 mod 11.
We kunnen natuurlijk weer eerst wat proberen, en met genoeg geduld vinden
we dan de oplossing x = 233. Nemen we weer y = x − 233 dan zien we dat
y = 0 mod 5, 7 en 11 en dus y = 0 mod 385. We kunnen het stelsel ook in
stapjes oplossen. We bekijken eerst het paar x = 3 mod 5 en x = 2 mod
7. Dit hebben we hierboven al opgelost, en we vinden x = 23 mod 35. Dan
combineren we dit met x = 2 mod 11 en we lossen op 35k + 23 = 11l + 2, of
te wel 35k − 11l = −21. Omdat GGD(35, 11) = 1 kunnen we dit oplossen,
alweer met de uitgebreide Euclides.
Het is duidelijk dat we niet bij 3 vergelijkingen hoeven op te houden. In het
geval dat de moduli van de verschillende vergelijkingen onderling GGD één
hebben vinden we altijd een oplossing modulo het product van de moduli.
Dit is de inhoud van de Chinese reststelling:
Elk systeem van lineaire congruenties x = ai mod mi , i = 1, 2, . . . , k waarin
verschillende moduli mi GGD één hebben heeft een unieke oplossing modulo
m1 m2 · · · mk .
In het geval dat k = 2 hebben we gezien dat het waar is. Als k groter
is dan 2 dan kunnnen we het eerste paar vergelijkingen vervangen door één
equivalente vergelijking met modulus m1 m2 . We hebben nu dezelfde situatie,
met minder vergelijkingen. Het principe van volledige inductie maakt nu het
bewijs voor ons af.
Als toepassing kijken we hoeveel oplossingen de vergelijking x2 = 1 heeft
24
in Z/105Z. Volgens de Chinese reststelling is dit equivalent met de drie
simultane vergelijkingen: x2 = 1 mod 3, mod 5 en mod 7. Elk van deze
drie vergelijkingen heeft ‘twee’ oplossingen, namelijk x = 1 of −1 mod p,
waarbij p = 3, 5 of 7. Daar we elk van de mogelijkheden onafhankelijk van
elkaar kunnen combineren vinden we, door weer de Chinese reststelling toe
te passen in totaal 2 ∗ 2 ∗ 2 = 8 oplossingen modulo 105.
We besluiten dit hoofdstuk met wat opmerkingen over talstelsels en een
toepassing van het voorafgaande. Sinds ongeveer 1600 gebruiken we het
zogenaamde tientallig stelsel, of decimale stelsel om getallen te noteren. De
positie van het cijfer geeft de waarde aan. Dus 123,45 staat voor 1 ∗ 100 + 2 ∗
10 + 3 ∗ 1 + 4/10 + 5/100, of liever 1 ∗ 103 + 2 ∗ 102 + 3 ∗ 100 + 4 ∗ 10−1 + 5 ∗ 10−2 .
Misschien is hier een opmerking over de notatie van zogenaamde decimale
breuken op zijn plaats. De in de meeste continentaal Europese landen gangbare notatie is 1,5 voor anderhalf, dus met een komma. De Angelsaksische
landen gebruiken een punt, dus 1.5 en aangezien de wetenschappelijke literatuur van na de tweede wereldoorlog voornamelijk in de Engelse taal verschijnt, heeft daarmee ook de decimale punt het bijna overal van de komma
gewonnen.
Rekenen, en vooral vermenigvuldigen is veel eenvoudiger met deze notatie
dan bijvoorbeeld met romeinse cijfers, nog afgezien van het probleem om
getallen boven een miljoen überhaupt op te schrijven. Eigenlijk is het decimale stelsel niet het meest voor de hand liggende. De oude Babyloniërs
hadden een notatie die in wezen 60-tallig was. Dit vinden we nog terug in
de verdeling van een uur in 60 minuten, en een minuut in 60 seconden. Dit
stelsel heeft het voordeel dat relatief veel breuken met maar een of twee ‘sexigesimalen’ achter de komma te schrijven zijn (in termen van uren, minuten
en seconden: 1/2 = 300 , 1/3 = 200 , 1/4 = 150 , 1/5 = 120 , 1/6 = 100 , pas
bij 1/7 gaat het fout, maar 1/8 = 70 3000 , 1/9 = 60 4000 en 1/10 = 60 ). De
Maya’s in Zuid-Amerika gebruikten het twintigtallig stelsel, en in de computer worden getallen uiteindelijk gerepresenteerd in het tweetallig (of ook
wel binaire) stelsel. (Taalkundig raadsel, waarom is het tweetallig, en binaire,
respectievelijk decimale? Ik weet het niet.)
Voor een willekeurig geheel getal a > 0 kan elk positief geheel getal m
25
geschreven worden in de vorm m = mk ak + mk−1 ak−1 + · · · + m1 a + m0 . We
noteren m = (mk mk−1 . . . m1 m0 )a in het a-tallig stelsel. Dus de verschillende
schrijfwijzen van het getal 31 zijn: (31)10 , (34)9 , (37)8 , (44)7 , (51)6 , (111)5 ,
(133)4 , (1011)3 en (11111)2 .
Het bewijs dat dit zo is, en dat de representatie uniek is, is niet moeilijk.
Het laatste cijfer van m is de rest van m bij deling door a, deze ligt dus
vast. Wat er voor staat is de representatie in het a-tallig stelsel van het getal
(m − m0 )/a. Dit getal is kleiner dan m en heeft dus (inductie!) een unieke
representatie.
We besluiten met een praktische toepassing van wat we geleerd hebben.
De getaltheorie gold eeuwenlang als het voorbeeld van zuivere (dat is, niet
toegepaste) wiskunde. Het is ook moeilijk voor te stellen dat het ontbinden
in factoren van getallen van meer dan 10 cijfers in de praktijk ergens goed
voor is. In de laatste jaren is hier verandering in gekomen. De stroom van
communicatie over door iedereen af te luisteren kanalen, zoals telefoonlijnen
en alle draadloze varianten daarvan neemt explosief toe. Van veel van deze
berichten wil de verzender of de ontvanger liever niet dat iedereen ze mee
kan lezen. Een mogelijkheid zich tegen deze meelezerij te beschermen biedt
de cryptografie. De verzender codeert zijn bericht, niemand begrijpt er iets
van, de ontvanger is de enige die het kan decoderen.
Een populair systeem om dit in de praktijk te doen heet RSA, deze afkorting
komt van de namen van de bedenkers, Rivest, Shamir en Adleman, en berust
op de overtuiging dat niemand op de wereld in staat is om in een redelijke
tijd een getal van 200 cijfers in factoren te ontbinden (en als de computers
50 keer zo snel worden nemen we een getal van 300 cijfers).
Voordat we dit systeem gaan beschrijven, en uit kunnen leggen waarom het
werkt moeten we een paar belangrijke eigenschappen van machtverheffen en
modulo rekenen leren. Aan de basis van het systeem ligt de zogenaamde
kleine stelling van Fermat (een franse jurist uit de 17e eeuw, die tegelijkertijd de beste wiskundige, althans zeker getaltheoreticus, van zijn tijd was).
Laat p een priemgetal zijn, en a een getal dat niet deelbaar is door p (dus
GGD(a, p) = 1). Dan geldt dat ap−1 = 1 mod p.
26
Bijvoorbeeld 26 = 64 = 1 mod 7, en 34 = 81 = 1 mod 5. Anderzijds is
bijvoorbeeld 25 = 32 = 2 mod 6, zodat we zien dat 6 geen priemgetal is.
Voor een middelmatig groot getal n, dus van 100 cijfers of zo, is het (met een
computer) zeer eenvoudig om 2n−1 mod n uit te rekenen. Zo kun je er zeker
van zijn dat n niet priem is, als de uitkomst geen één is, en betrekkelijk zeker
(99, 9999%, ik zeg maar wat) dat n wel priem is, als er één uitkomt. Goed
genoeg voor de praktijk.
Nemen we nu eens een getal n dat het product is van twee verschillende
priemgetallen, n = p q. Met behulp van de kleine stelling van Fermat, en de
Chinese reststelling kunnen we nu inzien dat er geldt: a(p−1)(q−1) = 1 mod n.
Immers, ap−1 en dus ook a(p−1)(q−1) is 1 mod p. En, herhalen kan geen kwaad,
aq−1 en dus ook a(q−1)(p−1) is 1 mod q. Omdat p en q onderling ondeelbaar
zijn volgt nu dat dit getal één is modulo p q = n.
Een voorbeeld, 21 = 3∗7. We berekenen 22∗6 = 212 = 4096 = 21∗195+1 = 1
mod 21.
Nu gaan we berichten versturen. Jan wil Marietje per email mededelen dat
hij haar erg aardig vindt. Hij verzendt dus het bericht: ‘Ik zie je graag’. Om
te beginnen codeert hij dat tot een getal:
m = 1 09 11 00 26 09 05 00 10 05 00 07 18 01 01 07
(de spaties tellen niet mee, de één aan het begin is om te zorgen dat het
getal niet met een nul begint). Dit is een voorbeeld van een zogenaamde
substitutie code, elke letter (of spatie, leesteken, etc.) wordt vervangen door
een cijfercombinatie. In dit geval een nogal voor de hand liggende, a = 01,
z = 26, een geı̈nteresseerde meelezer zal zeker niet veel moeite hebben dit
bericht te ontcijferen.
Maar Jan is slim, hij heeft namelijk wiskunde 1 voor informatici gevolgd. Jan
verstuurt niet zomaar zijn getal, nee hij berekent m127 mod n en verstuurt
dat.
Het getal n is het geheim van het succes. Marietje heeft ooit in het verleden
twee grote priemgetallen p en q gemaakt, en al haar vriendjes het product
n verteld. Als Marietje nu een gecodeerd bericht ontvangt, dan doet ze het
27
volgende. Ze neemt het bericht, waarvan ze weet dat het de vorm m127 mod
n heeft. Omdat ze de Chinese reststelling kent, kan ze het paar vergelijkingen
127 x = 1 mod (p−1) en 127 x = 1 mod (q−1) oplossen. Met een beetje extra
moeite vindt ze nu een x waarvoor geldt dat 127 x = 1 mod (p−1)(q −1). Dit
hoeft ze natuurlijk maar één keer in haar leven te doen. Ze kan natuurlijk
ook gewoon 127 x = 1 mod (p − 1)(q − 1) oplossen met het (uitgebreide) algoritme van Euclides. Ze neemt nu het bericht m127 mod n(= p q) en verheft
dit tot de macht x. Het resultaat is m127 x = miets∗(p−1)(q−1)+1 = 1 ∗ m = m
mod n. Maar aangezien m veel kleiner is dan n is dit gewoon m en Marietje
weet dat Jan haar aardig vindt.
Marietje moet een klein beetje voorzichtig zijn met haar priemgetallen om
dit te laten werken, kan de lezer bedenken wanneer er een probleem ontstaat?
Nu bekijken we de positie van de meelezer. Hij ziet een groot getal langskomen,
en hij kent ook het getal n, want alle vriendjes van Marietje kennen het getal
n. Om het bericht m te weten te komen moet hij de geheime exponent
(p − 1)(q − 1) weten. Maar dat kan alleen als hij p en q zou kunnen uitrekenen, immers als hij zowel n = p q en (p − 1)(q − 1) = p q − p − q + 1 zou
weten kent hij van twee getallen p en q de som en het product, en dat is
voldoende om de getallen p en q uit te rekenen. Maar dat betekent dat hij
n in factoren kan ontbinden, en het uitgangspunt was dat dit niet binnen
redelijke tijd gedaan kan worden. Dus Marietje is veilig.
28
Download