Euklideszi algoritmus

A Wikipédiából, a szabad enciklopédiából
Euclideszi algoritmus az AB és CD kiindulási szakaszok legnagyobb közös osztójának megtalálására. A két szakaszt egy egység többszöröseként határozták meg, tehát a legnagyobb közös osztójuk létezik. Mivel a CD szakasz rövidebb, ezért megméri vele az AB-t, de csak egyszer fér rá, és marad az AE szakasz. Az AE szakasszal megméri a CD szakaszt, kétszer fér rá, és marad a CF szakasz. Ezután a CF szakasszal megméria az AE szakaszt. Mivel nincs maradék, így a legnagyobb közös osztó CF. Jobb oldalon Nicomachus példája a 49 és 21 számokkal; a legnagyobb közös osztó a 7 (Heath 1908:300)

Az euklideszi algoritmus[1] egy számelméleti algoritmus, mellyel két szám legnagyobb közös osztója határozható meg.

Nevét az ókori görög matematikusról, Eukleidészről kapta, aki az Elemekben írta le (Kr. e. 300 körül). Az egyik legrégibb, gyakran használt algoritmus. Használható törtek egyszerűsítésére a lehetséges legegyszerűbb alakra, de számos számelméleti és kriptográfiai algoritmus is tartalmazza.

Alapötlete az, hogy a legnagyobb közös osztó nem változik, ha a nagyobb számot a két szám különbségével helyettesítjük. Például 252 és 105 legnagyobb közös osztója 21, ami legnagyobb közös osztója a 105 és a 147 = 252 − 105 számoknak is. Ez a tény Bézout-azonosságként ismert. Ez a helyettesítés csökkenti a nagyobb számot, így a cserék ismétlésével egyre kisebb számokat kapunk, egészen addig, amíg a két szám egyenlővé nem válik. Ez az eddigi számpárok, így az eredeti számpár legnagyobb közös osztója. Az algoritmus lépésein visszafelé menve találunk két egész (akár negatív) tényezőt, amik felhasználásával a legnagyobb közös osztó kifejezhető a két kiindulási szám lineáris kombinációjaként.

Ha feltesszük, hogy a kivonások és a maradékos osztások ideje körülbelül megegyezik, akkor az algoritmusnak van egy gyorsabb változata is, ami a kivonások helyett maradékos osztással működik. Ennek lényege, hogy ha a nagyobb szám sokkal nagyobb, mint a kisebb, akkor sok kivonást kell elvégezni addig, amíg a két szám szerepe felcserélődik. A maradékképzés művelete ezt a sok kivonást egy lépésben végzi el. Az algoritmus akkor ér véget, amikor a maradék nulla lesz. Ekkor a legnagyobb közös osztó éppen a kisebb szám. Ezzel az algoritmus lépésszáma a kisebb szám logaritmusával arányossá válik (a tízes számrendszerbeli jegyek számának ötszöröse). Ezt Gabriel Lamé bizonyította 1844-ben, és ez jelzi a bonyolultságelmélet kezdetét. A 20. század folyamán további optimalizációt végeztek.

Az algoritmusnak számos alkalmazása van. A törtek egyszerűsítése mellett a moduláris aritmetika osztás műveletének megvalósításában is szerepel. Szerepel az internet biztonságát szolgáló protokollokban, és a nagy összetett számok faktorizálásának egyes módszereiben. Használható diofantoszi egyenletek megoldására, mint amilyen például a kínai maradéktételben szereplő szimultán kongruenciarendszer. Alkalmas lánctörtbe fejtéshez és irracionális számok közelítéséhez. Végül, de nem utolsósorban számelméleti tételek bizonyításának is hasznos segédeszköze; felhasználja a négynégyzetszám-tétel és a számelmélet alaptétele.

Eredetileg egész számokra és szakaszokra használták, de a 19. században általánosították Gauss-egészekre és egy változós polinomokra. Ez a modern absztrakt algebra kialakulását eredményezte

Háttere[szerkesztés]

"Magas, keskeny téglalap négyzetrácsra osztva. A téglalap két négyzet széles és öt négyzet magas."
Egy 24-szer 60-as téglalapot tíz 12-szer 12-es négyzet fed le, ahol 12 is 24 és 60 legnagyobb közös osztója. Általában, egy a-szor b-s téglalap akkor és csak akkor fedhető le c oldalú négyzetekkel, ha c közös osztója a-nak és b-nek.

Az algoritmus alapesetben természetes számok legnagyobb közös osztóját számítja ki, ami a legnagyobb olyan természetes szám, ami mindkettőnek osztója. Az a és b számok legnagyobb közös osztóját lnko(a, b), vagy egyszerűbben, (a, b),[2] habár ez utóbbival más matematikai objektumokat is szoktak jelölni, például vektorokat.

Ha lnko(a, b) = 1, akkor a két szám relatív prím.[3] Ebből nem következik, hogy a két szám prím,[4] vagy egyikük prím, habár két különböző prímszám relatív prím. Az egy minden egészhez relatív prím, de például 35 és 6 is relatív prímek: 6 = 2 × 3 és 35 = 5 × 7. Mivel nincsenek közös prímtényezőik, csak az egy osztója mindkét számnak.

Legyen g = lnko(a, b). Mivel a és b többszöröse g-nek, azért ezek felírhatók, mint a = mg, és b = ng. Az m és az n számok relatív prímek, különben ki lehetne emelni belőlük a legnagyobb közös osztót, így kiderülne, hogy az a és b számoknak van g-nél nagyobb közös osztójuk, tehát g nem legnagyobb közös osztó. A legnagyobb közös osztó a közös osztók többszöröse.[5]

A legnagyobb közös osztó megjeleníthető a következőképpen:[6] Legyenek egy téglalap oldalai a és b hosszúak. Ekkor a téglalap felosztható c oldalhosszú négyzetrácsra, ha c közös osztója a-nak és b-nek. A legnagyobb közös osztó a lehető legnagyobb szám, amire ez lehetséges. Például a 24-szer 60-as téglalap felosztható a következő méretű négyzetekre: 1, 2, 3, 4, 6 és 12 oldalhosszúakra, amelyek közül a legnagyobb a 12. Ekkor az egyik oldal irányában 2, a másik irányában 5 négyzet van.

A legnagyobb közös osztó a prímtényezős felbontásból is megállapítható, mert a közös prímtényezők összeszorzásával állítható elő, ahol is a kitevő a két szám kanonikus alakjában szereplő minimális kitevő.[7] Például 1386 = 2 × 3 × 3 × 7 × 11, és 3213 = 3 × 3 × 3 × 7 × 17, legnagyobb közös osztójuk 63 = 3 × 3 × 7. Ha a számoknak nincsenek közös prímtényezőik, akkor relatív prímek, legnagyobb közös osztójuk 1. A prímtényezős felbontás megtalálása nehéz, amit a kriptográfia ki is használ.[8] Az euklideszi algoritmusnak az az előnye, hogy enélkül képes meghatározni a legnagyobb közös osztót.[9][10]

A legnagyobb közös osztó egy másik definíciója a felsőbb matematikában, közelebbről a gyűrűelméletben hasznos.[11] Két, nullától különböző egész szám legnagyobb közös osztója a legkisebb, egész együtthatókkal előállítható lineáris kombinációjuk; azaz, a és b legnagyobb közös osztója felírható, mint ua + vb, ahol u és v akár negatív egészek. Az összes lineáris kombináció a legnagyobb közös osztó többszöröse. Ezek a legnagyobb közös osztó által generált főideál elemei, ami így megegyezik az a és a b által generált ideállal. Következik, hogy az egészek minden ideálja főideál. Egyes tulajdonságok könnyebben láthatók ezzel, például hogy a és b minden közös osztója g-nek is osztója, hiszen ua + vb mindkét tagjának osztója.

Három vagy több szám legnagyobb közös osztója a prímtényezős felbontásból is megállapítható, mert a közös prímtényezők összeszorzásával állítható elő, ahol is a kitevő a számok kanonikus alakjában szereplő minimális kitevő.[12] Kiszámítható úgy is, hogy először vesszük két szám legnagyobb közös osztóját, majd ezt a két számot a legnagyobb közös osztójukkal helyettesítve ezt addig ismételjük, amíg egyetlen szám nem marad.[13] A legnagyobb közös osztó szimmetrikus és asszociatív.

lnko(a, b, c) = lnko(a, lnko(b, c)) = lnko(lnko(a, b), c) = lnko(lnko(a, c), b).

Emiatt az euklideszi algoritmussal nemcsak két, hanem akárhány, de véges sok szám legnagyobb közös osztója is kiszámítható.

Formális leírása[szerkesztés]

Az euklideszi algoritmus egymást követő lépései az előző lépés eredményéből indulnak ki. A lépéseket a k index számolja nullától kezdődően. Így a kezdőlépés a k = 0, a következő lépés a k = 1 indexet használja, és így tovább.

Minden lépés az rk−1 és rk−2 maradékokat használja. Mivel a maradékok folyamatosan csökkennek, azért rk−1 kisebb, mint rk−2. A cél az, hogy találjunk egy qk hányadost és egy rk maradékot, amivel az

egyenlőség teljesül. Szavakkal, a nagyobb rk−2 számból a kisebb rk−1 többszöröseit vonja le, amíg egy még kisebb rk számhoz nem jut.

A (k = 0) kezdőlépésben az r−2 és r−1 számok megfeleltethetők a kiindulási számoknak. A következő lépésben (k = 1) a kisebb kezdőszám és a nulladik lépésben kapott r0 maradékot használja, és így tovább. Így az algoritmus írható, mint az

egyenletek sorozata.

Ha a kisebb szám az a, akkor az első lépésben az algoritmus felcseréli a számokat. Például, ha a < b, akkor az első q0 hányados nulla lesz, és a maradék r0 = a. Ettől kezdve az rk maradék mindig kisebb lesz, mint az előző rk−1 maradék minden k ≥ 0 indexre. Mivel a maradékok minden lépésben csökkennek, és sosem lehetnek negatívok, így előbb-utóbb lesz egy maradék, rN = 0.[14] Az utolsó nem nulla maradék lesz a legnagyobb közös osztó. Az N nem lehet végtelen, mert csak véges sok egész van a nulla és az első r0 maradék között.

Bizonyítás[szerkesztés]

Az algoritmus érvényessége két lépésben bizonyítható.[15]

Első lépésként lássuk be, hogy az algoritmus véges sok lépés után véget ér. Ennek főleg gyakorlati szempontok miatt van szerepe. Mivel az euklideszi osztás során a maradék kisebb, mint az osztó abszolútértéke, a maradékok szigorúan monoton csökkenő sorozatot alkotnak a természetes számok halmazában, így a sorozat utolsó tagja biztosan nulla, mivel két különböző természetes szám különbsége nem lehet kisebb 1-nél (természetesen az abszolút értékét tekintve):

A következő lépés, hogy bebizonyítjuk: az utolsó maradék közös osztó. Ehhez alulról felfelé haladunk az eljárásban:

Mivel osztója -nek és -nek is, ezért a lineáris kombinációjuknak is. Az eljárást végigkövetve kapjuk, hogy és .[16][17]

Végül bizonyítjuk a maximalitást. Ennek során kihasználjuk azt a tényt, hogy a közös osztók egy szigorúan monoton növekvő természetes számsort alkotnak, aminek felső határa , valamint hogy a lánc minden tagja osztója az utána következőnek. Tegyük fel, hogy a legnagyobb közös osztó . Ekkor, mivel is közös osztó, . Viszont, mivel a közös osztók osztói a két szám lineáris kombinációinak is, így a lánc elemeire felírva kapjuk:

  • .
  • .

Mivel a feltételünk az volt, hogy osztója -nek, ezért az oszthatóság definíciója miatt . QED

Példa[szerkesztés]

Animáció, ami egyre kisebb négyzetekkel fed le egy téglalapot.
Az euklideszi algoritmus megjelenítése. A kiindulási téglalap méretei a = 1071 és b = 462. Az első két négyzet mérete 462×462, és a kimaradó téglalapé 462×147. Ezt 147×147 négyzetekkel fedi, amíg ki nem marad egy 21×147-es téglalap, amit 21×21 négyzetek teljesen lefednek. A legkisebb méret, 21, a 1071 és 462 legnagyobb közös osztója

A 360 és a 225 legnagyobb közös osztójának meghatározása az euklideszi algoritmussal:

Tehát a legnagyobb közös osztó a 45.

Az a = 1071 és b = 462. Először 1071-ből levonogatjuk 462-t, amíg annál kisebb számot nem kapunk. Kétszer kell levonnunk, és marad 147:

1071 = 2 × 462 + 147.

Most 462-ből vonogatjuk ki 147 többszöröseit, és marad 21:

462 = 3 × 147 + 21.

Ezután 21-et vonogatunk le 147-ből, és a maradék 0 lesz:

147 = 7 × 21 + 0.

Mivel az utolsó maradék nulla, azért az algoritmus szerint a legnagyobb közös osztó a 21. Ez megegyezik azzal, amit prímtényezős felbontással találhatunk. Táblázattal:

k Egyenlet Hányados és maradék
0 1071 = q0 462 + r0 q0 = 2 és r0 = 147
1 462 = q1 147 + r1 q1 = 3 és r1 = 21
2 147 = q2 21 + r2 q2 = 7 és r2 = 0; az algoritmus befejeződik

Megjelenítése[szerkesztés]

Az algoritmus megjeleníthető a legnagyobb közös osztó fent részletezett tulajdonsága alapján. Az a × b méretű téglalapot megpróbáljuk lefedni a kisebb számnak megfelelő méretű négyzetekkel, amiből a kisebb szám × r0 méretű téglalap marad. Ezután ezt r0 méretű négyzetekkel, majd a kimaradt területet r1 méretű négyzetekkel próbáljuk lefedni, és így tovább. Ha az összes területet lefedte, akkor az algoritmus véget ér, és a legkisebb méretű négyzet mérete lesz a legnagyobb közös osztó.

Az osztásos módszer[szerkesztés]

Az osztásos módszerben a maradékos osztás definíciója alapján vannak olyan számok, hogy rk−2 = qk rk−1 + rk, ahol a maradék szigorúan kisebb, mint az osztó. A maradék és a hányados egyértelmű.

Az osztásos módszer csökkenti a lépések számát. Ha nem akarjuk kifejezni a legnagyobb közös osztót lineáris kombinációként, akkor nincs szükség a hányadosokra. Ezzel egy lépés alakja: rk = rk−2 mod rk−1.

Az abszolútértékben legkisebb maradék módszere[szerkesztés]

Ebben a módszerben az algoritmus minden lépésben eggyel növeli a hányadost, ha a negatív maradék abszolútértéke kisebb, mint a pozitív maradék.[18][19] Az általános algoritmus felteszi, hogy az

rk−2 = qk rk−1 + rk

egyenletben |rk−1| > rk > 0. Ezzel szemben kiszámítható egy negatív maradék is:

rk−2 = (qk + 1) rk−1 + ek

ha rk−1 > 0, vagy

=rk−2 = (qk − 1) rk−1 + ek,

ha rk−1 < 0.

Ha rk helyett az algoritmus ek-t veszi, ha |ek| < |rk|, akkor teljesülni fog, hogy: |rk| ≤ |rk−1| / 2

Leopold Kronecker belátta, hogy az összes változat közül ennek a lépésszáma a legkisebb[18][19] , minden a, b kiinduló számpárra akkor és csak akkor minimális a lépésszám, ha qk-t úgy választja, hogy , ahol az aranymetszés.[20]

Tulajdonságok[szerkesztés]

"Színes egyenesek indulnak ki sugarasan az  x-y koordinátarendszer origójából. Az egyes egyenesek azokat a pontokat tartalmazzák, amelyeknek ugyanannyi lépésszámra van szükségük az algoritmus befejezéséhez."
Az euklideszi algoritmus lépéseinek száma az lnko(x,y) kiszámítására. A piros és sárga pontok kevés, a kék és a lila pontok sok lépést jeleznek. A legsötétebb egyenes az y = Φx, vonalát követik, ahol Φ az aranymetszés.
  • Az algoritmus visszafejtésével a legnagyobb közös osztó előállítható a két szám lineáris kombinációjaként:

ezzel a lineáris diofantoszi egyenletek megoldhatóságára is feltételeket szabhatunk.

  • Az algoritmus a leggyorsabban akkor ér véget, ha .
  • Az algoritmus a szomszédos Fibonacci-számok esetén rendkívül lassú, ennek oka, hogy végigfut visszafelé a teljes sorozaton. A sorozat ugyanis szigorúan monoton növekvő, valamint a definíció szerint
ami megfelel a maradékos osztás definíciójának.
  • Szakaszok esetén is értelmezhető a maradékos osztás, így az euklideszi algoritmus is elvégezhető. Itt azonban nem tudjuk biztosítani az eljárás véges hosszát. Ha ez teljesül, akkor a két szakasz összemérhető.

Programkód[szerkesztés]

Alábbiakban láthatunk egy C programnyelven írt megvalósítást:

#include <stdio.h>
int lnko(int a, int b){
    int temp;
    while(b>0){
        temp = b;
        b = a%b;
        a = temp;
    }
    return a;
}
int main(void){
    int s1, s2;

    printf("szam1 szam2: ");
    scanf("%d %d", &s1, &s2);

    printf("lnko(%d, %d)=%d", s1, s2, lnko(s1, s2));
    return 0;
}

A k-adik iterációban a b változó tartalmazza rk−1-et, míg az a a megelőzőt, rk−2-t. A b = a%b; lépés megfelel a fenti rkrk−2 mod rk−1 formulának. A temp változó a rk−1 értékét tartalmazza az rk kiszámítása közben. A ciklus végén b tartalmazza rk-t, és a az előző maradékot, rk−1-et.[21]

A definícióhoz hűen megvalósítható az algoritmus rekurzióval is, ezt egy Java nyelvű példával szemléltethetjük:

class GreaterCommonDivider{
    public static int gcd(int a, int b){
        if(a%b == 0){
            return b;
        } else {
            return gcd(b, a%b);
    }

    public static void main(String args[]){
        if(args.length != 2){
            System.exit(1);
        }
        System.out.println( gcd( Integer.parseInt( args[0] ), Integer.parseInt( args[1] ) ) );
        System.exit(0);
    }
}

A rekurzió azt használja ki,[22] hogy a maradékképzés során megmarad a legnagyobb közös osztó, és a megállási feltétel lnko(rN−1, 0) = rN−1. Például az lnko(1071, 462) kiszámítható azzal, hogy lnko(462, 1071 mod 462) = lnko(462, 147). Ez ugyanaz, mint lnko(147, 462 mod 147) = lnko(147, 21), azaz lnko(21, 147 mod 21) = lnko(21, 0) = 21.

A kivonásos változatban maradékképzés helyett ismételt kivonás szerepel.[23] Az osztásos módszerrel szemben ez csak pozitív számokra működik, és megáll, ha a = b. Pszeudokódja:

function gcd(a, b)
    while a ≠ b 
        if a > b
           a := a − b; 
        else
           b := b − a; 
    return a;

Az a és b változók felváltva tárolják a maradékokat. Feltéve, hogy az elején az a a nagyobb, a = rk−2, mivel rk−2 > rk−1. Az adott iterációban az a változót az előző maradék többszöröseivel csökkenti, amíg a kisebbé nem válik, mint b. Ekkor a = rk, és a szerepek megcserélődnek, amivel az rk+1 maradékot számolja ki, majd újabb szerepcsere, és így tovább.

Matematikai alkalmazások[szerkesztés]

Bézout-lemma[szerkesztés]

A Bézout-lemma szerint az a és a b számok legnagyobb közös osztója előállítható, mint g = sa + tb, ahol s és t egész számok.[24] In other words, it is always possible to find integers s and t such that g = sa + tb.[25][26]

Az s és a t a q0, q1, … hányadosokból számítható, az algoritmus megfordításával.[27] Elindulva visszafelé, g kifejetzhető a qN−1 hányadossal és a két korábbi rN−2 és rN−3 maradékkal:

g = rN−1 = rN−3qN−1 rN−2 .

Ezek a maradékok hasonlóan írhatók fel:

rN−2 = rN−4qN−2 rN−3 és
rN−3 = rN−5qN−3 rN−4 .

Visszahelyettesítve kapjuk a g legnagyobb közös osztót mint rN−4 és rN−5 lineáris kombinációját. Ezt folytatjuk, amíg el nem érünk az első két számhoz:

r2 = r0q2 r1
r1 = bq1 r0
r0 = aq0 b.

Az összes r0, r1, … maradék helyettesítése után kifejezzük g-t, mint a és b lineáris összegét: g = sa + tb. A Bézout-lemma és az euklideszi algoritmus általánosítható az euklideszi tartományokra.

Főideálok és a hozzájuk kapcsolódó problémák[szerkesztés]

A Bézout-lemma egy újabb definíciót ad a legnagyobb közös osztóra.[11] Tekintsük azokat a számokat, amelyek kifejezhetők ua + vb alakban, ahol u, v egészek. Mivel a és b is osztható g-vel, azért ezek a számok is oszthatók lesznek g-vel. Más szavakkal, a halmaz minden eleme többszöröse g-nek, ami a és b összes közös osztójára igaz, de a g az egyetlen közös osztó, ami eleme ennek a halmaznak, mivel a Bézout-lemma által megadott egészek megfelelnek. Egy kisebb közös osztó nem lehet a halmazban, mivel annak minden eleme osztható kell, hogy legyen g-vel. Továbbá a legnagyobb közös osztó minden többszöröse kifejezhető lineáris kombinációként, u = ms és v = mt választással, ahol s és t a Bézout-lemma által megadott egészek. Ez látható, ha a lemma egyenletét megszorozzuk m-mel:

mg = msa + mtb.

Ezért az ua + vb alakú számok halmaza megegyezik g többszöröseinek halmazával. Azaz két egész egész együtthatós lineáris kombinációinak halmaza megegyezik legnagyobb közös osztójuk többszöröseinek halmazával. A gyűrűelméletben azt mondják, hogy a legnagyobb közös osztó a két szám által generált ideál generátora. Ez vezetett a főideál és a főideálgyűrű fogalmához.

Ez alapján egy további probléma is megoldható. Az öntögetési feladatokban adva van két edény, a és b űrtartalommal. Egy harmadik, elég nagy térfogatú edényben hozzátöltéssel és elvétellel bármely ua + vb űrtartalom kimérhető. Ezek mind g = lnko(ab) többszörösei.

Kiterjesztett euklideszi algoritmus[szerkesztés]

A kiterjesztett algoritmus a legnagyobb közös osztó mellett a Bézout-lemmában szereplő együtthatókat is számolja. Ez két rekurzív egyenletet ad az algoritmushoz:[28]

sk = sk−2qksk−1
tk = tk−2qktk−1

ahol a kezdőértékek:

s−2 = 1, t−2 = 0
s−1 = 0, t−1 = 1.

A rekurzióval az s = sN és t = tN, ahol N+1 az algoritmus utolsó lépése, amikor rN+1 = 0.

A megközelítés helyessége teljes indukcióval bizonyítható. Feltesszük, hogy az algoritmus helyesen működik a k − 1. lépésig, azaz

rj = sj a + tj b

minden k-nál kisebb j-re. A k-adik lépésből adódik, hogy

rk = rk−2qkrk−1.

Mivel a rekurziós képlet korrekt rk−2 és rk−1 esetén, ez kifejezhető s és t segítségével:

rk = (sk−2 a + tk−2 b) − qk(sk−1 a + tk−1 b

Átrendezve kapjuk a rekurziós képletet k-ra: rk = sk a + tk b = (sk−2qksk−1) a + (tk−2qktk−1) b'.

Mátrix módszer[szerkesztés]

A kiterjesztett algoritmusban szereplő s és t megtalálható az ekvivalens mátrix módszerrel is.[29]

Az algoritmus egyenletei

a = q0 b + r0
b = q1 r0 + r1
rN−2 = qN rN−1 + 0

írhatók úgy is, hogy egy kétszer kettes mátrixot megszorozzuk a két dimenziós maradékvektorral:

Reprezentáljuk az összes hányadosmátrix szorzatát M-mel:

ezzel az algoritmus a következő alakra egyszerűsödik:

Ahhoz, hogy a g legnagyobb közös osztót kifejezzük, az egyenlet mindkét oldalát meg kell szorozni M inverzével.[29][30] Az M inverze létezik, hiszen determinánsa (−1)N+1, mivel megegyezik a hányadosmátrixok determinánsainak szorzatával, amelyek mindegyike mínusz egy. Ekkor az egyenlet megoldása:

Az első egyenlet szerint

=g = (−1)N+1 ( m22 am12 b),

így s = (−1)N+1m22 és t = (−1)Nm12. Hatékonysága megegyezik a rekurzív algoritmusformáéval.

Eukleidész lemmája és az egyértelmű prímtényezős felbontás[szerkesztés]

A Bézout-egyenlőség lényeges szerepet kap az euklideszi algoritmus több alkalmazásában, például az egyértelmű prímtényezőkre bontásban.[31] Ennek bemutatására: Legyen az L szám két tényező szorzata, L = uv. Ekkor, ha L osztható egy w számmal, és ez relatív prím u-hoz, akkor osztója v-nek. Ez a következő gondolatmenettel belátható: Ha u és w relatív prímek, akkor van s és t, hogy

1 = su + tw 

a Bézout-egyenlőség miatt. Az egyenletet v-vel szorozva:

v = suv + twv = sL + twv 

Mivel w a jobb oldal minden tagjának osztója, azért osztója kell, hogy legyen a bal oldalnak.[32]

Speciálisan, ha egy prímszám osztója L-nek, akkor L valamelyik tényezőjének is osztója kell, hogy legyen. Egy másik megfordítás szerint, ha a1, a2, …, an relatív prímek w-hez, akkor szorzatuk is relatív prím w-hez.[32]

Mindezekkel már könnyen belátható a prímtényezős felbontás egyértelműsége[33] Tegyük fel indirekt, hogy az L egész számnak két lényegileg különböző prímtényezős felbontásában m, illetve n tényező szerepel, azaz

L = p1p2pm = q1q2qn .

Mivel minden p osztója L-nek, azért legalább egy q-nak osztójának kell lennie; de mivel prím, ezért lényegében meg kell vele egyeznie. Minden p-t és q-t megvizsgálva mindegyik prímnek megtaláljuk a másik oldalon a lényegi megfelelőjét. Ez ellentmondás, így lényegében egyértelmű a felbontás, eltekintve a prímek sorrendjétől és előjelétől.

Lineáris diofantoszi egyenletek[szerkesztés]

"Átló a bal felső sarokból a jobb alsóba. Az átló mentén tizenöt kör helyezkedik el egymástól egyenlő távolságra. Az ortogonális koordinátarendszer x-y tengelyei a bal alsó sarokból indulnak; az egyenes az y tengelyt a bal felső és az x tengelyt a jobb alsó sarokban metszi."
A 9x + 12y = 483 diofantoszi egyenlet megoldásai. A megoldásokat kék körök jelzik

A diofantoszi egyenletek azok, amiknek megoldásaként csak egész számok fogadhatók el. A név a Kr. e. 3. századi Diofantoszra utal.[34] A lineáris két ismeretlenes alakja

ax + by = c

A diofantoszi egyenletben a, b, c, x és y egész számok, és a, b és c adottak.[35] Moduláris aritmetikával:

axc mod b.

Legyen g az a és a b legnagyobb közös osztója. Ekkor ax + by mindkét tagja osztható g-vel, így az egyenlet csak akkor oldható meg, ha c is osztható g-vel. Ekkor mindkét oldalt leosztva c/g-vel visszajutunk a Bezout-egyenlethez:

sa + tb = g

ahol s és t a kiterjesztett euklideszi algoritmussal található meg.[36] Innen kapunk egy megoldást: x1 = s (c/g) és y1 = t (c/g).

Egy lineáris diofantoszi egyenletnek vagy nincs megoldása, vagy végtelen sok megoldása van.[37] Ennek belátására legyen két megoldás az (x1y1) és az (x2y2), ahol

ax1 + by1 = c = ax2 + by2

vagy ekvivalenesen

a(x1x2) = b(y2y1).

Emiatt a két x közötti legkisebb különbség b/g, és az y megoldások közötti legkisebb különbség a/g. Ezzel a megoldások:

x = x1bu/g
y = y1 + au/g

Ha megegedett, hogy u befussa az egészeket, akkor egy megoldásból végtelen sok nyerhető.

Ha a megoldásokat a pozitív egészekre korlátozzuk, akkor ez véges megoldásszámot ad. Ezzel a korláttal a lineáris diofantoszi egyenletrendszerek még alulhatározva is véges számú megoldást adnak.[38] Ez különbözik attól az esettől, amikor a megengedett megoldások nemcsak egészek lehetnek.

Multiplikatív inverzek és az RSA[szerkesztés]

A testek algebrai struktúrák, amelyekben értelmezve van az összeadás, a kivonás, a szorzás és az osztás a szokásos tulajdonságaikkal. A véges testek alaphalmaza véges számú elemet tartalmaz. Például a 13 elemű test értelmezhető modulo 13, és elemei a {0, 1, 2, …, 12} maradékosztályokkal reprezentálhatók, vagy minden művelet eredményét redukálni kell a {0, 1, 2, …, 12} számokra. például 5 × 7 = 35 mod 13 = 9. Ha p prímszám, akkor hasonlóan konstruálható a p elemszámú (rendű) test. Ezek bővítésével konstruálhatók a q = p m rendű testek. A véges testekre gyakran Galois-testekként hivatkoznak, Évariste Galois emlékére.

Ha q prímhatvány, akkor minden nullától különböző a elem invertálható. Az a inverzét a−1 jelöli, mivel aa−1 = a−1a ≡ 1 mod q. Az inverz előállítható a ax ≡ 1 mod q kongruenciából kiindulva,[39] vagy megoldva az ekvivalens[40]

ax + qy = 1.

diofantoszi egyenletet, ami megoldható a fent leírt módon.

Az inverzek előállítása lényeges az RSA algoritmus számára, amit az elektronikus kereskedelemben használnak. Az egyenlet azt az egészet határozza meg, amivel az üzenet visszafejthető.[41] Ugyan az RSA gyűrűk fölött működik, de az invertálható elemek inverze itt is megtalálható az euklideszi algoritmussal.

További alkalmazások a hibajavító kódok, alternatívát jelent a Berlekamp–Massey algoritmusra a BCH és a Reed–Solomon kód dekódolásában, amelyek Galois-testeken alapulnak.[42]

Kínai maradéktétel[szerkesztés]

Az euklideszi algoritmus használatával lineáris diofantoszi egyenletrendszerek oldhatók meg.[43] A kínai maradéktétel éppen ilyen egyenletrendszerekkel foglalkozik. Ha a szám egy megadott határnál kisebb, akkor ábrázolható a jegyei helyett relatív prím modulusokkal vett maradékaival:

ahol mi-k[44] az egyes modulusok, és xi a hozzájuk tartozó maradékok.

Az egyenletrendszer megoldásához ki kell számítani az x egész számot, illetve maradékosztályt modulo M, ahol M a modulusok szorzata. Legyen most Mi a következő:

Ekkor minden Mi a modulusok szorzata, kivéve az mi modulust. A megoldás azon múlik, hogy találjunk hi számokat, hogy

Ezekkel a hi számokkal minden, M-nél kisebb egész x rekonstruálható maradékaiból az

egyenlet alapján. Definíciójuk szerint a hi számok az Mi inverzei, amik kiszámíthatók az euklideszi algoritmussal.

Stern–Brocot fa[szerkesztés]

Az euklideszi algoritmussal a pozitív racionális számok halmaza végtelen bináris keresőfába rendezhető, amit Stern–Brocot fának neveznek. A gyökérnél helyezkedik el az 1, a többi szám helye a számláló és a nevező legnagyobb közös osztójának kiszámításával határozható meg az euklideszi algoritmus eredetzi formája szerint. Ha a két szám közül az elsőt kell helyettesíteni, akkor jobbra kell lépni, ha a másodikat, akkor balra. Ha az algoritmusnak vége, akkor a számot helyben találjuk.[45] A lépések nem függnek attól, hogy a szám milyen alakban van. Ez arra használható, hogy belássuk, a pozitív racionális számok egyszer jelennek meg a fában.

A Stern–Brocot fa, és a legfeljebb 4 rendű Stern–Brocot sorozatok

Például a 3/4 eléréséhez egyet balra, majd kettőt jobbra kell lépni:

Az euklideszi algoritmusnak hasonló a kapcsolata a Calkin–Wilf fával, de ott az irány fordított: a számtól elindulva kell eljutni az egyhez.

Lánctörtek[szerkesztés]

Az euklideszi algoritmus kapcsolatba hozható a lánctörtekkel.[46] Az egyenletek írhatók úgy is, mint

Megfigyelhető, hogy a jobb oldal utolsó tagja a bal oldal inverze. Így az első két egyenlet írható úgy is, mint

A harmadik egyenletben behelyettesítve az r1/r0 hányadossal:

Az rk/rk−1 végső arány helyettesíthető a következő egyenlet szerint, egészen az utolsó egyenletig. A végeredmény egy lánctört:

A fenti példában, amiben kiszámítottuk az lnko(1071, 462) legnagyobb közös osztót, a hányadosok rendre 2, 3 és 7 voltak. Így az 1071/462 lánctört alakja:

amiről ellenőrző számolással is meggyőződhetünk.

Faktorizáció[szerkesztés]

A legnagyobb közös osztó kiszámítása több faktorizáló algoritmus lényegi eleme,[47] így tartalmazza Pollard rhó algoritmusa,[48] Shor algoritmusa,[49] Dixon faktorizációs módszere[50] és a Lenstra elliptikus görbe faktorizáció.[51] Ezekben az euklideszi algoritmus a legnagyobb közös osztó megtalálására szolgál. A lánctört faktorizáció lánctörteket használ, amik az euklideszi algoritmussal számíthatók ki.[52]

Általánosításai[szerkesztés]

Habár az algoritmus eredeti alakjában a természetes számok legnagyobb közös osztóját számítja ki, általánosítható több különböző matematikai objektumra is, mint racionális számok, polinomok,[53] kvadratikus egészek,[54] és Hurwitz-kvaterniók.[55] Az utóbbi esetben az euklideszi algoritmussal bizonyítható az egyértelmű faktorizáció, ami prím elemek helyett felbonthatatlanok szorzatára való lényegében egyértelmű felbontást jelenti.

Racionális számok[szerkesztés]

Már Euklidész is leírta az Elemek című könyvében a racioális számok euklideszi algoritmusát, ami azt a legnagyobb racionális számot keresi, aminek mindkét racionális szám többszöröse. Ha az egyik szám a, a másik b, akkor van m és n egész szám, amivel a = mg és b = ng.[56] Ezek ugyanúgy találhatók meg, mint az egészeknél az s és a t együtthatók, amikkel sa + tb = 0. Euklidész ezt az algoritmust használta a nem összemérhető szakaszok tanulmányozására.[57][58]

A racionális számok euklideszi algoritmusa abban különbözik az egészektől, hogy a maradék lehet tört, de a hányadosnak egésznek kell lennie. Ha mindkét szám racionális, akkor az algoritmus előbb-utóbb véget ér, hiszen a közös mértékegység létezik, ami közös nevezőre hozással belátható. Valós számokra rátérve ha azonban egyik, vagy mindkettő irracionális, akkor az algoritmus nem ér véget, ami végtelen lánctörtként írható le. A maradékokat itt is rk jelöli, a hányadosok qk-k. Az a/b = mg/ng = m/n tört lánctört alakja: [q0; q1, q2, …, qN]. Ha az a/b arány irracionális, akkor végtelen lánctörtet kapunk, aminek lánctört alakja [q0; q1, q2, …].[59] Például az aranymetszés arányszáma φ = [1; 1, 1, …], és a 2 négyzetgyöke [1; 2, 2, …].[60]

Valós számokon az algoritmus leállása nulla valószínűségű, ugyanis majdnem minden valós szám irracionális..[61] A lánctörtek kezdeti szakaszai (k lépés után [q0; q1, q2, …, qk]) közelítést adnak az irracionális számokra, ami hosszabb kezdeti szakasszal javítható. A közelítés egyszerű tört alakra hozva éppen mk/nk, amik konvergens sorozatot alkotnak. A számláló és a nevező relatív prím, és a következő rekurzív szabály érvényes rájuk:

mk = qk mk−1 + mk−2 és
nk = qk nk−1 + nk−2

ahol m−1 = n−2 = 1 és 'm−2 = n−1 = 0 a rekurzió kezdőértékei. Az mk/nk konvergens sorozat a legjobb racionális számokból álló közelítő sorozat az a/b-hez az nk nevezővel:[62]

Polinomok[szerkesztés]

Az egy változós polinomok adott gyűrű fölött gyűrűt alkotnak. A gyűrű lehet például az egész számok, a racionális vagy a valós számok. Az ezek fölötti polinomok azok, amelyeknek együtthatói az adott számkörből valók, így az egész, a racionális és a valós együtthatós polinomok összeadhatók, kivonhatók és szorozhatók, és az eredmény polinomok együtthatói is a megfelelő számkörből valók. Definiálható a maradékos osztás is.

A polinomok körében a prímszámok megfelelői a felbonthatatlanok, más néven irreducibilis polinomok. Két polinom, a(x) és b(x) legnagyobb közös osztója az egész számokhoz hasonlóan definiálható az irreducibilis felbontásuk segítségével, és meghatározható az euklideszi algoritmussal.[53]

Az eljárás hasonlít az egészekéhez. A k-adik lépésben a 'qk(x) hányados és az rk(x) maradék polinom eleget tesz az

rk−2(x) = qk(x) rk−1(x) + rk(x)

rekurzív egyenletnek, ahol r−2(x) = a(x) és r−1(x) = b(x). A hányados polinom qk(x) rk−1 együtthatóját úgy választják, hogy megegyezzen rk−2(x) legmagasabb fokú tagjával; ez biztosítja, hogy a maradékok foka csökkenjen. Ezzel belátható, hogy az euklideszi algoritmus véget ér. Az utolsó nem nulla maradék lesz a polinomok legnagyobb közös osztója.

Például vegyük a következő, másodfokú polinomok szorzatára bomló polinomokat:

'a(x) = x4 − 4x3 + 4 x2 − 3x + 14 = (x2 − 5x + 7)(x2 + x + 2 és
b(x) = x4 + 8x3 + 12x2 + 17x + 6 = (x2 + 7x + 3)(x2 + x + 2).

Az első maradék az a(x) / b(x) osztást elvégezve r0(x) = x3 + (2/3) x2 + (5/3) x − (2/3). A következő lépésben b(x)-et osztjuk r0(x)-szel, és maradékként r1(x) = x2 + x + 2 adódik. Végül az r0(x) osztás r1(x)-szel nullát ad maradékul, így az algoritmus véget ér.

Jegyzetek[szerkesztés]

  1. A matematikus nevének szabatos átírása Eukleidész volna, tehát a szerkezet eukleidészi algoritmus, de ebben a kifejezésben hagyományosan rögzült euklideszi alakban (lásd például Püthagorasz, de Pitagorasz-tétel stb.).
  2. Stark 1978, p. 16
  3. Stark 1978, p. 21
  4. LeVeque 1996, p. 32
  5. LeVeque 1996, p. 31
  6. Grossman, J. W.. Discrete Mathematics. New York: Macmillan, 213. o (1990). ISBN 0-02-348331-8 
  7. Schroeder 2005, pp. 21–22
  8. Schroeder 2005, pp. 216–219
  9. Schroeder 2005, p. 19
  10. Excursions in number theory. New York: Oxford University Press, 27–29. o (1966) 
  11. ^ a b LeVeque 1996, p. 33
  12. Stark 1978, p. 25
  13. Ore 1948, pp. 47–48
  14. Stark 1978, p. 18
  15. Stark 1978, pp. 16–20
  16. Knuth 1997, p. 320
  17. Discrete Mathematics: Elementary and Beyond. New York: Springer-Verlag, 100–101. o (2003). ISBN 0-387-95584-4 
  18. ^ a b Ore 1948, p. 43
  19. ^ a b Stewart, B. M.. Theory of Numbers, 2nd, New York: Macmillan, 43–44. o (1964) 
  20. Lazard, D. (1977.). „Le meilleur algorithme d'Euclide pour K[X] et Z”. Comptes Rendus Acad. Sci. Paris 284, 1–4. o.  
  21. Knuth 1997, pp. 319–320
  22. Stillwell 1997, p. 14
  23. Knuth 1997, pp. 318–319
  24. Bezout's Identity, Elementary Number Theory. New York: Springer-Verlag, 7–11. o (1998) 
  25. Rosen 2000, p. 81
  26. Cohn 1962, p. 104
  27. Rosen 2000, p. 91
  28. Rosen 2000, pp. 90–93
  29. ^ a b Koshy, T.. Elementary Number Theory with Applications. Burlington, MA: Harcourt/Academic Press, 167–169. o (2002). ISBN 0-12-421171-2 
  30. Algorithmic number theory. Cambridge, MA: MIT Press, 70–73. o (1996). ISBN 0-262-02405-5 
  31. Stark 1978, pp. 26–36
  32. ^ a b Ore 1948, p. 44
  33. Stark 1978, pp. 281–292
  34. Rosen 2000, pp. 119–125
  35. Schroeder 2005, pp. 106–107
  36. Schroeder 2005, pp. 108–109
  37. Rosen 2000, pp. 120–121
  38. Stark 1978, p. 47
  39. Schroeder 2005, pp. 107–109
  40. Stillwell 1997, pp. 186–187
  41. Schroeder 2005, p. 134
  42. Moon, T. K.. Error Correction Coding: Mathematical Methods and Algorithms. John Wiley and Sons, 266. o (2005). ISBN 0-471-64800-0 
  43. Rosen 2000, pp. 143–170
  44. Schroeder 2005, pp. 194–195
  45. Concrete mathematics. Addison-Wesley, 123. o (1989) 
  46. Vinogradov, I. M.. Elements of Number Theory. New York: Dover, 3–13. o (1954) 
  47. Crandall & Pomerance 2001, pp. 225–349
  48. Knuth 1997, pp. 369–371
  49. Shor, P. W. (1997.). „Polynomial-Time Algorithms for Prime Factorization and Discrete Logarithms on a Quantum Computer”. SIAM Journal on Scientific and Statistical Computing 26, 1484. o. DOI:10.1137/s0097539795293172.  
  50. Dixon, J. D. (1981.). „Asymptotically fast factorization of integers”. Math. Comput. 36 (153), 255–260. o. DOI:10.2307/2007743.  
  51. Lenstra, H. W., Jr. (1987.). „Factoring integers with elliptic curves”. Annals of Mathematics 126 (3), 649–673. o. DOI:10.2307/1971363.  
  52. Knuth 1997, pp. 380–384
  53. ^ a b Lang, S.. Algebra, 2nd, Menlo Park, CA: Addison–Wesley, 190–194. o (1984). ISBN 0-201-05487-6 
  54. Forráshivatkozás-hiba: Érvénytelen <ref> tag; nincs megadva szöveg a(z) weinberger nevű ref-eknek
  55. Forráshivatkozás-hiba: Érvénytelen <ref> tag; nincs megadva szöveg a(z) stillwell151-152 nevű ref-eknek
  56. Forráshivatkozás-hiba: Érvénytelen <ref> tag; nincs megadva szöveg a(z) Weil_1983 nevű ref-eknek
  57. A History of Mathematics, 2nd, New York: Wiley, 116–117. o (1991). ISBN 0-471-54397-7 
  58. Cajori, F,. A History of Mathematics. New York: Macmillan, 70. o (1894). ISBN 0-486-43874-0 
  59. Joux, Antoine. Algorithmic Cryptanalysis. CRC Press, 33. o (2009). ISBN 9781420070033 
  60. Mathematical Omnibus: Thirty Lectures on Classic Mathematics. American Mathematical Society, 13. o (2007). ISBN 9780821843161 
  61. Darling, David. The Universal Book of Mathematics: From Abracadabra to Zeno's Paradoxes. John Wiley & Sons, 175. o (2004). ISBN 9780471667001 
  62. Williams, Colin P.. Explorations in Quantum Computing. Springer, 277–278. o (2010). ISBN 9781846288876 

Hivatkozások[szerkesztés]

  • D. E. Knuth: A számítógépprogramozás művészete 1. Alapvető algoritmusok, Műszaki Könyvkiadó, Budapest, 2. kiadás, 1994, ISBN 963 1600750, 25-34. o.