Algoritmes in ons dagelijks leven Leve de Wiskunde! 7 April 2017 Jacobien Carstens Wat is een algoritme? “Een algoritme is een eindige reeks instructies die vanuit een gegeven begintoestand naar een beoogd doel leidt.” (Wikipedia) Algoritmes in ons dagelijks leven 1. Routes plannen. 2. Berichten beveiligen. 3. Websites sorteren. Routes plannen Eindpunt Beginpunt Eindpunt Beginpunt Graaf ! = (%, ')met % een verzameling knopen en ' een verzameling van lijnen. % = ), *, … , , '= ), * , ), - , … , ., , Beginpunt Eindpunt Graaf ! = (%, ')met % een verzameling knopen en ' een verzameling van lijnen. % = ), *, … , , '= ), * , ), - , … , ., , ,: ' → ℝ Beginpunt Het plannen van een route op een wegennetwerk wordt wiskundig beschreven door het vinden van het kortste pad tussen twee knopen. Eindpunt Het kortste-pad algoritme van Dijkstra Edsger Wybe Dijkstra (1930-2002) Bedacht een kortste-pad algoritme als demonstratie voor de ARMAC computer in 1956. Het kortste-pad algoritme van Dijkstra 1. Geef alle knopen een voorlopige afstand tot het beginpunt. Het kortste-pad algoritme van Dijkstra 1. Geef alle knopen een voorlopige afstand tot het beginpunt. 2. Markeer alle knopen als ’onbezocht’. Het kortste-pad algoritme van Dijkstra 1. Geef alle knopen een voorlopige afstand tot het beginpunt. 2. Markeer alle knopen als ’onbezocht’. 3. Herhaal de volgende stappen: 1. Selecteer een onbezochte knoop met de laagste voorlopige afstand. Het kortste-pad algoritme van Dijkstra 1. Geef alle knopen een voorlopige afstand tot het beginpunt. 2. Markeer alle knopen als ’onbezocht’. 3. Herhaal de volgende stappen: 1. Selecteer een onbezochte knoop met de laagste voorlopige afstand. 2. Bereken de voorlopige afstand voor de onbezochte buren van deze knoop. Het kortste-pad algoritme van Dijkstra 1. Geef alle knopen een voorlopige afstand tot het beginpunt. 2. Markeer alle knopen als ’onbezocht’. 3. Herhaal de volgende stappen: 1. 2. 3. Selecteer een onbezochte knoop met de laagste voorlopige afstand. Bereken de voorlopige afstand voor de onbezochte buren van deze knoop. Markeer de huidige knoop als ‘bezocht’. 4. Stop zodra het eindpunt de knoop met de laagste voorlopige afstand is of de laagste afstand tot onbezochte knoop oneindig is. Het kortste-pad algoritme van Dijkstra 1. Geef alle knopen een voorlopige afstand tot het beginpunt. 2. Markeer alle knopen als ’onbezocht’. 3. Herhaal de volgende stappen: 1. 2. 3. Selecteer een onbezochte knoop met de laagste voorlopige afstand. Bereken de voorlopige afstand voor de onbezochte buren van deze knoop. Markeer de huidige knoop als ‘bezocht’. 4. Stop zodra het eindpunt de knoop met de laagste voorlopige afstand is of de laagste afstand tot onbezochte knoop oneindig is. Het kortste-pad algoritme van Dijkstra 1. Geef alle knopen een voorlopige afstand tot het beginpunt. 2. Markeer alle knopen als ’onbezocht’. 3. Herhaal de volgende stappen: 1. 2. 3. Selecteer een onbezochte knoop met de laagste voorlopige afstand. Bereken de voorlopige afstand voor de onbezochte buren van deze knoop. Markeer de huidige knoop als ‘bezocht’. 4. Stop zodra het eindpunt de knoop met de laagste voorlopige afstand is of de laagste afstand tot onbezochte knoop oneindig is. Het kortste-pad algoritme van Dijkstra 1. Geef alle knopen een voorlopige afstand tot het beginpunt. 2. Markeer alle knopen als ’onbezocht’. 3. Herhaal de volgende stappen: 1. 2. 3. Selecteer een onbezochte knoop met de laagste voorlopige afstand. Bereken de voorlopige afstand voor de onbezochte buren van deze knoop. Markeer de huidige knoop als ‘bezocht’. 4. Stop zodra het eindpunt de knoop met de laagste voorlopige afstand is of de laagste afstand tot onbezochte knoop oneindig is. Het kortste-pad algoritme van Dijkstra 1. Geef alle knopen een voorlopige afstand tot het beginpunt. 2. Markeer alle knopen als ’onbezocht’. 3. Herhaal de volgende stappen: 1. 2. 3. Selecteer een onbezochte knoop met de laagste voorlopige afstand. Bereken de voorlopige afstand voor de onbezochte buren van deze knoop. Markeer de huidige knoop als ‘bezocht’. 4. Stop zodra het eindpunt de knoop met de laagste voorlopige afstand is of de laagste afstand tot onbezochte knoop oneindig is. Het kortste-pad algoritme van Dijkstra 1. Geef alle knopen een voorlopige afstand tot het beginpunt. 2. Markeer alle knopen als ’onbezocht’. 3. Herhaal de volgende stappen: 1. 2. 3. Selecteer een onbezochte knoop met de laagste voorlopige afstand. Bereken de voorlopige afstand voor de onbezochte buren van deze knoop. Markeer de huidige knoop als ‘bezocht’. 4. Stop zodra het eindpunt de knoop met de laagste voorlopige afstand is of de laagste afstand tot onbezochte knoop oneindig is. Het kortste-pad algoritme van Dijkstra 1. Geef alle knopen een voorlopige afstand tot het beginpunt. 2. Markeer alle knopen als ’onbezocht’. 3. Herhaal de volgende stappen: 1. 2. 3. Selecteer een onbezochte knoop met de laagste voorlopige afstand. Bereken de voorlopige afstand voor de onbezochte buren van deze knoop. Markeer de huidige knoop als ‘bezocht’. 4. Stop zodra het eindpunt de knoop met de laagste voorlopige afstand is of de laagste afstand tot onbezochte knoop oneindig is. Het kortste-pad algoritme van Dijkstra 1. Geef alle knopen een voorlopige afstand tot het beginpunt. 2. Markeer alle knopen als ’onbezocht’. 3. Herhaal de volgende stappen: 1. 2. 3. Selecteer een onbezochte knoop met de laagste voorlopige afstand. Bereken de voorlopige afstand voor de onbezochte buren van deze knoop. Markeer de huidige knoop als ‘bezocht’. 4. Stop zodra het eindpunt de knoop met de laagste voorlopige afstand is of de laagste afstand tot onbezochte knoop oneindig is. Wiskundige vragen Vind dit algoritme altijd het kortste pad? Complexiteit: hoeveel stappen zijn nodig om het algoritme af te ronden? Heeft de structuur van een netwerk impact op de efficiëntie van het algoritme? Het algoritme van Dijkstra in de praktijk Het algoritme van Dijkstra in de praktijk Het algoritme van Dijkstra is niet snel genoeg voor grote verkeersnetwerken. Verbeteringen: - tegelijkertijd zoeken vanaf beginpunt en eindpunt - A* algoritme, pas het gewicht van de wegen aan In 2008 werd een algoritme geïntroduceerd dat meer dan 3 miljoen keer sneller is dan het algoritme van Dijkstra. C (a) In welke volgorde worden de knopen van de hiernaast getoond graaf bezocht door het kortste-pad algoritme van Dijkstra met beginpunt B en eindpunt F? (b) Als het eindpunt G is, welke afstand vind het algoritme van Dijkstra voor alle overige knopen als beginpunt? B A 1 2 1 G E 2 4 D 2 2 H Het korste-pad algoritme van Dijkstra 1. Geef alle knopen een voorlopige afstand tot het beginpunt. 2. Markeer alle knopen als ’onbezocht’. 3. Herhaal de volgende stappen: 1. Selecteer een onbezochte knoop met de laagste voorlopige afstand. 2. Bereken de voorlopige afstand voor de onbezochte buren van deze knoop. 3. Markeer de huidige knoop als ‘bezocht’. 4. Stop zodra het eindpunt de knoop met de laagste voorlopige afstand is of de laagste afstand tot onbezochte knoop oneindig is. F Berichten beveiligen Cryptografie Privacy is een belangrijk doel binnen de cryptografie. Als een bericht wordt verstuurd over een publiek kanaal, hoe kan worden voorkomen dat de inhoud van het bericht wordt afgeluisterd? Bericht M Encoderen *4$%(2080$^ 9#3/4)67%$ *4$%(2080$^ 9#3/4)67%$ A(Alice) Decoderen Bericht M B(Bob) Publiek kanaal Voorbeeld: Ceasarcijfer Hallo A B C D E F ... A B C D E F ... A B C D E F ... A B C D E F ... E (Encoderen) D (Decoderen) E Kdoor Kdoor D Hallo B (Bob) A (Alice) Publiek kanaal Nadelen Ceasarcijfer * Simpel te kraken als er genoeg tekst wordt verstuurd Nadelen Ceasarcijfer * Alice en Bob hebben van te voren een veilig kanaal nodig om af te spreken hoe ze berichten gaan encoderen en decoderen. Alice stuur D via privé kanaal E j13K&(H4#fv aj&*201nH8( ^SnH 6%4bCG9 Bob D publiek kanaal j13K&(H4#fv aj&*201nH8( ^SnH 6%4bCG9 Private key cryptografie Alice stuurt Bob eerst via een privé kanaal een geheime sleutel K. Encoderen / decoderen gebruiken beiden sleutel K. Voorbeeld: K = {3, 4, 5, 4, 2} EK(M) verschuif letter i met K[i] plaatsen vooruit in het alfabet. DK(M) verschuif letter i met K[i] plaatsen achteruit in het alfabet. Hallo Encoderen EK(M) Afzender Alice Keqqq Keqq Publiek kanaal Decoderen DK(EK(M))=M Ontvanger Bob Hallo Public Key Cryptografie 1977 Bob maakt twee sleutels, één geheime sleutel D die hij met niemand deelt en een publieke sleutel E. Alice publiek kanaal Alice vraagt E aan Bob E j13K&(H4#fv aj&*201nH8( ^SnH 6%4bCG9 Bob D publiek kanaal j13K&(H4#fv aj&*201nH8( ^SnH 6%4bCG9 RSA algoritme Gebaseerd op de volgende eigenschap van gehele getallen: Laat 2 en 3 priemgetallen zijn, we kunnen snel het product 4 = 2×3 uitrekenen, i.e. 11×13 = 143. We kennen geen snelle methode om gegeven een product van (grote) priemgetallen 4 = 2×3, deze priemgetallen 2 en 3 te achterhalen. RSA algoritme: rekenen modulo N )mod* is een getal tussen 0 en * zodat ()=>?*) + A* = ) voor een zeker geheel getal A Voorbeeld: 18mod12 = 6 28mod12 = 4 11mod4 = 3 RSA algoritme Stelling: Laat 2 en 3 twee priemgetallen zijn en 4 = 2×3hun product. Er bestaan getallen ? en - zodanig dat voor alle getallen1 = de volgende formules elkaars inverse zijn: ' = = =E mod4 F(G) = G H =>?4 Oftewel F('(=)) = =. 1.Metggd(m,N)=1 RSA algoritme Alice wil een bericht sturen naar Bob. Bob kiest twee priemgetallen 2 en 3 en berekent 4 = 2×3. Hij kiest een getal -. De publieke sleutel is (4, -). Op basis van 2, 3 en - kan Bob zijn geheime sleutel ? berekenen. RSA algoritme Encoderen van een bericht =: G = ' = = =E mod4 Decoderen van een bericht: = = F(' G ) = F G = G H mod4 Elliptische Krommen Sterkere beveiliging dan RSA. Wordt gebruikt door o.a. Google en WhatsApp. Ingewikkelder om te implementeren. (a) Alice stuurt Bob een bericht dat ze met een Ceasarcijfer heeft geencodeerd. Ze is alleen vergeten te vertellen met hoeveel plaatsten k alle letters zijn verschoven. Het bericht is: “Pizi hi amwoyrhi”. Kun je raden wat het bericht van Alice is? Wat is k? A B C D E F ... A B C D E F ... Ceasar cijfer met k = 3 (b) Om een bericht te encoderen met het RSA algoritme moet tekts eerst worden omgezet in een getal. Gebruik de tabel om het bericht “Hallo” om te zetten in een getal van 10 cijfers. Hint: gebruik 01 in plaats van 1 etc. Websites sorteren Het begin van De eerste zoekmachines sorteerden websites op basis van de aanwezigheid van trefwoorden op de website. In 1996 bedenken Larry Page en Sergey Brin het PageRank algoritme om websites te sorteren op basis van kwaliteit. Het world wide web www netwerk is een gerichte graaf Knopen: websites Lijnen: hyperlinks Het PageRank algoritme Idee 1: elke inkomende hyperlink is een “stem” voor de website. A B C D Knoop A en B krijgen allebei 1 stem Knoop C en D krijgen allebei 2 stemmen. In aandelen: (0.167, 0.167, 0.33, 0.33) à C & D zijn belangrijker dan A & B Het PageRank algoritme Idee 2: een stem van een belangrijke website is meer waard dan een stem van een onbelangrijke website. A B C D Het PageRank algoritme 1. Begin met een willekeurige verdeling van de stemmen. A B C D Bijvoorbeeld: (0.25, 0.25, 0.25, 0.25) Het PageRank algoritme 2. Verdeel de stemmen van iedere website eerlijk over de websites waar de website naar verwijst. 3. Herhaal stap 2 totdat de verdeling van stemmen niet meer veranderd. A B C D Het PageRank algoritme 0.25, 0.25, 0.25,0.25 A ontvangt 0.125 stemmen van C B ontvangt 0.125 stemmen van A C ontvangt 0.25 stemmen van B en 0.25 stemmen van D D ontvangt 0.125 stemmen van A en 0.125 stemmen van C (0.125, 0.125, 0.5, 0.25) A B C D Het PageRank algoritme (12.5, 12.5, 50, 25) A ontvangt 0.25 stemmen van C B ontvangt 0.0625 stemmen van A C ontvangt 0.125 stemmen van B en 0.25 stemmen van D D ontvangt 0.0625 stemmen van A en 0.25 stemmen van C (0.25, 0.0625, 0.375, 0.3125) A B C D Het PageRank algoritme Na ongeveer 45 rondes veranderd de verdeling van stemmen niet meer. De uiteindelijke verdeling is: 0.2, 0.1, 0.4, 0.3 A B C D Google rangschikt de websites in de volgorde C, D, A, B. PageRank convergeert Stelling: Het PageRank algoritme convergeert naar een unieke stationaire verdeling onafhankelijk van de begin verdeling wanneer de onderliggende (eindige) graaf ! de volgende eigenschappen heeft: ! is sterk samenhangend en aperiodiek. Sterke samenhang Een graaf is samenhangend als alle knopen met elkaar in verbinding staan. Een graaf is sterk samenhangend als er een gericht pad is tussen elk paar punten. Niet samenhangend Samenhangend Sterk samenhangend Aperiodiciteit Een graaf is aperiodiek als voor elke knoop het volgende geld. De grootste gemeenschappelijke deler van alle paden die beginnen en eindigen in de knoop is gelijk aan 1. periodiek k=2 aperiodiek Conclusie Algoritmes zijn erg belangrijk in ons dagelijks leven. Vaak zijn wiskundige technieken nodig om: * zeker te weten dat een algoritme werkt. * een algoritme te ontwerpen. A B C D (a) Ga na dat de verdeling 0.2, 0.1, 0.4, 0.3 inderdaad niet veranderd door nog een ronde van stemmen te verdelen. (b) Wat verwacht je dat de verdeling van stemmen wordt voor de hiernaast getekende graaf? (c) Is deze graaf aperiodiek. Hint: wat is de lengte van een gericht pad dat begint in knoop A en eindigt in knoop A. Is de verdeling die je vind onafhankelijk van de begin toestand? A B C D