Projectieve Vlakken en Codes 1. De Fanocode Foutdetecterende en foutverbeterende codes. Anna en Bart doen mee aan een spelprogramma voor koppels. De ene helft van de deelnemers krijgt elk een kaart waarop een schat aangegeven is die hun partner moet vinden. De bedoeling is dat deze deelnemers het traject dat hun partner moet afleggen met een zaklamp doorseinen. Anna en Bart willen de richtingen Noord, Oost, Zuid en West kunnen doorseinen. Ze hebben dus 4 verschillende combinaties van korte en lange flitsen nodig, en spreken het volgende af: Noord =00, Oost =01, Zuid =10, West =11. Waarbij 0 voor een korte flits staat, en 1 voor een lange flits (deze symbolen noemen we voortaan bits, en elke combinatie van bits noemen we een woord). Bij elke doorgeseinde boodschap zal Bart honderd meter in die richting stappen. Zelfs als Anna geen enkele fout maakt in het doorseinen van de juiste richting, zal het voor Bart moeilijk zijn om de juiste weg te vinden. Als hij immers één keer verkeerd inschat of deflits lang of kort was, gaat hij de verkeerde kant op. Cindy en David besluiten per richting 3 lichtflitsen te gebruiken. Ze zeggen: Noord =000, Oost =011, Zuid =101, West =110. 1
Ga na dat als David één lichtflits verkeerd inschat, hij kan merken dat hij de boodschap fout interpreteerde. De vier woorden 000, 011, 101, 110 noemen we de codewoorden van onze code. Omdat David één fout kan ontdekken, noemen we deze code 1-fout detecterend. Het zou natuurlijk nog handiger zijn wanneer David niet alleen zou merken dateriets fout doorgestuurd is, maar die fout ook kon verbeteren. Hij zou kunnen kijken welk van de codewoorden het meest op het ontvangen codewoord lijkt dit wil zeggen, er in de meeste posities mee overeenstemt en aannemen dat Cindy dat codewoord geflitst had. Zo een code zullen we 1-fout verbeterend noemen. Stel dat David drie lange lichtflitsen ziet, dan weet hij dat er iets fout is, en dat Cindy waarschijnlijk Oost, Zuid of West doorgeseind heeft. Maar die drie mogelijkheden zijn even waarschijnlijk. Cindy zal dus nog meer flitsen moeten gebruiken als er bij het optreden van één fout slechts één codewoord mag zijn dat Cindy het meest waarschijnlijk gestuurd had. Ze hebben dus langere codewoorden nodig. Een eenvoudig trucje is gewoon elk codewoord verdubbelen. Op die manier krijgen we de codewoorden 000000, 011011, 101101, 110110. Ga zelf eens na dat deze code inderdaad 1-fout verbeterend is, en zelfs 3-fout detecterend! Maar nu zijn de codewoorden wel erg lang. Misschien kunnen we met ongeveer even lange codewoorden ook 1 fout verbeteren, en bovendien meer richtingen doorsturen? Inderdaad, de aanwijzingen zijn niet erg precies, Cindy zou graag ook tussenwindrichtingen kunnen doorsturen, b.v. Noord-Noordwest. Een code die aan deze eisen (16 codewoorden, 1-fout verbeterend en niet veel langer dan 6 bits) zal voldoen is de volgende. 0000000 1111111 1101000 0010111 0110100 1001011 0011010 1100101 0001101 1110010 1000110 0111001 0100011 1011100 1010001 0101110 De codewoorden bestaan alle uit zeven bits, die de waarde 0 of 1 kunnen aannemen. Het aantal bits van een woord noemen we zijn lengte. 2
We analyseren nu eens de bovenstaande code, die we voortaan de Fanocode zullen noemen. Analyse van de Fanocode. Buiten het codewoord bestaande uit 7 nullen (dus 0000000), en het codewoord bestaande uit zeven keer één (dus 1111111), komen de overige codewoorden duidelijk in twee verschillende groepen voor. Er zijn zeven codewoorden met drie enen en zeven codewoorden met vier enen. Het aantal bits verschillend van nul in een codewoord noemen we het gewicht van dat codewoord. In ons geval is het gewicht natuurlijk ook gewoon gelijk aan het aantal enen. Laat ons eens de eerste groep bekijken, met andere woorden, de codewoorden van gewicht drie. Het codewoord 0110100 verkrijgt men door elke bit van het codewoord 1101000 één positie naar rechts op te schuiven, waarbij we afspreken dat de laatste bit naar de eerste plaats verhuist: 1101000 0110100 We kunnen deze operatie ook op een willekeurig ander codewoord toepassen: φ := x 1 x 2 x 3 x 4 x 5 x 6 x 7 x 7 x 1 x 2 x 3 x 4 x 5 x 6. φ 1 2 3 4 5 6 7 7 1 2 3 4 5 6 We noemen φ een cyclische permutatie van het woord x 1 x 2 x 3 x 4 x 5 x 6 x 7. Kan je nagaan dat we elk codewoord d van gewicht drie kunnen vinden door enkele achtereenvolgende cyclische permutaties te doen van 1101000? Hetzelfde geldt voor de codewoorden van gewicht vier: elk dergelijk codewoord kan verkregen worden uit elk ander dergelijk codewoord door cyclische permutaties. Ga dit ook na! Een code met de eigenschap dat de cyclische permutatie van elk codewoord opnieuw een codewoord is, noemen we een cyclische code. Het is niet moeilijk om alle codewoorden van een cyclische code te onthouden: Je hoeft er slechts enkele te onthouden, en dan achtereenvolgende cyclische permutaties toe te passen om de andere te vinden. Hoeveel codewoorden dien je zo te onthouden voor de bovenstaande code? 3
2. Grafische voorstelling van de Fanocode Andere voorstellingen van de Fanocode. We keren terug naar onze codewoorden van gewicht drie in de Fanocode. We gaan eens een codewoord op een andere manier schrijven, want in wezen was de notatie x 1 x 2 x 3 x 4 x 5 x 6 x 7 toch maar louter een afspraak. Een andere manier is bijvoorbeeld door de rangnummers van de enen in elk codewoord op te schrijven. Zo schrijven we {1, 2, 4} in plaats van 1101000. Op die manier krijgen we de volgende zeven verzamelingen die overeenkomen met de zeven codewoorden van gewicht drie. {1, 2, 4} {2, 3, 5} {3, 4, 6} {4, 5, 7} {1, 5, 6} {2, 6, 7} {1, 3, 7} De interpretatie van de permutatie φ in deze notatie is eenvoudig: tel bij elk getal één op met de afspraak dat elk veelvoud van 7 gelijk is aan nul. Dus na 7 komt 1 terug, net zoals na zondag de zevende dag weerom maandag komt de eerste dag van de week. We zeggen in dit geval dat we rekenen modulo 7. Bijvoorbeeld, als we bij elk getal in {1, 3, 7} één optellen, dan vinden we {2, 4, 8}. Maar 8 modulo 7 is gelijk aan 1. Bijgevolg verkrijgen we {2, 4, 1}, onze eerste verzameling hierboven. Modulorekenen is een belangrijk begrip bij discrete (of eindige) wiskunde. We gaan daar straks wat dieperer opin. We hebben dus met elk codewoord van gewicht drie een deelverzameling van {1, 2, 3, 4, 5, 6, 7} geassocieerd met drie elementen. We kunnen dat nu proberen grafisch voor te stellen. In onze gedachten nemen we bijvoorbeeld zeven bomen, genummerd van 1 tot 7, en we proberen elk drietal bomen waarvoor de nummers overeenkomen met een codewoord op één rechte lijn te plaatsen. Probeer dit even zelf te tekenen. Na enkele vergeefse pogingen vermoeden we dat het niet zal lukken. Kunnen we dat ook bewijzen? Daarvoor kiezen we boom 1 in de oorsprong o, boom 3 in het punt e 1 (1, 0), boom 4 in het punt e 2 (0, 1) en boom 5 in het punt e(a, b), met a 0,b 0ena + b 1. Bereken nu zelf achtereenvolgens de coördinaten van de bomen 2 (als snijpunt van de rechten oe 2 en e 1 e), 6 (snijpunt van oe met e 1 e 2 ) en 7 (snijpunt van oe 1 en e 2 e). Bewijs nu dat deze punten niet op een gemeenschappelijke rechte liggen. 4
Bijgevolg kunnen we geen grafische voorstelling vinden van onze code waarin elk punt een bepaalde bit voorstelt, en bits die de enen vormen van een codewoord op één lijn liggen. We kunnen dit wel bijna bereiken, door de punten behorende bij één codewoord op een andere kromme te leggen op onderstaand figuur hebben we wegens esthetische redenen een cirkel genomen. Op die figuur hebben we ook de deelverzamelingen die corresponderen met onze codewoorden van gewicht drie met L 1,L 2,...,L 7 aangeduid. Deze meetkundige structuur noemen we voortaan het Fanovlak. Figuur 1: Het Fanovlak Kan je dezelfde oefening proberen oplossen voor een verzameling van acht bomen, genummerd van 1 tot 8, en waarvoor de acht drietallen {1, 2, 4}, {2, 3, 5},...,{8, 1, 3} (reken modulo 8) rijtjes moeten vormen? Is dit mogelijk? En het gelijkaardige geval voor negen bomen? Kan je de volgende negen bomen op 9 rechte lijnen van telkens 3 bomen plaatsen? 5
Modulorekenen en bankrekeningnummers. We komen nu terug op het modulorekenen. Eén van de plaatsen waar dit voorkomt is in bankrekeningnummers. In feite is een bankrekeningnummer ook een code. Zo een nummer bestaat uit 12 cijfers, maar niet alle cijfercombinaties zijn mogelijk. Inderdaad, de laatste twee cijfers vormen de rest bij deling door 97 van het getal gevormd door de eerste 10 cijfers. Anders gezegd: het getal gevormd door de eerste tien cijfers, modulo 97 genomen, is gelijk aan het getal gevormd door de twee laatste cijfers. Dat kan je eenvoudig nagaan bij bankrekeningnummers met veel nullen, zoals dit van Artsen Zonder Grenzen: 000-0000060-60. Deze code is 1-fout detecterend (kan je dat inzien en aantonen?), maar niet 2-fout detecterend (bijvoorbeeld 000-0000100-03 en 000-0000197-03 zijn beide correcte bankrekeningnummers). Ze is ook niet 1-fout verbeterend, hoewel we in vele gevallen wel 1 foutje kunnen verbeteren, als we geluk hebben. Voorbeeld: Stel dat we het rekeningnummer 000-0000059-60 krijgen. Er is duidelijk iets fout. Indien we aannemen dat er slechts één cijfer fout is doorgegeven, dan kunnen we zeker niets veranderen in de laatste vier cijfers (van 59 mogen we geen 60 maken en omgekeerd, want dan zouden we twee fouten verbeteren). We moeten dus een 0 veranderen in een ander cijfer op zodanige manier dat dit 1 modulo 97 toevoegt aan het getal bestaande uit de eerste tien cijfers. Als we bijvoorbeeld 0 veranderen in 1 in de achtste positie, dan voegen we 100 modulo 97 toe, en dat is dus 3. Dit is niet goed, want dan zou er 59+3=62 moeten staan in de laatste twee posities. Zo kunnen we de achtste 0 ook niet veranderen in gelijk welk ander cijfer. Ook de zevende 0 vervangen lukt niet, want schrijven we i in plaats van 0 in de zevende positie, dan moet 60 gelijk zijn aan 1000i + 59 modulo 97. Maar voor i =1, 2, 3, 4, 5, 6, 7, 8, 9 is dit respectievelijk gelijk aan 89, 22, 52, 82, 15, 45, 75, 8 en 38. Zo voortgaande (doe dit!) kan je zien dat we alleen de tweede 0 door een 6 kunnen vervangen. Het juiste rekeningnummer is dus 060-0000059-60. In het rekeningnummer 000-1234567-74 is één fout geslopen. Kan je het juiste nummer terugvinden? 6
3. Axioma s en eigenschappen van projectieve vlakken Axioma s en orde van een projectief vlak. We bekijken opnieuw de voorstelling van het Fanovlak: De verzamelingen L 1,,L 7 zullen we rechten noemen (deze hebben niets te maken met de rechten van het Euclidisch vlak!). Op deze figuur tellen we 7 punten en 7 rechten. Bovendien voldoet de structuur aan de volgende axioma s: (A1) door elke twee verschillende punten gaat juist één rechte; (A2) elke twee verschillende rechten hebben juist één punt gemeen; (A3) er bestaan vier punten waarvan er geen drie op een rechte liggen (er bestaat een vierhoek). Een structuur van punten en rechten, waarbij rechten zekere deelverzamelingen van punten zijn, die aan deze eigenschappen voldoet noemt men een projectief vlak. Codes hoeven maar eindig veel codewoorden te hebben, dus beschouwen wij verder enkel eindige projectieve vlakken, d.i. met een eindig aantal punten en een eindig aantal rechten. Beschouw een willekeurig projectief vlak. Neem een rechte L en een punt p buiten die rechte. Kan je aantonen dat er op L evenveel punten liggen als er rechten gaan door p? Stel dit aantal gelijk aan n + 1. Kan je nu bewijzen dat er op elke rechte juist n +1 punten liggen, en door elk punt juist n + 1 rechten gaan? Het getal n noemt men de orde van het projectief vlak. Bovenstaande figuur is dus een voorstelling van een projectief vlak van de orde 2. Er liggen drie punten op elke rechte en elk punt ligt op drie rechten. 7
In een projectief vlak van orde n zijn er evenveel rechten als punten, nl. n 2 + n +1. Kan je dit aantonen? Probeer eens een projectief vlak van orde 3 te tekenen met de volgende 3 2 +3+1=13 punten. Bestaan van projectieve vlakken van zekere orde. We proberen nu na te gaan of er voor elke n>1 een projectief vlak van de orde n bestaat. Veronderstel dat we een projectief vlak van de orde n hebben, en we nemen als voorbeeld n = 3. We veronderstellen ook dat n strikt groter is dan 2. We kiezen twee punten in dat vlak, en noemen die x en y. De rechte xy die x en y bevat noteren we door L. We kunnen nu de punten van ons vlak die niet tot L behoren voorstellen in een n n vierkantige formatie, waarbij de (horizontale) rijen gevormd worden door de rechten die x bevatten (uitgezonderd L) en de (verticale) kolommen door de rechten die y bevatten (uitgezonderd L). Voor n = 3 verkrijgen we dus de volgende formatie: 8
Neem nu een willekeurig punt z van de rechte L, maar zorg ervoor dat x z y. Er zijn precies n rechten door z die verschillend zijn van L. We geven elke dergelijke rechte een naam, bijvoorbeeld een Latijnse letter. Voorn = 3 nemen we A, B, C. Als we bij elk punt van onze 3 3 formatie schrijven welk van de drie rechten A, B, C er door gaat, dan verkrijgen we een vierkant waarbij op elke rij elke letter A, B, C juist eenmaal voorkomt, en hetzelfde voor elke kolom. Dergelijk vierkant noemen we een Latijns vierkant. We doen nu hetzelfde voor een vierde punt z op de rechte L, enwezorgenervoordatz verschillend is van x, y, z. Deze keer benoemen we de n rechten door z verschillend van L met Griekse letters. Voor n = 3 nemen we bijvoorbeeld α, β, γ. We verkrijgen opnieuw een vierkant waarbij op elke rij elke letter α, β, γ juist eenmaal voorkomt, en hetzelfde voor elke kolom. We schuiven nu die twee vierkanten over elkaar. Op elke plaats schrijven we de bijhorende Griekse en Latijnse letters als een koppel. Bijvoorbeeld, als een punt de Griekse letter β heeft en de Latijnse letter C, dan schrijven we (β,c). Zo verkrijgen we een n n formatie met de volgende eigenschappen. (i) Aan elk punt van de formatie is een koppel gehecht bestaande uit een Griekse letter en een Latijnse letter. (ii) In elke rij en elke kolom komt elke Griekse en elke Latijnse letter juist eenmaal voor. (iii) Elk koppel bestaande uit een Griekse en een Latijnse letter komt juist eenmaal voor! Inderdaad, dit laatste volgt uit Axioma (A2), dat zegt dat twee rechten juist één snijpunt hebben! Dergelijke vierkantige formatie noemen we een Grieks-Latijns vierkant. Voor n = 3 vinden we bijvoorbeeld: 9