Salausmenetelmät / Osa I Veikko Keränen, Jouko Teeriaho (RAMK, 2006) Liite 1. Laajennettu Eukleideen algoritmi suoraviivainen tapa - johdanto - matemaattinen induktiotodistus - matriisien kertolaskun käyttömahdollisuus - käsinlaskuesimerkkejä - kaikki välivaiheet esittävä ohjelma Mathematicalla ü Laajennettu Eukleideen algoritmi - suoraviivainen tapa Etsitään annettujen positiivisten lukujen a ja b suurimman yhteisen tekijän d = syt(a, b) esitys lukujen a ja b lineaarkombinaationa muodossa d = u a + v b; u, v œ ; suoraviivaisella tavalla. Tässä tavassa jakoalgoritmin tuottama jakojäännös r i esitetään jokaisella askeleella muodossa u i a + v i b. Viimeisen jakojäännöksen r n ollessa nolla, on viimeinen nollasta eroava jakojäännös r n-1 etsimämme lineaarikombinaatio d = sytha, bl = r n-1 = ua+ vb. Aloitamme laskemalla yksityiskohtaisesti useita ensimmäisiä rivejä: a b > 0 a = q 1 b + r 1 ; r 1 = a q 1 b = u 1 a + v 1 b, missä u 1 = 1, v 1 = q 1 œ b = q 2 r 1 + r 2 ; r 2 = b q 2 r 1 = b q 2 (a q 1 b) = q 2 a + (1 q 2 v 1 )b = u 2 a + v 2 b, missä u 2 = q 2, v 2 = 1 q 2 v 1 r 1 = q 3 r 2 + r 3 ; r 3 = r 1 q 3 r 2 = (a q 1 b ) q 3 (b q 2 (a q 1 b )) = u 1 a + v 1 b q 3 (q 2 a + (1 q 2 v 1 )b) = u 1 a + v 1 b q 3 ( u 2 a + v 2 b) = (u 1 q 3 u 2 )a + (v 1 q 3 v 2 )b = u 3 a + v 3 b, missä u 3 = u 1 q 3 u 2, v 3 = v 1 q 3 v 2 r 2 = q 4 r 3 + r 4 ; r 4 = r 2 q 4 r 3 = (b q 2 (a q 1 b )) q 4 ((a q 1 b ) q 3 (b q 2 (a q 1 b ))) = u 2 a + v 2 b q 4 (u 3 a + v 3 b) = (u 2 q 4 u 3 )a + (v 2 q 4 v 3 )b = u 4 a + v 4 b, missä u 4 = u 2 q 4 u 3, v 4 = v 2 q 4 v 3 r 3 = q 5 r 4 + r 5 ; r 5 = r 3 q 5 r 4 = u 5 a + v 5 b, missä u 5 = u 3 q 5 u 4, v 5 = v 3 q 5 v 4 ja niin edelleen. Meillä on siis a = q 1 b + r 1, r 1 = a q 1 b b = q 2 r 1 + r 2, r 2 = b q 2 r 1. Tämän lisäksi yleiset jakojäännökset sekä kertoimet u i ja v i ovat ilmeisestikin muotoa
2 salausmenetelmat_laajennettueukleideenalgoritmi.nb r i = r i-2 q i r i-1 = u i a + v i b, missä u i = u i-2 q i u i-1 ja v i = v i-2 q i v i-1, aina kun i 3. (*) Koska u 1 = 1, v 1 = q 1 ja u 2 = q 2, v 2 = 1 q 2 v 1, niin u 2 = u 0 q 2 u 1, v 2 = v 0 q 2 v 1, kun u 0 = 0 ja v 0 = 1. Toisin sanoen, valitsemalla r 0 = b; u 0 = 0 ja v 0 = 1 sekä u 1 = 1, v 1 = q 1, voidaan (*) laajentaa koskemaan myös arvoa i = 2. Saadaan siis r 1 = a q 1 b r i = r i-2 q i r i-1 = u i a + v i b u i = u i-2 q i u i-1 v i = v i-2 q i v i-1, aina kun i 2. Merkitään vielä r -1 = a, r 0 = b; u -1 = 1 ja v -1 = 0 sekä u 0 = 0 ja v 0 = 1. Tällöin ensimmäinen yhtäsuuruus r 1 = a q 1 b sekä arvot u 1 ja v 1 saadaan yleisistä palautuskaavoista myös tapauksessa i = 1: r i = r i-2 q i r i-1 = u i a + v i b u i = u i-2 q i u i-1 v i = v i-2 q i v i-1, aina kun i 1. Yllä esitetyistä laskelmista voidaan myös havaita, että luvun a (> 0) kerroin u i on positiivinen aina kun indeksi i on pariton ja negatiivinen aina kun i > 0 on parillinen. Luvun b (> 0) kertoimen v i etumerkki puolestaan vaihtelee päinvastoin: v i on negatiivinen aina kun indeksi i > 0 on pariton ja positiivinen aina kun i on parillinen. Esitetään seuraavaksi tämä laajennettu Eukleideen algoritmi valmiin ohjelman muodossa (kuten jo kappaleessa 2.2), ja todistetaan sen virheetön toiminta matemaattisella induktiolla. Algoritmi 2.2 Laajennettu Eukleideen algoritmi syöte a b > 0 alkuarvot r -1 = a; r 0 = b; u -1 = 1; u 0 = 0; v -1 = 0; v 0 = 1; n = 0; while r n > 0 do begin aseta n = n + 1; tulosta r n-2 = q n r n-1 + r n, r n-1 > r n 0; aseta u n = u n-2 - q n u n-1 ; aseta v n = v n-2 - q n v n-1 ; end aseta u = u n-1 ; v = v n-1 ; (2.2) sytha, bl = r n-1 = ua+ vb Algoritmin 2.2 oikeellisuuden todistus: Aluksi huomataan, että luvut r n, n 1, muodostavat ei-negatiivisten kokonaislukujen aidosti vähenevän jonon.
salausmenetelmat_laajennettueukleideenalgoritmi.nb 3 Näin ollen algoritmin toiminta päättyy vähintään a iteraation jälkeen (käytännössä paljon nopeammin). Päätekstin Kappaleessa 2.3. analysoidaan tarkemmin kuinka nopea Eukleideen algoritmi todella on. Algoritmin palauskaavasta r i = r i-2 q i r i-1 seuraa, että jokainen jakojäännöksien r i-2 ja r i-1 yhteinen tekijä on myös jakojäännöksien r i ja r i-1 yhteinen tekijä ja päinvastioin, jokainen jakojäännöksien r i ja r i-1 tekijä t on myös lukujen r i-2 ja r i-1 tekijä, koska muodoista r i = t r i ' ja r i-1 = t r i-1 ' (t, r i ', r i-1 ' œ + ) seuraa palautuskaavan nojalla, että r i-2 = r i + q i r i-1 = t r i ' + q i t r i-1 ' = t (r i ' + q i r i-1 '), ts. t on luvun r i-2 (ja oletuksen mukaan myös luvun r i-1 ) tekijä. (Tämä tarkastelu tehtiin itse asiassa jo Kappaleen 2.1 alussa.) Siis sythr i-2, r i-1 L = sythr i-1, r i L, aina kun 1 i n, ja näin ollen sytha, bl = sythr -1, r 0 L = sythr 0, r 1 L = sythr 1, r 2 L = = sythr n-1, r n L = sythr n-1,0l = r n-1. Tämä todistaa ensimmäisen yhtäsuuruuden kohdassa (2.2). Osoitamme nyt, että kaikille k, -1 k n, on voimassa (2.3) u k a + v k b = r k. Huomaa, että tässä sijoitus k = n - 1 tuottaa toisen yhtäsuuruuden kohdassa (2.2). Kun k =-1 ja k = 0 relaatio (2.2) on voimassa alkuarvojen r -1 = a; r 0 = b; u -1 = 1; u 0 = 0; v -1 = 0; v 0 = 1; valinnan perusteella. Jatketaan matemaattisella induktiolla. Tehdään induktio-oletus (i.o.), että (2.2) on voimassa, kun n = k 2 ja kun n = k 1. Algoritmin palautuskaavojen ja induktio-oletuksen nojalla seuraa, että r k = r k-2 - q k r i.o. k-1 = 8u k-2 a + v k-2 b< - q k 8u k-1 a + v k-1 b< =Hu k-2 q k u k-1 L a + Hv k-2 q k v k-1 L b = u k a + v k b. Induktioperiaatteen nojalla kohta (2.3) on tosi. Näin ollen Algoritmi 2.2 toimii oikein. Tietenkään ei ole välttämätöntä tallettaa kaikkia muuttujien r k, u k ja v k väliarvoja. Vain kaksi viimeistä yhdessä q k :n kanssa riittää. Muut väliarvot olivat mukana algoritmissa vain helpottamassa todistuksen lukemista. Huomautus. Koska kertoimet u i ja v i lasketaan lineaaristen yhtälöiden Ñ u i = u i-2 q i u i-1 v i = v i-2 q i v i-1 avulla, voitaisiin ne ja saman tien seuraavalla askeleella tarvittavat u i-1 ja v i-1 tuottaa ja tallentaa matriisimuodossa seuraavasti: i j u i k u i-1 v i y z = i j -q i 1 v i-1 { k 1 0 y z i { k j ui-1 v i-1 y z. u i-2 v i-2 { Koska u -1 = 1; u 0 = 0; v -1 = 0; v 0 = 1; meillä on Kun i = 1, saadaan Seuravassa askeleessa saadaan i j u 0 v 0 y z = i j 0 1 y z. k u -1 v -1 { k 1 0 { i j u 1 v 1 y z = i j -q 1 1 y z i j 0 1 y z. k u 0 v 0 { k 1 0 { k 1 0 { i j u 2 v 2 y z = i j -q 2 1 y z i j u 1 v 1 y z = i j -q 2 1 y z( i j -q 1 1 y z i k u 1 v 1 { k 1 0 { k u 0 v 0 { k 1 0 { k 1 0 { k j 0 1 y z). 1 0 {
4 salausmenetelmat_laajennettueukleideenalgoritmi.nb Tässä kahden viimeisen matriisin ympärillä olevat sulkumerkit voidaan jättää merkitsemättä matriisien liitäntä- eli assosiatiivisuusominaisuuksien nojalla. Lopullisessa lineaarikombinaatiossa sytha, bl = r n-1 = ua+ vb kertoimet ovat u = u n-1 ; v = v n-1 ja ne löytyvät n 1 matriisikertolaskun jälkeen saatavan tulomatriisin ensimmäiseltä vaakariviltä sen jälkeen, kun tarvittavat kertoimet q i ovat löytyneet: i j u n-1 v n-1 y z = i j -q n-1 1 y z i j -q 2 1 y z i j -q 1 1 y z i j 0 1 y z. k u n-2 v n-2 { k 1 0 { k 1 0 { k 1 0 { k 1 0 { Alla olevassa käsinlaskuesimerkissä, jossa lasketaan syt(368, 123), saadaan q 1 = 2 ja q 2 = 1. Tuossa tapauksessa on kolme riviä, joten n = 3. Kertoimiksi saadaan u = u n-1 =-1 ; v = v n-1 = 3. Nämä luvut löytyvät tulomatriisin ensimmäiseltä vaakariviltä: J 1 1 2 1 N.J 1 0 1 0 N.J 0 1 1 0 N i j -1 3 y z k 1-2 { Jätämme lukijalle tämän elegantin laskentatavan ohjelmoinnin harjoitustehtäväksi emmekä enää käsittele sitä tässä yhteydessä. ü Käsinlaskuesimerkki: a = 368 ja b = 123 Tässä syt = 1, mikä nähdään Eukleideen algoritmilla seuraavasti: 368 = 2 * 123 + 122 123 = 1 * 122 + 1 122 = 122 * 1 + 0 Viimeinen nollasta eroava jakojäännös = 1 = syt(368, 123). Esitetään syt = 1 nyt lukujen a = 368 ja b = 123 lineaarikombinaationa. Tässä yksinkertaisessa tilanteessa laskelmat on helppo tehdä käsin. Meillä siis on voimassa r i = r i-2 q i r i-1 = u i a + v i b, missä u i = u i-2 q i u i-1, v i = v i-2 q i v i-1, u 0 = 0 ja v 0 = 1 sekä u 1 = 1, v 1 = q 1. Niinpä laskemme seuraavasti: r i-2 = q i r i-1 + r i ; r i = r i-2 q i r i-1 = u i a + v i b ; u i, v i, q i ----------------------- ----------------------------------- ----------- 368 = 2*123 + 122 ; 122 = 368 2*123 ; u 1 = 1, v 1 = q 1 = 2 123 = 1*122 + 1 ; 1 = 123 1*(368 2*123) = 1* 368 + 3*123 ; u 2 = u 0 q 2 u 1 = 0 1*1 = 1,
salausmenetelmat_laajennettueukleideenalgoritmi.nb 5 v 2 = v 0 q 2 v 1 = 1 1*( 2) = 3 122 = 122*1 + 0 ; 1 = syt(368, 123) = u a + v b, missä u = u 2 = 1 ja v = v 2 = 3. Siis syt(368, 123) = 1 = 1* 368 + 3*123. Tämä tulos on helppo varmistaa ja todeta oikeaksi. ü Käsinlaskuesimerkki: a = 1431 ja b = 1368 Tässä syt = 9, mikä nähdään Eukleideen algoritmilla seuraavasti: 1431 = 1 * 1368 + 63 1368 = 21 * 63 + 45 63 = 1 * 45 + 18 45 = 2 * 18 + 9 18 = 2 * 9 + 0 Viimeinen nollasta eroava jakojäännös = 9 = syt(1431, 1368). Laketaan vielä lineaarikombinaatio 9 = u i a + v i b. Tässä a = 1431 ja b = 1368 sekä kuten edellä r i = r i-2 q i r i-1 = u i a + v i b, missä u i = u i-2 q i u i-1, v i = v i-2 q i v i-1, u 0 = 0 ja v 0 = 1 sekä u 1 = 1, v 1 = q 1. Keskitytään nyt vain kaikkein oleellisiimpaan, eli lukujen u i ja v i laskemiseen kullakin askeleella: r i-2 = q i r i-1 + r i ; r i = r i-2 q i r i-1 = u i a + v i b ; u i, v i, q i ----------------------- ----------------------------------- ----------- 1431 = 1*1368 + 63 63 = a b = u 1 a + v 1 b; u 1 = 1, v 1 = q 1 = 1 1368 = 21*63 + 45 45 = u 2 a + v 2 b; u 2 = u 0 q 2 u 1 = 0 21*1 = 21, v 2 = v 0 q 2 v 1 = 1 21*( 1) = 22 63 = 1*45 + 18 18 = u 3 a + v 3 b; u 3 = u 1 q 3 u 2 = 1 1*( 21) = 22, v 3 = v 1 q 3 v 2 = 1 1*22 = 23 45 = 2*18 + 9 9 = u 4 a + v 4 b; u 4 = u 2 q 4 u 3 = 21 2*22 = 65, v 4 = v 2 q 4 v 3 = 22 2*( 23) = 68 18 = 2*9 + 0 9 = syt(1431, 1368) = u a + v b, missä u = u 4 = 65 ja v = v 4 = 68. Siis syt(1431, 1368) = 9 = 65*1431 + 68*1368. Tarkista vielä tämä tulos kertomalla luvut ja laskemalla saadut tulot yhteen. ü Laajennetun Eukleideen algoritmin ohjelmointi Mathematicalla Esitetään aluksi Eukleideen perusalgoritmi ilman lineaarikombinaatiota. Tällöin laskelmien rakenne on varsin yksinkertainen. Jos käyttäjän antama (positiivinen luku) a on pienempi kuin b, vaihdetaan ensin näiden lukujen a ja b järjestys:
6 salausmenetelmat_laajennettueukleideenalgoritmi.nb Clear@fD; f@8a_, b_<d := If@a b, 8a, "=", Floor@a ê bd, " ", b, "+", a Floor@a ê bd b<, f@8b, a<dd; f@8a_,_,_,_,b_,_,r_<d := Module@8myPr = ""<, If@r 0, Print@"\nTässä syt = ", b, ".", "\n\ntulos nähdään Eukleideen algoritmilla seuraavasti:\n"d; mypr, 8b, "=", Floor@b ê rd, " ", r, "+", b Floor@b ê rd r<dd; Esimerkki: Clear@EukleidesD; Eukleides@a_, b_d := H Print@ Hsteps = Rest@NestWhileList@f, 8a, b<, H# =!= ""L &DDL êê TableFormD; Print@"Viimeinen nollasta eroava jakojäännös = ", Last@steps@@Length@stepsD 2DDD, " = syth", a, ", ", b, "L."D L Eukleides@1234, 2345D Tässä syt = 1. Tulos nähdään Eukleideen algoritmilla seuraavasti: 2345 = 1 * 1234 + 1111 1234 = 1 * 1111 + 123 1111 = 9 * 123 + 4 123 = 30 * 4 + 3 4 = 1 * 3 + 1 3 = 3 * 1 + 0 Viimeinen nollasta eroava jakojäännös = 1 = syth1234, 2345L. Palautetaan seuraavaksi mieleen yllä todistetun laajennetun algoritmin pseudokoodi: Algoritmi 2.2 Laajennettu Eukleideen algoritmi syöte a b > 0
salausmenetelmat_laajennettueukleideenalgoritmi.nb 7 alkuarvot r -1 = a; r 0 = b; u -1 = 1; u 0 = 0; v -1 = 0; v 0 = 1; n = 0; while r n > 0 do begin aseta n = n + 1; tulosta r n-2 = q n r n-1 + r n, r n-1 > r n 0; aseta u n = u n-2 - q n u n-1 ; aseta v n = v n-2 - q n v n-1 ; end aseta u = u n-1 ; v = v n-1 ; Meillä on siis aluksi: r -1 = a; r 0 = b; (a b > 0) u -1 = 1; u 0 = 0; v -1 = 0; v 0 = 1; n = 0; r -1 = a = q 1 b + r 1 ; r 1 = a q 1 b = u 1 a + v 1 b, missä u 1 = u -1 q 1 u 0, v 1 = v -1 q 1 v 0 r 0 = b = q 2 r 1 + r 2 ; r 2 = b q 2 r 1 = u 2 a + v 2 b, missä u 2 = u 0 q 2 u 1, v 2 = v 0 q 2 v 1 r 1 = q 3 r 2 + r 3 ; r 3 = u 3 a + v 3 b, missä u 3 = u 1 q 3 u 2, v 3 = v 1 q 3 v 2 r 2 = q 4 r 3 + r 4 ; r 4 = u 4 a + v 4 b, missä u 4 = u 2 q 4 u 3, v 4 = v 2 q 4 v 3 Esitetään nyt jakoalgoritmin suorittava funktio jako ja sitä käyttävä funktio laajennettueukleides: Clear@jakoD; jako@8a_, b_<d := If@a b, Print@r 1,"=", a, "=", q 1," ", r 0,"+", r 1,"=", Floor@a ê bd, " ", b, "+", a Floor@a ê bd b, "; ", r 1, "=", a Floor@a ê bd b, "=", u 1,"a +", v 1,"b"," = ", "H", 1 0, "L ", a, " + H", 0 Floor@a ê bd, "L ", bd; 81, a, Floor@a ê bd, b, a Floor@a ê bd b, 80, 1<, 1 0, a, 0 Floor@a ê bd, b<h = 8indeksi=n=1,r 1,q 1,r 0, r 1,8u 0,v 0 <,u 1 =u 1 q 1 u 0,a,v 1 =v 1 q 1 v 0,b< L, jako@8b, a<dd; jako@ 8n_, r1_, q3_, r2_, r3_, 8u2_, v2_<, u3_, a_, v3_, b_<d := Module@8i, q4, r4, u4, v4, nextstep<, If@r3 0, "", Hq4 = Floor@r2 ê r3d; r4= r2 q4 r3; u4 = u2 q4 u3; v4 = v2 q4 v3; nextstep = 8i = n + 1, r2, q4, r3, r4, 8u3, v3<, u4,a,v4,b<; Print@r i 2,"=", r2, "=", q i," ", r i 1,"+", r i,"=", q4, " ", r3, "+",r4,"; ",r i,"=", r4, "=", u i,"a +", v i, "b", " = ", "H", u4, "L ", a, " + H", v4, "L ", bd; nextstepldd;
8 salausmenetelmat_laajennettueukleideenalgoritmi.nb Clear@laajennettuEukleidesD; laajennettueukleides@a_, b_d := HPrint@"Laajennettu Eukleideen algoritmi toimii seuraavasti:"d; Print@"a = ", Max@a, bd, ", b = ", Min@a, bdd; lastrelevantstep = NestWhile@jako, 8a, b<, H# =!= ""L &, 1, Infinity, 2D; Print@"Viimeinen nollasta eroava jakojäännös = ", lastrelevantstep@@5dd, " = syth", a, ", ", b, "L."D; Print@"Lineaarikombinaatio: ", lastrelevantstep@@5dd, " = u a + v b = ", "H", lastrelevantstep@@7dd, "L ", Max@a, bd, " + H", lastrelevantstep@@9dd, "L ", Min@a, bd, "."D;L; ü Esimerkki: laajennettueukleides[123,368] laajennettueukleides@123, 368D Laajennettu Eukleideen algoritmi toimii seuraavasti: a = 368, b = 123 r -1 =368=q 1 *r 0 +r 1 =2*123+122; r 1 =122=u 1 a +v 1 b = H1L*368 + H-2L*123 r 0 =123=q 2 *r 1 +r 2 =1*122+1; r 2 =1=u 2 a +v 2 b = H-1L*368 + H3L*123 r 1 =122=q 3 *r 2 +r 3 =122*1+0; r 3 =0=u 3 a +v 3 b = H123L*368 + H-368L*123 Viimeinen nollasta eroava jakojäännös = 1 = syth123, 368L. Lineaarikombinaatio: 1 = u a + v b = H-1L*368 + H3L*123. Tarkistuslaskelmia luvuilla a ja b sekä tuloksena saaduilla luvuilla u ja v: lastrelevantstep H siis 8i,r i 2,q i,r i 1,r i,8u i 1,v i 1 <,u i,a,v i,b<, kun i = n 1 L 82, 123, 1, 122, 1, 81, -2<, -1, 368, 3, 123<
salausmenetelmat_laajennettueukleideenalgoritmi.nb 9 Print@"Lineaarikombinaatio u a + v b = ", "H", lastrelevantstep@@ 4DD, "L ", lastrelevantstep@@ 3DD, " + H", lastrelevantstep@@ 2DD, "L ", lastrelevantstep@@ 1DD, " tuottaa sievennettynä luvun:"d; lastrelevantstep@@ 4DD lastrelevantstep@@ 3DD + lastrelevantstep@@ 2DD lastrelevantstep@@ 1DD Lineaarikombinaatio u a + v b = H-1L*368 + H3L*123 tuottaa sievennettynä luvun: 1 Tämähän on aivan oikein. ü Esimerkki: laajennettueukleides[34527,18273645] laajennettueukleides@34527, 18273645D Laajennettu Eukleideen algoritmi toimii seuraavasti: a = 18273645, b = 34527 r -1 =18273645=q 1 *r 0 +r 1 =529*34527+8862 ; r 1 =8862=u 1 a +v 1 b = H1L*18273645 + H-529L*34527 r 0 =34527=q 2 *r 1 +r 2 =3*8862+7941; r 2 =7941=u 2 a +v 2 b = H-3L*18273645 + H1588L*34527 r 1 =8862=q 3 *r 2 +r 3 =1*7941+921; r 3 = 921=u 3 a +v 3 b = H4L*18273645 + H-2117L*34527 r 2 =7941=q 4 *r 3 +r 4 =8*921+573; r 4 = 573=u 4 a +v 4 b = H-35L*18273645 + H18524L*34527 r 3 =921=q 5 *r 4 +r 5 =1*573+348; r 5 = 348=u 5 a +v 5 b = H39L*18273645 + H-20641L*34527 r 4 =573=q 6 *r 5 +r 6 =1*348+225; r 6 = 225=u 6 a +v 6 b = H-74L*18273645 + H39165L*34527
10 salausmenetelmat_laajennettueukleideenalgoritmi.nb r 5 =348=q 7 *r 6 +r 7 =1*225+123; r 7 =123 =u 7 a +v 7 b = H113L*18273645 + H-59806L*34527 r 6 =225=q 8 *r 7 +r 8 =1*123+102; r 8 =102 =u 8 a +v 8 b = H-187L*18273645 + H98971L*34527 r 7 =123=q 9 *r 8 +r 9 =1*102+21; r 9 =21 =u 9 a +v 9 b = H300L*18273645 + H-158777L*34527 r 8 =102=q 10 *r 9 +r 10 =4*21+18; r 10 =18= u 10 a +v 10 b = H-1387L*18273645 + H734079L*34527 r 9 =21=q 11 *r 10 +r 11 =1*18+3; r 11 =3= u 11 a +v 11 b = H1687L*18273645 + H-892856L*34527 r 10 =18=q 12 *r 11 +r 12 =6*3+0; r 12 =0=u 12 a +v 12 b = H-11509L*18273645 + H6091215L*34527 Viimeinen nollasta eroava jakojäännös = 3 = syth34527, 18273645L. Lineaarikombinaatio: 3 = u a + v b = H1687L*18273645 + H-892856L*34527. Tarkistuslaskelmia luvuilla a ja b sekä tuloksena saaduilla luvuilla u ja v: lastrelevantstep H siis 8i,r i 2,q i,r i 1,r i,8u i 1,v i 1 <,u i,a,v i,b<, kun i = n 1 L 811, 21, 1, 18, 3, 8-1387, 734079<, 1687, 18273645, -892856, 34527<
salausmenetelmat_laajennettueukleideenalgoritmi.nb 11 Print@"Lineaarikombinaatio u a + v b = ", "H", lastrelevantstep@@ 4DD, "L ", lastrelevantstep@@ 3DD, " + H", lastrelevantstep@@ 2DD, "L ", lastrelevantstep@@ 1DD, " tuottaa sievennettynä luvun:"d; lastrelevantstep@@ 4DD lastrelevantstep@@ 3DD + lastrelevantstep@@ 2DD lastrelevantstep@@ 1DD Lineaarikombinaatio u a + v b = H1687L*18273645 + H-892856L*34527 tuottaa sievennettynä luvun: 3 Tämäkin on oikein. Kokeillaan saadun syt(a,b) :n laskemista vielä Eukleideen perusalgoritmilla ilman lineaarikombinaatiota. Tällöin laskelmien rakenne on yksinkertainen. Samat laskelmat ovat toki näkyvissä jo edellisen tulostuksen vasemmanpuoleisessa reunassa. Eukleides@34527, 18273645D Tässä syt = 3. Tulos nähdään Eukleideen algoritmilla seuraavasti: 18273645 = 529 * 34527 + 8862 34527 = 3 * 8862 + 7941 8862 = 1 * 7941 + 921 7941 = 8 * 921 + 573 921 = 1 * 573 + 348 573 = 1 * 348 + 225 348 = 1 * 225 + 123 225 = 1 * 123 + 102 123 = 1 * 102 + 21 102 = 4 * 21 + 18 21 = 1 * 18 + 3 18 = 6 * 3 + 0 Viimeinen nollasta eroava jakojäännös = 3 = syth34527, 18273645L.
12 salausmenetelmat_laajennettueukleideenalgoritmi.nb ü Esimerkki: a = Fibonacci[100]; b = Fibonacci[99]; laajennettueukleides[354224848179261915075, 218922995834555169026] a = Fibonacci@100D b = Fibonacci@99D 354224848179261915075 218922995834555169026 laajennettueukleides@a, bd Laajennettu Eukleideen algoritmi toimii seuraavasti: a = 354224848179261915075, b = 218922995834555169026 r -1 =354224848179261915075=q 1 *r 0 +r 1 =1*218922995834555169026 +135301852344706746049; r 1 =135301852344706746049=u 1 a +v 1 b = H1L*354224848179261915075 + H-1L*218922995834555169026 r 0 =218922995834555169026=q 2 *r 1 +r 2 =1*135301852344706746049+83621143489848422977; r 2 = 83621143489848422977=u 2 a +v 2 b = H-1L*354224848179261915075 + H2L*218922995834555169026 r 1 =135301852344706746049=q 3 *r 2 +r 3 =1*83621143489848422977+51680708854858323072; r 3 = 51680708854858323072=u 3 a +v 3 b = H2L*354224848179261915075 + H-3L*218922995834555169026 Tähän väliin jäävät ohjelman tulostukset on tarkoituksella poistettu. r 94 =5=q 96 *r 95 +r 96 =1*3+2; r 96 =2=u 96 a +v 96 b = H-51680708854858323072 L*354224848179261915075 + H83621143489848422977L*218922995834555169026 r 95 =3=q 97 *r 96 +r 97 =1*2+1; r 97 =1=u 97 a +v 97 b = H83621143489848422977L* 354224848179261915075 + H-135301852344706746049L*218922995834555169026 r 96 =2=q 98 *r 97 +r 98 =2*1+0; r 98 =0=u 98 a +v 98 b = H-218922995834555169026 L*354224848179261915075 + H354224848179261915075L*218922995834555169026 Viimeinen nollasta eroava jakojäännös = 1 = syth354224848179261915075, 218922995834555169026L. Lineaarikombinaatio: 1 = u a + v b = H83621143489848422977L* 354224848179261915075 + H-135301852344706746049L*218922995834555169026.
salausmenetelmat_laajennettueukleideenalgoritmi.nb 13 Tarkistuslaskelmia luvuilla a ja b sekä tuloksena saaduilla luvuilla u ja v: lastrelevantstep H siis 8i,r i 2,q i,r i 1,r i,8u i 1,v i 1 <,u i,a,v i,b<, kun i = n 1 L 897, 3, 1, 2, 1, 8-51680708854858323072, 83621143489848422977<, 83621143489848422977, 354224848179261915075, -135301852344706746049, 218922995834555169026< Print@"Lineaarikombinaatio u a + v b = ", "H", lastrelevantstep@@ 4DD, "L ", lastrelevantstep@@ 3DD, " + H", lastrelevantstep@@ 2DD, "L ", lastrelevantstep@@ 1DD, " tuottaa sievennettynä luvun:"d; lastrelevantstep@@ 4DD lastrelevantstep@@ 3DD + lastrelevantstep@@ 2DD lastrelevantstep@@ 1DD Lineaarikombinaatio u a + v b = H83621143489848422977 L*354224848179261915075 + H-135301852344706746049 L*218922995834555169026 tuottaa sievennettynä luvun: 1 Tulos on oikein! Näille suurille luvuille Fibonacci[100] ja Fibonacci[99] tarvittiin suurimman yhteisen tekijän laskemiseen vain 97 + 1 = 98 askelta, vaikka kyseessä on hankalin mahdollinen tapaus (kun algoritmin toiminnan nopeutta verrataan luvun b arvoon, a > b 1). Todellakin, algoritmin toiminta on hitaimmillaan silloin, kun jakojäännös r k pienenee kussakin askeleessa r k-2 = q k r k-1 + r k mahdollisimman vähän. Tällaiseen tilanteeseen puolestaan joudutaan, jos r k-2 = r k-1 + r k aina kun 2 k n - 1, ts. jos jokaisella askeleella osamäärä q k saa arvon 1 (mahdollisesti ensimmäistä askelta a = q 1 b + r 1 lukuunottamatta). Tarkemmin tätä asiaa käsitellään päätekstin Kappaleessa 2.3. Se että kaikki kertoimet q i ovat ykkösiä tapauksessa a = Fibonacci[100], b = Fibonacci[99] näkyy helpoiten perusalgoritmista: Eukleides@ a = Fibonacci@100D, b = Fibonacci@99D D Tässä syt = 1. Tulos nähdään Eukleideen algoritmilla seuraavasti:
14 salausmenetelmat_laajennettueukleideenalgoritmi.nb 354224848179261915075 = 1 * 218922995834555169026 + 135301852344706746049 218922995834555169026 = 1 * 135301852344706746049 + 83621143489848422977 135301852344706746049 = 1 * 83621143489848422977 + 51680708854858323072 83621143489848422977 = 1 * 51680708854858323072 + 31940434634990099905 51680708854858323072 = 1 * 31940434634990099905 + 19740274219868223167 31940434634990099905 = 1 * 19740274219868223167 + 12200160415121876738 19740274219868223167 = 1 * 12200160415121876738 + 7540113804746346429 12200160415121876738 = 1 * 7540113804746346429 + 4660046610375530309 7540113804746346429 = 1 * 4660046610375530309 + 2880067194370816120 4660046610375530309 = 1 * 2880067194370816120 + 1779979416004714189 2880067194370816120 = 1 * 1779979416004714189 + 1100087778366101931 1779979416004714189 = 1 * 1100087778366101931 + 679891637638612258 1100087778366101931 = 1 * 679891637638612258 + 420196140727489673 679891637638612258 = 1 * 420196140727489673 + 259695496911122585 420196140727489673 = 1 * 259695496911122585 + 160500643816367088 259695496911122585 = 1 * 160500643816367088 + 99194853094755497 160500643816367088 = 1 * 99194853094755497 + 61305790721611591 99194853094755497 = 1 * 61305790721611591 + 37889062373143906 61305790721611591 = 1 * 37889062373143906 + 23416728348467685 37889062373143906 = 1 * 23416728348467685 + 14472334024676221 23416728348467685 = 1 * 14472334024676221 + 8944394323791464 14472334024676221 = 1 * 8944394323791464 + 5527939700884757 8944394323791464 = 1 * 5527939700884757 + 3416454622906707 5527939700884757 = 1 * 3416454622906707 + 2111485077978050 3416454622906707 = 1 * 2111485077978050 + 1304969544928657 2111485077978050 = 1 * 1304969544928657 + 806515533049393 1304969544928657 = 1 * 806515533049393 + 498454011879264 806515533049393 = 1 * 498454011879264 + 308061521170129 498454011879264 = 1 * 308061521170129 + 190392490709135 308061521170129 = 1 * 190392490709135 + 117669030460994 190392490709135 = 1 * 117669030460994 + 72723460248141 117669030460994 = 1 * 72723460248141 + 44945570212853 72723460248141 = 1 * 44945570212853 + 27777890035288 44945570212853 = 1 * 27777890035288 + 17167680177565 27777890035288 = 1 * 17167680177565 + 10610209857723 17167680177565 = 1 * 10610209857723 + 6557470319842 10610209857723 = 1 * 6557470319842 + 4052739537881 6557470319842 = 1 * 4052739537881 + 2504730781961 4052739537881 = 1 * 2504730781961 + 1548008755920 2504730781961 = 1 * 1548008755920 + 956722026041 1548008755920 = 1 * 956722026041 + 591286729879 956722026041 = 1 * 591286729879 + 365435296162 591286729879 = 1 * 365435296162 + 225851433717 365435296162 = 1 * 225851433717 + 139583862445 225851433717 = 1 * 139583862445 + 86267571272 139583862445 = 1 * 86267571272 + 53316291173 86267571272 = 1 * 53316291173 + 32951280099 53316291173 = 1 * 32951280099 + 20365011074 32951280099 = 1 * 20365011074 + 12586269025 20365011074 = 1 * 12586269025 + 7778742049 12586269025 = 1 * 7778742049 + 4807526976 7778742049 = 1 * 4807526976 + 2971215073 4807526976 = 1 * 2971215073 + 1836311903 2971215073 = 1 * 1836311903 + 1134903170 1836311903 = 1 * 1134903170 + 701408733 1134903170 = 1 * 701408733 + 433494437 701408733 = 1 * 433494437 + 267914296 433494437 = 1 * 267914296 + 165580141 267914296 = 1 * 165580141 + 102334155
salausmenetelmat_laajennettueukleideenalgoritmi.nb 15 165580141 = 1 * 102334155 + 63245986 102334155 = 1 * 63245986 + 39088169 63245986 = 1 * 39088169 + 24157817 39088169 = 1 * 24157817 + 14930352 24157817 = 1 * 14930352 + 9227465 14930352 = 1 * 9227465 + 5702887 9227465 = 1 * 5702887 + 3524578 5702887 = 1 * 3524578 + 2178309 3524578 = 1 * 2178309 + 1346269 2178309 = 1 * 1346269 + 832040 1346269 = 1 * 832040 + 514229 832040 = 1 * 514229 + 317811 514229 = 1 * 317811 + 196418 317811 = 1 * 196418 + 121393 196418 = 1 * 121393 + 75025 121393 = 1 * 75025 + 46368 75025 = 1 * 46368 + 28657 46368 = 1 * 28657 + 17711 28657 = 1 * 17711 + 10946 17711 = 1 * 10946 + 6765 10946 = 1 * 6765 + 4181 6765 = 1 * 4181 + 2584 4181 = 1 * 2584 + 1597 2584 = 1 * 1597 + 987 1597 = 1 * 987 + 610 987 = 1 * 610 + 377 610 = 1 * 377 + 233 377 = 1 * 233 + 144 233 = 1 * 144 + 89 144 = 1 * 89 + 55 89 = 1 * 55 + 34 55 = 1 * 34 + 21 34 = 1 * 21 + 13 21 = 1 * 13 + 8 13 = 1 * 8 + 5 8 = 1 * 5 + 3 5 = 1 * 3 + 2 3 = 1 * 2 + 1 2 = 2 * 1 + 0 Viimeinen nollasta eroava jakojäännös = 1 = syth 354224848179261915075, 218922995834555169026L. Huomautus. Koska tässä lineaarikombinaatio u a + v b = 1, saadaan u a 1 = v b, ts. u a ª 1 (mod b) ja näin ollen u ª a -1 (mod b). Salakirjoituksissa tällaisilla käänteisalkioilla on hyvin keskeinen merkitys, kuten tullaan näkemään. Tämän viimeisen esimerkin tapauksessa lauseke u a + v b on (83621143489848422977)*354224848179261915075 + ( 135301852344706746049)*218922995834555169026 = 1, joten 83621143489848422977 ª 354224848179261915075-1 (mod 218922995834555169026), ts. 83621143489848422977*354224848179261915075 ª 1 (mod 218922995834555169026).