W trakcie nauki do jutrzejszego kolokwium z kryptologii musiałem opanować sposób liczenia odwrotności modularnej liczby. Publikuję opracowany przeze mnie sposób, z nadzieją, że komuś się kiedyś przyda.

Jeśli mamy policzyć powiedzmy 7-1 mod26, to piszemy:

mam nadzieję, że nie-informatycy nie będą mieli problemu ze zrozumieniem notacji wskaźnika do wiersza tabeli. 🙂 Pozdrawiam wszystkich piszących w C/C++/asm!

*7 *26 w q
0 1 26
1 0 7 _26/7_=3 //row[1] = row[-1] – row[0]*q ;row++
-3 1 5 _7/5_=1 //row[1] = row[-1] – row[0]*q ;row++
4 -1 2 _5/2_=2 //row[1] = row[-1] – row[0]*q ;row++
-11 -3 1 _2/1_=2 //row[1] = row[-1] – row[0]*q ;row++
26 5 0 pamiętaj cholero, nie dziel przez zero!

Teraz w[-1] i w[0] rzutujemy na strukturkę:

x y z
u v w

i otrzymujemy:

x=-11 y=-3 z=1
u=26 v=5 w=0

Gdzie x jest wynikiem. Możemy jeszcze policzyć, że (-11+26 mod26) == (15 mod26) jeśli nam to jest do szczęścia potrzebne.

A do czego to się przyda na dłuższą metę? Jeśli mamy złamać szyfr affiniczny, i wiemy, że literka A jest zaszyfrowana jako U, zaś P odpowiada V, to wiemy, że mamy do czynienia odwzorowaniem: 0->20 i 15->21. I to wszystko przy mod26.

Szyfr afiniczny działa w ten sposób, że literkę mnoży przez coś, dodaje coś do niej, a wynik dzieli modulo 26. W przykładzie z którego korzystam podana została literka A, z której mogę odczytać przesunięcie: 20. Wtedy zdekodować literkę możemy przez odjęcie przesunięcia i pomnożenie przez odwrotność modulo.

Inna sprawa, że ten przykład jest banalny, bo

21=15*mul+offset

Czyli

21-offset = 15 * mul

I z tego wynika że:

1 = 15*mul

Dla tych, którzy jeszcze nie załapali: odwrotnością modularną mul jest 15, więc jak na dłoni widać:

mul * mul-1 = 1

Bez całego tego żmudnego liczenia…. Tylko wg któregoś z praw Murphy’ego przykład który będzie na najbliższym kolokwium nie będzie taki banalny.

Algorytm, który opisałem jest oparty o rozszerzony algorytm Euklidesa. Trzeba też zaznaczyć, że odwrotności modularnej nie policzymy, gdy liczba której odwrotność liczymy nie jest względnie pierwsza z tym, co stoi po mod.
Dokładniejsze, choć przystępne omówienie algorytmu liczenia odwrotności modularnej jest omówione tutaj: http://edu.i-lo.tarnow.pl/inf/alg/001_search/0008.php