De methode van Polybius is een vorm van cryptografie die werd uitgevonden door de Griekse historicus en wijsheer Polybius. In het bijzonder kan de methode gebruikt worden om een gegeven tekst voor te stellen met een kleiner aantal karakters. Hierbij wordt gebruikgemaakt van een vierkant rooster dat wordt opgevuld met de karakters van een gegeven alfabet, die van links naar rechts en van boven naar onder in de cellen van het roosters worden uitgeschreven. We noemen dit alfabet het lange alfabet en het aantal karakters van dit alfabet moet dus een volkomen kwadraat zijn. De karakters van een tweede alfabet worden dan naast de rijen (van boven naar onder) en boven de kolommen (van links naar rechts) van het vierkant rooster geschreven. We noemen dit alfabet het korte alfabet. Het kwadraat van het aantal letters in het korte alfabet moet gelijk zijn aan het aantal letters in het lange alfabet. Er mogen gemeenschappelijke karakters voorkomen in het korte en het lange alfabet.

  1 2 3 4 5
1 A B C D E
2 F G H I K
3 L M N O P
4 Q R S T U
5 V W X Y Z

1 2 3 4 5 6
1 A B C D E F
2 G H I J K L
3 M N O P Q R
4 S T U V W X
5 Y Z 0 1 2 3
6 4 5 6 7 8 9

S Q U A R E
S A B C D E F
Q G H I J K L
U M N O P Q R
A S T U V W X
R Y Z   . , ?
E ! ; : " & @

Het Polybiusvierkant kan dan gebruikt worden voor het coderen van een boodschap waarvan alle karakters voorkomen in het lange alfabet. Elk karakter van de boodschap wordt daarbij omgezet naar de twee karakters van het korte alfabet die respectievelijk naast de rij en boven de kolom staan waarop het karakter van de boodschap voorkomt in het rooster. Het decoderen van een boodschap gebeurt door elke twee opeenvolgende karakters van de gedecodeerde boodschap (die uitsluitend bestaat uit karakters van het korte alfabet) te interpreteren als het label van respectievelijk de rij en de kolom waarop het corresponderende karakter (uit het lange alfabet) staat.

Opgave

Implementeer de volgende vier functies die gebruikt kunnen worden om boodschappen te coderen en decoderen volgens de methode van Polybius. Aan deze functies moeten telkens drie strings doorgegeven worden. Het tweede en derde argument stellen respectievelijk het korte en het lange alfabet voor die gebruikt worden om het Polybiusvierkant op te bouwen. Je mag er steeds van uitgaan dat de lengte van het lange alfabet gelijk is aan het kwadraat van de lengte van het korte alfabet. Hetzelfde karakter komt ook nooit meerdere keren voor binnen een alfabet.

Voorbeeld

>>> lang2kort('P', '12345', 'ABCDEFGHIKLMNOPQRSTUVWXYZ')
'35'
>>> lang2kort('P', '123456', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789')
'34'
>>> lang2kort('P', 'SQUARE', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ .,?!;:"&@')
'UA'

>>> kort2lang('35', '12345', 'ABCDEFGHIKLMNOPQRSTUVWXYZ')
'P'
>>> kort2lang('34', '123456', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789')
'P'
>>> kort2lang('UA', 'SQUARE', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ .,?!;:"&@')
'P'

>>> codeer('POLYBIUS', '12345', 'ABCDEFGHIKLMNOPQRSTUVWXYZ')
'3534315412244543'
>>> codeer('POLYBIUS', '123456', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789')
'3433265112234341'
>>> codeer('POLYBIUS VIERKANT', 'SQUARE', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ .,?!;:"&@')
'UAUUQERSSQQUAUASRUAAQUSRUEQRSSUQAQ'

>>> decodeer('3534315412244543', '12345', 'ABCDEFGHIKLMNOPQRSTUVWXYZ')
'POLYBIUS'
>>> decodeer('3433265112234341', '123456', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789')
'POLYBIUS'
>>> decodeer('UAUUQERSSQQUAUASRUAAQUSRUEQRSSUQAQ', 'SQUARE', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ .,?!;:"&@')
'POLYBIUS VIERKANT'