A kiterjesztett euklideszi algoritmus az Euklideszi algoritmus kiterjesztése , amely az a és b egész számok legnagyobb közös osztóján (GCD) kívül Bezout-arány együtthatókat is kiszámít , azaz x és y egész számokat úgy, hogy
Az algoritmus az -t érvényesíti , mert a gcd az egyetlen szám, amely teljesíti az egyenletet és osztja a bemeneti számokat. Az algoritmus lehetővé teszi a és b hányadosának kiszámítását is a legnagyobb közös osztójukkal, szinte többletköltség nélkül.
A kiterjesztett euklideszi algoritmus egy nagyon hasonló algoritmusra is hivatkozik a polinomok legnagyobb közös osztójának kiszámítására , valamint két polinom Bezout-arány együtthatóinak kiszámítására egy változóban.
A kiterjesztett Euklidész algoritmus különösen akkor hasznos, ha a és b koprím . Ilyen feltételek mellett x a modulo b modulo reciproka , y pedig b modulo a modulus reciproka . Hasonlóképpen, a kibővített Euklidész-algoritmus polinomokra lehetővé teszi a reciprok kiszámítását algebrai kiterjesztésekben , és különösen nem egyszerű sorrendű véges mezőkben . Ezért mindkét kiterjesztett Euclid algoritmust széles körben használják a kriptográfiában . Különösen az inverz modulo kiszámítása lényeges lépés egy kulcspár származtatásához az RSA nyilvános kulcsú titkosítási módszerben.
A standard euklidészi algoritmust egymást követő osztásokkal hajtjuk végre maradékkal , miközben a hányadost nem használjuk, csak a maradékot őrizzük meg. A kiterjesztett algoritmus az osztás hányadosait is használja. Pontosabban, a standard euklideszi algoritmus az a és b számokra bemenetként abból áll , hogy hányadosok sorozatát és maradékok sorozatát számítják ki úgy, hogy
A maradékkal való osztás fő tulajdonsága , hogy a jobb oldali egyenlőtlenség határozza meg mind a for , mind az egyediségét
A számítás leáll, ha elérjük a nulla maradékot . A legnagyobb közös osztó ekkor egyenlő az utolsó nem nulla maradékkal
A kiterjesztett Euklidész algoritmus hasonlóan működik, de két másik sorozatot ad hozzá
A számítás is leáll, amikor és ennek eredményeként megkapjuk
Sőt, ha mind a , mind a b szám pozitív és , akkor
mert , ahol az x szám egész részét jelenti , vagyis azt a legnagyobb egész számot, amely nem haladja meg az x -et .
Ebből következik, hogy a kiterjesztett Euklidész algoritmus által adott Bezout-együttható pár a Bezout-együttható minimális párja , mivel ez az egyetlen pár, amely kielégíti mindkét fenti egyenlőtlenséget.
Ebből az is következik, hogy az algoritmust egész szám túlcsordulás veszélye nélkül végrehajthatja egy olyan program , amely rögzített méretű egész számokat használ, amelyek nagyobbak, mint a és b .
A következő táblázat bemutatja, hogyan működik a kiterjesztett Euklidész algoritmus a 240 és 46 bemeneti számokkal . A legnagyobb közös osztó az utolsó nem nulla elem, 2 a maradék oszlopban. A számítás a 6. sorban ér véget, mert a maradék 0 . A Bezout együtthatók az utolsó előtti sor utolsó két cellájában jelennek meg. Könnyen ellenőrizhető, hogy −9 × 240 + 47 × 46 = 2 . Végül az utolsó sor utolsó két értéke 23 és -120 egy előjelig a 46 és 240 bemeneti értékek hányadosa, osztva a legnagyobb közös osztóval 2 .
index i | hányados q i −1 | maradék r i | s i | t i |
---|---|---|---|---|
0 | 240 | egy | 0 | |
egy | 46 | 0 | egy | |
2 | 240 ÷ 46 = 5 | 240 − 5 × 46 = 10 | 1–5 × 0 = 1 _ _ | 0 − 5 × 1 = −5 |
3 | 46 ÷ 10 = 4 | 46 − 4 × 10 = 6 | 0 − 4 × 1 = −4 | 1–4 × –5 = 21 |
négy | 10 ÷ 6 = 1 | 10 − 1 × 6 = 4 | 1 - 1 × -4 = 5 | −5 − 1 × 21 = −26 |
5 | 6 ÷ 4 = 1 | 6 − 1 × 4 = 2 | −4 − 1 × 5 = −9 | 21 − 1 × −26 = 47 |
6 | 4 ÷ 2 = 2 | 4 − 2 × 2 = 0 | 5 − 2 × −9 = 23 | −26 − 2 × 47 = −120 |
Mivel a sorozat nemnegatív egész számok csökkenő sorozata ( i = 2-től kezdve). Ekkor az algoritmusnak egy ponton le kell állnia Ez azt bizonyítja, hogy az algoritmus végül leáll.
Mivel a legnagyobb közös osztója ugyanaz lesz és esetén Ez azt mutatja, hogy a bemenetek legnagyobb közös osztója ugyanaz lesz, mint a Ez azt bizonyítja, hogy a és b legnagyobb közös osztója . (Eddig a bizonyítás ugyanaz, mint a klasszikus Eukleidész algoritmusnál.)
Mivel és , i = 0 és 1 esetén van . Az összefüggést indukcióval bizonyítjuk mindenre :
Ezután és Bezout együtthatók.
Tekintsük a mátrixot
Az ismétlődő relációk mátrix alakban átírhatók
A mátrix az identitásmátrix, determinánsa pedig egy. A jobb szélső mátrix determinánsa itt −1. Ebből következik, hogy a determináns Konkrétan, mert van Ha ezt Bézout-relációnak tekintjük, akkor azt kapjuk, és coprime . A fenti összefüggés és Eukleidész lemmája azt mutatja, hogy b oszt , azaz valamilyen d egész számra . Az aránnyal osztva azt kapjuk, hogy így, és olyan másodlagos egész számok, amelyek a és b osztó hányadosai egy közös osztóval , amely a legnagyobb közös osztójuk vagy annak ellentéte .
Az utolsó állítás bizonyításához tegyük fel, hogy a és b pozitív és . Ekkor és ha látható, hogy a kiterjesztett algoritmusban az ( a , b ) s és t sorozatai a kezdő nullákig és egyesekig a ( b , a ) t és s sorozatai . A definíciók ezután azt mutatják, hogy az ( a , b ) eset a ( b , a ) esetre redukálódik . Így az általánosság elvesztése nélkül feltételezhetjük, hogy .
Látható, hogy egyenlő 1-gyel, és (ami miatt létezik ) negatív. Így előjelet változtat és abszolút értékben szigorúan nő, ami indukcióval következik a definícióból és abból, hogy -re . Az ügy teljesül, mert . Ugyanez igaz az első néhány kifejezés után is ugyanezen okokból. Sőt, könnyen belátható, hogy (ha a és b pozitív és ). Akkor
Ez, azzal a ténnyel együtt, hogy abszolút értékben nem kisebb, mint bármelyik korábbi , ill ., kiegészíti a bizonyítást.
Az egy változóban lévő polinomok, amelyek együtthatói egy mezőben vannak, minden hasonló módon működik, beleértve az Euklidész-osztást, a Bezout-relációt és a kiterjesztett Euklidész algoritmust. Az első különbség az, hogy az euklideszi felosztásban és az algoritmusban az egyenlőtlenséget a fokok egyenlőtlenségével kell helyettesíteni, a többi változatlan marad, csak az egész számokat polinomokra cseréljük.
A második különbség a kibővített Euklidész-algoritmus által megadott Bézout-együtthatók méretének határaiban rejlik, amelyek polinomok esetén pontosabbak, ami a következő tételhez vezet.
Ha a és b két nem nulla polinom, akkor a kiterjesztett euklideszi algoritmus egyedi polinompárt ( s , t ) ad , így
és
A harmadik különbség az, hogy polinomok esetében a legnagyobb közös osztó van definiálva egészen a nullától eltérő állandóval való szorzásig. Számos módja van a legnagyobb közös osztó egyedi meghatározásának.
A matematikában általában megkövetelik, hogy a legnagyobb közös osztó egy redukált polinom legyen . Ennek eléréséhez elegendő az eredmény minden elemét elosztani a vezető tényezővel , így ha a és b koprím, akkor a Bezout-egyenlőtlenség jobb oldalán 1-et kaphatunk. Ellenkező esetben nem nulla állandót kapunk. A számítógépes algebrában a polinomok általában egész együtthatókkal rendelkeznek, és a legnagyobb közös osztó normalizálásának ilyen módja nagy számú tört eredményez.
Egy másik módszer a legnagyobb közös osztó normalizálására egész együtthatók esetében az, hogy a kimeneti polinomot elosztjuk a polinom együtthatóinak gcd-jével, így kapunk egy primitív legnagyobb közös osztót. Ha a bemeneti polinomok másodprímek, akkor a normalizálás adja az 1 legnagyobb közös osztóját. Ennek a megközelítésnek a hátránya a nagyszámú törtszám, amelyet ki kell számítani és egyszerűsíteni kell.
A harmadik megközelítés a pszeudoreziduumok ( aleredmények ) közbenső sorozatainak kiszámítására szolgáló algoritmus kiterjesztése, hasonlóan az euklideszi algoritmus kiterjesztéséhez a kiterjesztett euklidészi algoritmusra. Ez lehetővé teszi, hogy egy egész együtthatós polinomtól kezdve egész együtthatós polinomokat kapjunk a számítási folyamat során. Ezenkívül minden számított maradék részeredmény marad. Különösen, ha a polinomok koprímek, akkor a Bézout-reláció átváltozik
ahol a és b eredőjét jelenti . _ Ebben a formában a Bezout-relációnak nincs nevezője a képletben. Ha mindent elosztunk az eredővel, akkor a klasszikus Bezout-relációt kapjuk explicit közös nevezővel a megjelenő racionális számokra.
A fenti algoritmus megvalósításához meg kell jegyezni, hogy minden lépésben csak az indexelt változók utolsó két értékére van szükség. Így a memória megtakarítása érdekében minden indexelt változót csak két változóval kell helyettesíteni.
Az egyszerűség kedvéért a következő algoritmus (és a cikkben szereplő többi algoritmus) párhuzamos hozzárendeléseket használ . Azon programozási nyelveken, amelyek nem támogatják ezt a funkciót, a párhuzamos hozzárendelést egy további változó használatával kell elvégezni. Például az első feladat
(régi_r, r) := (r, régi_r - hányados * r)egyenértékű
prov := r; r := régi_r - hányados × prov; old_r := prov;és hasonlóan más párhuzamos feladatokhoz. Ez a következő kódhoz vezet:
függvény extended_gcd(a, b) (régi_r, r) := (a, b) (régi_ek, s) := (1, 0) (régi_t, t) := (0, 1) míg r ≠ 0 do hányados := old_r div r (régi_r, r) := (r, régi_r − hányados × r) (régi_k, s) := (s, old_s − hányados × s) (régi_t, t) := (t, régi_t − hányados × t) kimenet "Bezout coefficients:", (old_s, old_t) kimenet "legnagyobb közös osztó:", old_r kimenet "hányadosok a gcd szerint:", (t, s)Az a-t és b -t a legnagyobb közös osztójukkal osztó hányadosok , amelyek szintén szerepelnek a kimenetben, rossz előjelűek lehetnek. Ez könnyen javítható a számítás végén, de a kód egyszerűsítése érdekében itt nem. Hasonlóképpen, ha a vagy b nulla, és a második szám negatív, a kimenet legnagyobb közös osztója negatív, ezért a kimenetben minden előjelet meg kell fordítani.
Végül megjegyezzük, hogy a Bezout reláció relatíve megoldható adott . Ekkor a fenti algoritmus optimalizálása csak a sorozatot számítja ki (ami a Bézout együtthatóhoz vezet ), és az algoritmus végén számítja ki az értéket:
függvény extended_gcd(a, b) s := 0; old_s := 1 r := b; old_r := a míg r ≠ 0 do hányados := old_r div r (régi_r, r) := (r, régi_r − hányados × r) (régi_k, s) := (s, old_s − hányados × s) ha b ≠ 0 , akkor bezout_t := (régi_r − old_s × a) div b else bezout_t := 0 kimenet "bezout coefficients:", (old_s, bezout_t) kimenet "legnagyobb közös osztó:", old_rEz azonban sok esetben nem lesz valódi optimalizálás - az előbbi algoritmus érzéketlen a túlcsordulásra, ha egész számokat használ a gépben (azaz olyan egész számokat, amelyeknek fix felső korlátja van a reprezentáción), az old_s * a szorzása a bezout_t kiszámításakor túlcsordulást okozhat , amely az optimalizálást csak olyan bemeneti adatokra korlátozza, amelyek nem haladják meg az egész számok maximális méretének felét. Ha korlátlan méretű egész számokat használunk, a szorzáshoz és osztáshoz szükséges idő négyzetesen növekszik az egész számok méretével. Ebből az következik, hogy az "optimalizálás" kis számok szorzási/osztási sorozatát egyetlen szorzással/osztással helyettesíti, ami több végrehajtási időt igényel, mint az általa helyettesített műveletek együttvéve.
Osztályabkanonikus egyszerűsített formában van, ha a és b koprím , és b pozitív. Ezt a kanonikus egyszerűsített formát úgy kaphatjuk meg, hogy a három kimeneti sort pszeudokóddal helyettesítjük
ha s = 0 , akkor "Osztás nullával" adjuk ki, ha s < 0 , akkor s := − s ; t := − t ( a nulla osztók elkerülése érdekében ) ha s = 1 , akkor a kimenet - t ( az 1 osztóinak elkerülése érdekében ) kimenet -t_ _sEnnek az algoritmusnak a bizonyítása azon a tényen alapul, hogy s és t két társprím egész szám, így , majd . A kanonikusan leegyszerűsített alak megszerzéséhez elegendő az előjelet megváltoztatni, hogy pozitív osztót kapjunk.
Ha b egyenlően osztja a egyet, akkor az algoritmus csak egy iterációt hajt végre, és az algoritmus végén s = 1 van. Ez az egyetlen eset, amikor a kimenet egész szám.
A kiterjesztett Euklideszi algoritmus fontos eszköze a reciprok kiszámításának moduláris struktúrákban, általában moduláris egész számokban és algebrai mezőbővítésekben . Ez utóbbi esetre fontos példa a nem egyszerű sorrendű véges mezők.
Ha n pozitív egész szám, a Z / n Z gyűrű azonosítható az osztás maradékainak {0, 1, ..., n -1} halmazával n maradékával , az összeadás és a szorzás a maradékot veszi fel. egész számok összeadása és szorzása eredményének osztása n -vel. Egy a Z / n Z elemnek van inverze (vagyis invertálható eleme ), ha n -hez képest relatív prím . Különösen, ha n prím , akkor a -nak van inverze, ha nem nulla (modulo n ). Vagyis Z / n Z akkor és csak akkor mező, ha n prím.
Bezout relációja kimondja, hogy a és n akkor és csak akkor koprím, ha vannak olyan s és t egész számok ,
Összehasonlítás modulo n ad
Ekkor t , pontosabban t n -nel való osztásának maradéka egyenlő egy n modulo reciprokával .
A kiterjesztett Eukleidész algoritmus ehhez a problémához való adaptálásához meg kell jegyezni, hogy nincs szükség n Bezout-együtthatójára , ezért nincs szükség kiszámítására. Ahhoz, hogy az eredményt n - nél kisebb pozitív számként kapjuk meg, használhatjuk azt a tényt is, hogy az algoritmus által megadott t egész szám kielégíti a relációt . Vagyis ha , akkor a végére n -t adhatunk . Ez pszeudokódot eredményez, ahol az n bemeneti érték 1-nél nagyobb egész szám.
function inverse(a, n) t := 0; newt := 1 r := n; newr := a while newr ≠ 0 do quotient := r div newr (t, newt) := (newt, t − quotient × newt) (r, newr) := (newr, r − quotient × newr) if r > 1 then return "не обратимо" if t < 0 then t := t + n return tA kiterjesztett Euclid algoritmus egyben a fő eszköz az algebrai mezőbővítések inverzeinek kiszámításához . Egy fontos eset, amelyet széles körben használnak a kriptográfiában és a kódoláselméletben , a nem egyszerű sorrendű véges mezők esete . Valójában, ha p egyszerű és q = p d , akkor a q rendű mező a prímmező algebrai kiterjesztése p elemmel, amelyet egy d fokú irreducibilis polinom gyöke alkot .
A d fokú irreducibilis p polinom gyökével generált K mező L algebrai kiterjesztése a hányadosgyűrűvel azonosítható, elemei pedig bijektív kapcsolatban állnak a d - nél kisebb polinomokkal . Az L -beli összeadás az összeadás polinomok. L -ben való szorzás a polinomok szorzatának maradékával való osztás maradéka . Így az L -beli aritmetika befejezéséhez már csak az inverz elemek kiszámításának módját kell meghatározni. Ez a kiterjesztett Euclid algoritmussal történik.
Az algoritmus nagyon hasonló a fenti moduláris inverz kiszámításához. Két fő különbség van - először is, az utolsó előtti sorra nincs szükség, mivel a kapott Bezout-együtthatók mindig egy fokkal kisebbek, mint d . Másodszor, a Legnagyobb közös osztó, amely akkor jön létre, ha a bemenetek koprím polinomok, a K bármely nullától eltérő eleme lehet . Ezt a Bézout-együtthatót (egy polinomnak általában pozitív foka van) meg kell szorozni ennek az elemnek a K -beli reciprokával . A pszeudokódban (lent) p egynél nagyobb fokú polinom, a pedig egy polinom.
function inverse(a, p) t := 0; newt := 1 r := p; newr := a while newr ≠ 0 do quotient := r div newr (r, newr) := (newr, r − quotient × newr) (t, newt) := (newt, t − quotient × newt) if degree(r) > 0 then return "Either p is not irreducible or a is a multiple of p" return (1/r) × t PéldaPéldául a polinom határozza meg a végső mezőt , és legyen az az elem, amelynek az inverze megtalálható. Ezután az algoritmus működése az alábbi táblázatban látható. Emlékezzünk vissza, hogy egy sorrendi mezőben - z = z és z + z = 0 a mező bármely vagy z elemére . Mivel az 1 a GF(2) egyetlen nem nulla eleme, nincs szükség a pszeudokód utolsó sorának módosítására.
lépés | magán | r, újabb | s, hírek | t, gőte |
---|---|---|---|---|
egy | 0 | |||
0 | egy | |||
egy | egy | |||
2 | ||||
3 | x +1 | |||
négy | x +1 |
Így az inverz elem , amit megerősítünk, ha a két elemet megszorozzuk , és az eredményből a maradékot p fölé vesszük .
Kettőnél több szám esetét iteratívan kezelheti. Először is mutassuk meg . A bizonyíték kedvéért tegyük fel . Definíció szerint a gcd a és osztója . Aztán néhányért . Hasonlóképpen , osztó , így egyeseknél . Hadd . Szerkezet szerint , de mivel ez a legnagyobb osztó, invertálható eleme a -nek . És mivel , az eredmény bizonyított.
Így, ha , azaz, és , úgy, hogy , így a végső egyenlet az lesz
Az n számhoz való lépéshez indukciót használunk
Számelméleti algoritmusok | |
---|---|
Egyszerűség tesztek | |
Prímszámok keresése | |
Faktorizáció | |
Diszkrét logaritmus | |
GCD keresése | |
Modulo aritmetika | |
Számok szorzása és osztása | |
A négyzetgyök kiszámítása |