Salausmenetelmät / Osa I Veikko Keränen, Jouko Teeriaho (RAMK, 2006)

Samankaltaiset tiedostot
Liite 1. Laajennettu Eukleideen algoritmi suoraviivainen tapa

Salausmenetelmät. Veikko Keränen, Jouko Teeriaho (RAMK, 2006)

2. Eukleideen algoritmi

Salausmenetelmät LUKUTEORIAA JA ALGORITMEJA. Veikko Keränen, Jouko Teeriaho (RAMK, 2006) 3. Kongruenssit. à 3.4 Kongruenssien laskusääntöjä

Salausmenetelmät. Veikko Keränen, Jouko Teeriaho (RAMK, 2006)

R : renkaan R kääntyvien alkioiden joukko; R kertolaskulla varustettuna on

Tekijä Pitkä Matematiikka 11 ratkaisut luku 2

Salausmenetelmät. Veikko Keränen, Jouko Teeriaho (RAMK, 2006)

802328A LUKUTEORIAN PERUSTEET OSA III BASICS OF NUMBER THEORY PART III. Tapani Matala-aho MATEMATIIKKA/LUTK/OULUN YLIOPISTO

802328A LUKUTEORIAN PERUSTEET OSA III BASICS OF NUMBER THEORY PART III

811120P Diskreetit rakenteet

1 Lukujen jaollisuudesta

Matematiikan mestariluokka, syksy

Diofantoksen yhtälön ratkaisut

811120P Diskreetit rakenteet

2 j =

3. Kongruenssit. 3.1 Jakojäännös ja kongruenssi

Valitse kuusi tehtävää! Kaikki tehtävät ovat 6 pisteen arvoisia.

= 3 = 1. Induktioaskel. Induktio-oletus: Tehtävän summakaava pätee jollakin luonnollisella luvulla n 1. Induktioväite: n+1

LUKUTEORIA johdantoa

Matematiikan tukikurssi, kurssikerta 5

(d) 29 4 (mod 7) (e) ( ) 49 (mod 10) (f) (mod 9)

Esitetään tehtävälle kaksi hieman erilaista ratkaisua. Ratkaisutapa 1. Lähdetään sieventämään epäyhtälön vasenta puolta:

Johdatus lukuteoriaan Harjoitus 2 syksy 2008 Eemeli Blåsten. Ratkaisuehdotelma

Algebra I, harjoitus 5,

Matematiikassa väitelauseet ovat usein muotoa: jos P on totta, niin Q on totta.

a k+1 = 2a k + 1 = 2(2 k 1) + 1 = 2 k+1 1. xxxxxx xxxxxx xxxxxx xxxxxx

Induktiota käyttäen voidaan todistaa luonnollisia lukuja koskevia väitteitä, jotka ovat muotoa. väite P(n) on totta kaikille n = 0,1,2,...

Lukuteorian kertausta

Juuri 11 Tehtävien ratkaisut Kustannusosakeyhtiö Otava päivitetty

Diskreetin matematiikan perusteet Laskuharjoitus 2 / vko 9

on Abelin ryhmä kertolaskun suhteen. Tämän joukon alkioiden lukumäärää merkitään

Jäännösluokat. Alkupala Aiemmin on tullut sana jäännösluokka vastaan. Tarkastellaan

A = a b B = c d. d e f. g h i determinantti on det(c) = a(ei fh) b(di fg) + c(dh eg). Matriisin determinanttia voi merkitä myös pystyviivojen avulla:

Kannan vektorit siis virittävät aliavaruuden, ja lisäksi kanta on vapaa. Lauseesta 7.6 saadaan seuraava hyvin käyttökelpoinen tulos:

R 1 = Q 2 R 2 + R 3,. (2.1) R l 2 = Q l 1 R l 1 + R l,

Salausmenetelmät. Veikko Keränen, Jouko Teeriaho (RAMK, 2006)

7 Vapaus. 7.1 Vapauden määritelmä

Miten osoitetaan joukot samoiksi?

2.1. Tehtävänä on osoittaa induktiolla, että kaikille n N pätee n = 1 n(n + 1). (1)

Vapaus. Määritelmä. jos c 1 v 1 + c 2 v c k v k = 0 joillakin c 1,..., c k R, niin c 1 = 0, c 2 = 0,..., c k = 0.

Tee konseptiin pisteytysruudukko! Muista kirjata nimesi ja ryhmäsi. Lue ohjeet huolellisesti!

MS-A0402 Diskreetin matematiikan perusteet

811120P Diskreetit rakenteet

a b 1 c b n c n

4 Matemaattinen induktio

Vaihtoehtoinen tapa määritellä funktioita f : N R on

Johdatus diskreettiin matematiikkaan Harjoitus 5, Ratkaise rekursioyhtälö

Matematiikan johdantokurssi, syksy 2016 Harjoitus 11, ratkaisuista

JOHDATUS LUKUTEORIAAN (syksy 2017) HARJOITUS 3, MALLIRATKAISUT

Rekursio. Funktio f : N R määritellään yleensä antamalla lauseke funktion arvolle f (n). Vaihtoehtoinen tapa määritellä funktioita f : N R on

(iv) Ratkaisu 1. Sovelletaan Eukleideen algoritmia osoittajaan ja nimittäjään. (i) 7 = , 7 6 = = =

Johdatus matematiikkaan

Testaa taitosi 1: Lauseen totuusarvo

4.3. Matemaattinen induktio

Tämän luvun tarkoituksena on antaa perustaidot kompleksiluvuilla laskemiseen sekä niiden geometriseen tulkintaan. { (a, b) a, b œ R }

Matriisi-vektori-kertolasku, lineaariset yhtälöryhmät

2017 = = = = = = 26 1

Vapaus. Määritelmä. Vektorijono ( v 1, v 2,..., v k ) on vapaa eli lineaarisesti riippumaton, jos seuraava ehto pätee:

Algebra I Matematiikan ja tilastotieteen laitos Ratkaisuehdotuksia harjoituksiin 6 (8 sivua) OT. 1. a) Määritä seuraavat summat:

Algebran perusteet. 44 ϕ(105) = (105). Näin ollen

Johdatus matemaattiseen päättelyyn

811312A Tietorakenteet ja algoritmit , Harjoitus 2 ratkaisu

Ortogonaalisen kannan etsiminen

Koodausteoria, Kesä 2014

802118P Lineaarialgebra I (4 op)

7. Olemassaolo ja yksikäsitteisyys Galois n kunta GF(q) = F q, jossa on q alkiota, määriteltiin jäännösluokkarenkaaksi

Todistusmenetelmiä Miksi pitää todistaa?

LUKUTEORIAN ALKEET HELI TUOMINEN

Kanta ja Kannan-vaihto

Konvergenssilauseita

Johdatus matemaattiseen päättelyyn

TAMPEREEN YLIOPISTO Pro gradu -tutkielma. Liisa Ilonen. Primitiiviset juuret

Lineaarikombinaatio, lineaarinen riippuvuus/riippumattomuus

ja λ 2 = 2x 1r 0 x 2 + 2x 1r 0 x 2

Determinantti 1 / 30

Demo 1: Simplex-menetelmä

1 Tätä dokumenttia, Ketjumurtoluvuista.pdf, saa levittää vain yhdessä lähdekoodinsa

f(n) = Ω(g(n)) jos ja vain jos g(n) = O(f(n))

Matriisit ovat matlabin perustietotyyppejä. Yksinkertaisimmillaan voimme esitellä ja tallentaa 1x1 vektorin seuraavasti: >> a = 9.81 a = 9.

Tenttiin valmentavia harjoituksia

4. Eulerin ja Fermat'n lauseet

Vektoreiden virittämä aliavaruus

(2n 1) = n 2

Ohjelmoinnin perusteet Y Python

Avaruuden R n aliavaruus

Lineaarialgebra a, kevät 2018 Harjoitusta 5 Maplella

Ristitulolle saadaan toinen muistisääntö determinantin avulla. Vektoreiden v ja w ristitulo saadaan laskemalla determinantti

1. Mikä on lukujen 10, 9, 8,..., 9, 10 summa? 2. Mikä on lukujen 10, 9, 8,..., 9, 10 tulo? =?

Derivaatat lasketaan komponenteittain, esimerkiksi E 1 E 2

Kaikki kurssin laskuharjoitukset pidetään Exactumin salissa C123. Malliratkaisut tulevat nettiin kurssisivulle.

Ortogonaalinen ja ortonormaali kanta

Rollen lause polynomeille

Lineaariset kongruenssiyhtälöryhmät

d Z + 17 Viimeksi muutettu

Lukuteoria. Eukleides Aleksandrialainen (n. 300 eaa)

802354A Algebran perusteet Luentorunko Kevät Työryhmä: Markku Niemenmaa, Kari Myllylä, Topi Törmä

1 Lineaariavaruus eli Vektoriavaruus

Matematiikan peruskurssi 2

Diskreetin matematiikan perusteet Laskuharjoitus 1 / vko 8

Transkriptio:

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).