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