Utvidet euklidisk algoritme - Extended Euclidean algorithm

I aritmetikk og dataprogrammering er den utvidede euklidiske algoritmen en utvidelse til den euklidiske algoritmen , og beregner, i tillegg til den største fellesdeleren (gcd) av heltall a og b , også koeffisientene til Bézouts identitet , som er heltall x og y slik at

Dette er en sertifiseringsalgoritme , fordi gcd er det eneste tallet som samtidig kan tilfredsstille denne ligningen og dele inngangene. Det lar en også beregne, med nesten ingen ekstra kostnad, kvotientene til a og b av deres største fellesdeler.

Utvidet euklidisk algoritme refererer også til en veldig lik algoritme for å beregne den polynomiske største fellesdeleren og koeffisientene for Bézouts identitet til to univariate polynomer .

Den utvidede euklidiske algoritmen er spesielt nyttig når a og b er coprime . Med denne bestemmelsen er x den modulære multiplikative inverse av en modulo b , og y er den modulære multiplikative inverse av b modulo a . På samme måte tillater den polynomiske utvidede euklidiske algoritmen en å beregne den multiplikative inverse i algebraiske feltutvidelser og spesielt i endelige felt av ikke -primær orden. Det følger at begge utvidede euklidiske algoritmer er mye brukt i kryptografi . Spesielt er beregningen av den modulære multiplikative inverse et vesentlig trinn i avledningen av nøkkelpar i RSA -krypteringsmetoden for offentlig nøkkel.

Beskrivelse

Den standard euklidiske algoritmen fortsetter med en rekke euklidiske divisjoner hvis kvoter ikke brukes. Bare resten beholdes. For den utvidede algoritmen brukes de påfølgende kvotientene. Nærmere bestemt består den standard euklidiske algoritmen med a og b som inngang i å beregne en sekvens av kvotienter og en sekvens av rester slik at

Det er hovedegenskapen til den euklidiske inndelingen at ulikhetene til høyre definerer unikt og fra og

Beregningen stopper når man når en rest som er null; den største fellesdeleren er da den siste ikke -null resten

Den utvidede euklidiske algoritmen fortsetter på samme måte, men legger til to andre sekvenser, som følger

Beregningen stopper også når og gir

  • er den største fellesdeleren for input og
  • Bézout -koeffisientene er og det er
  • Kvotientene til a og b av deres største fellesdeler er gitt av og

Videre, hvis a og b er begge positive og , da

for hvor betegner den integrerte delen av x , det er det største heltallet ikke større enn x .

Dette innebærer at paret av Bézouts koeffisienter levert av den utvidede euklidiske algoritmen er det minimale paret av Bézout -koeffisienter, som det unike paret som tilfredsstiller begge ulikhetene ovenfor.

Det betyr også at algoritmen kan utføres uten et heltallsoverløp av et dataprogram ved hjelp av heltall med en fast størrelse som er større enn a og b .

Eksempel

Tabellen nedenfor viser hvordan den utvidede euklidiske algoritmen fortsetter med input 240 og 46 . Den største fellesdeleren er den siste ikke -null oppføringen, 2 i kolonnen "resten". Beregningen stopper på rad 6, fordi resten i den er 0 . Bézout-koeffisienter vises i de to siste oppføringene i den nest siste raden. Faktisk er det lett å bekrefte at −9 × 240 + 47 × 46 = 2 . Til slutt er de to siste oppføringene 23 og -120 i den siste raden, opp til tegnet, kvotientene til inndata 46 og 240 med den største fellesdeleren 2 .

indeks i kvotient q i −1 Resten r i s jeg t i
0 240 1 0
1 46 0 1
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
4 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

Bevis

Siden sekvensen til er en synkende sekvens av ikke -negative heltall (fra i = 2 på). Dermed må den stoppe med noen Dette beviser at algoritmen stopper til slutt.

Som den største fellesdeleren er den samme for og Dette viser at den største fellesdeleren for inngangen er den samme som for Dette viser at det er den største fellesdeleren for a og b . (Inntil dette punktet er beviset det samme som for den klassiske euklidiske algoritmen.)

Som og vi har for i = 0 og 1. Forholdet følger ved induksjon for alle :

Således og er Bézout -koeffisienter.

Vurder matrisen

Gjentagelsesforholdet kan skrives om i matriseform

Matrisen er identitetsmatrisen og dens determinant er en. Determinanten for matrisen til høyre i den foregående formelen er -1. Det følger at determinanten for er Spesielt, for vi har Ser på dette som en Bézouts identitet, dette viser det og er coprime . Forholdet som er bevist ovenfor og Euklids lemma viser at deler b og deler a . Ettersom de er coprime, er de, opp til deres tegn, kvotientene til b og a av deres største fellesdeler.

For å bevise den siste påstanden, antar du at a og b er både positive og . Deretter, og hvis , kan det sees at s- og t -sekvensene for ( a , b ) under EØS er opp til de første 0- og 1 -tallene, t- og s -sekvensene for ( b , a ). Definisjonene viser da at ( a , b ) saken reduseres til ( b , a ) saken. Så anta det uten tap av generalitet.

Det kan sees at er 1 og (som eksisterer ved ) er et negativt heltall. Deretter er det alternative i tegn og streng økning i størrelse, som følger induktivt av definisjonene og det faktum at for , gjelder saken fordi . Det samme gjelder etter de første termene, av samme grunn. Videre er det lett å se det (når a og b er både positive og ). Og dermed,

Dette, ledsaget av det faktum som er større enn eller lik i absolutt verdi enn noen tidligere eller henholdsvis fullførte bevis.

Polynom utvidet euklidisk algoritme

For univariate polynomer med koeffisienter i et felt fungerer alt på samme måte, euklidisk divisjon, Bézouts identitet og utvidet euklidisk algoritme. Den første forskjellen er at i den euklidiske divisjonen og algoritmen må ulikheten erstattes av en ulikhet i gradene. Ellers forblir alt som foregår i denne artikkelen det samme, ganske enkelt ved å erstatte heltall med polynom.

En annen forskjell ligger i grensen for størrelsen på Bézout -koeffisientene levert av den utvidede euklidiske algoritmen, som er mer nøyaktig i polynomtilfellet, noe som fører til følgende teorem.

Hvis a og b er to ikke -null polynomer, produserer den utvidede euklidiske algoritmen det unike paret med polynomer ( s , t ) slik at

og

En tredje forskjell er at i polynom -tilfellet er den største fellesdeleren definert bare opp til multiplikasjonen med en ikke -null konstant. Det er flere måter å definere utvetydig en største fellesdeler.

I matematikk er det vanlig å kreve at den største fellesdeleren er et monisk polynom . For å få dette, er det tilstrekkelig å dele hvert element i utgangen med den ledende koeffisienten til Dette tillater at hvis a og b er coprime, får man 1 på høyre side av Bézouts ulikhet. Ellers kan man få en hvilken som helst ikke-null konstant. I datamaskinalgebra har polynomene vanligvis heltallskoeffisienter, og denne måten å normalisere den største fellesdeleren innfører for mange fraksjoner for å være praktisk.

Den andre måten å normalisere den største fellesdeleren når det gjelder polynomer med heltallskoeffisienter, er å dele hver utgang med innholdet i for å få en primitiv største felles divisor. Hvis inngangspolynomene er coprime, gir denne normaliseringen også en største felles divisor lik 1. Ulempen med denne tilnærmingen er at mange fraksjoner skal beregnes og forenkles under beregningen.

En tredje tilnærming består i å utvide algoritmen til subresultante pseudo-rest-sekvenser på en måte som ligner utvidelsen av den euklidiske algoritmen til den utvidede euklidiske algoritmen. Dette gjør at når du starter med polynom med heltallskoeffisienter, har alle polynomene som er beregnet heltallskoeffisienter. Videre er hver beregnet rest et subresultant polynom . Spesielt hvis inngangspolynomene er coprime, blir Bézouts identitet

hvor betegner resultatet av a og b . I denne formen for Bézouts identitet er det ingen nevner i formelen. Hvis man deler alt med den resulterende får man den klassiske Bézouts identitet, med en eksplisitt fellesnevner for de rasjonelle tallene som vises i den.

Pseudokode

For å implementere algoritmen som er beskrevet ovenfor, bør man først bemerke at bare de to siste verdiene til de indekserte variablene er nødvendig i hvert trinn. For å lagre minne må hver indekserte variabel derfor erstattes av bare to variabler.

For enkelhets skyld bruker følgende algoritme (og de andre algoritmene i denne artikkelen) parallelle oppgaver . I et programmeringsspråk som ikke har denne funksjonen, må parallelle oppgaver simuleres med en hjelpevariabel. For eksempel den første,

(old_r, r) := (r, old_r - quotient * r)

tilsvarer

prov := r;
r := old_r - quotient × prov;
old_r := prov;

og tilsvarende for de andre parallelle oppgavene. Dette fører til følgende kode:

function extended_gcd(a, b)
    (old_r, r) := (a, b)
    (old_s, s) := (1, 0)
    (old_t, t) := (0, 1)
    
    while r ≠ 0 do
        quotient := old_r div r
        (old_r, r) := (r, old_r − quotient × r)
        (old_s, s) := (s, old_s − quotient × s)
        (old_t, t) := (t, old_t − quotient × t)
    
    output "Bézout coefficients:", (old_s, old_t)
    output "greatest common divisor:", old_r
    output "quotients by the gcd:", (t, s)

Kvotientene til a og b av deres største fellesdeler, som sendes ut, kan ha et feil tegn. Dette er lett å korrigere på slutten av beregningen, men har ikke blitt gjort her for å forenkle koden. På samme måte, hvis enten a eller b er null og den andre er negativ, er den største fellesdeleren som er utgang negativ, og alle tegnene på utgangen må endres.

Legg til slutt merke til at i Bézouts identitet, kan man løse for gitt . Således er en optimalisering til algoritmen ovenfor å bare beregne sekvensen (som gir Bézout -koeffisienten ), og deretter beregne på slutten:

function extended_gcd(a, b)
    s := 0;    old_s := 1
    r := b;    old_r := a
         
    while r ≠ 0 do
        quotient := old_r div r
        (old_r, r) := (r, old_r − quotient × r)
        (old_s, s) := (s, old_s − quotient × s)
    
    if b ≠ 0 then
        bezout_t := (old_r − old_s × a) div b
    else
        bezout_t := 0
    
    output "Bézout coefficients:", (old_s, bezout_t)
    output "greatest common divisor:", old_r

Imidlertid er dette i mange tilfeller egentlig ikke en optimalisering: mens den tidligere algoritmen ikke er utsatt for overløp når den brukes med maskintall (det vil si heltall med en fast øvre grense for sifre), multiplisering av old_s * a ved beregning av bezout_t kan flyte over, og begrense denne optimaliseringen til innganger som kan representeres på mindre enn halvparten av den maksimale størrelsen. Når du bruker heltall med ubegrenset størrelse, vokser tiden som trengs for multiplikasjon og divisjon kvadratisk med størrelsen på heltallene. Dette innebærer at "optimaliseringen" erstatter en sekvens av multiplikasjoner/divisjoner av små heltall med en enkelt multiplikasjon/divisjon, noe som krever mer beregningstid enn operasjonene den erstatter, samlet.

Forenkling av brøk

En brøkdel en/ber i kanonisk forenklet form hvis a og b er coprime og b er positiv. Denne kanoniske forenklede formen kan oppnås ved å erstatte de tre utgangslinjene i den foregående pseudokoden med

if s = 0 then output "Division by zero"
if s < 0 then s := −s;  t := −t   (for avoiding negative denominators)
if s = 1 then output -t        (for avoiding denominators equal to 1)
output -t/s

Beviset for denne algoritmen er avhengig av det faktum at s og t er to koprime -heltall, slik som + bt = 0 , og dermed . For å få den kanoniske forenklede formen er det nok å flytte minustegnet for å ha en positiv nevner.

Hvis b deler a jevnt, utfører algoritmen bare en iterasjon, og vi har s = 1 på slutten av algoritmen. Det er det eneste tilfellet der utgangen er et heltall.

Beregning av multiplikative inverser i modulære strukturer

Den utvidede euklidiske algoritmen er det essensielle verktøyet for å beregne multiplikative inverser i modulære strukturer, vanligvis de modulære heltallene og de algebraiske feltutvidelsene . Et bemerkelsesverdig eksempel på sistnevnte tilfelle er de endelige feltene i ikke-primær orden.

Modulære heltall

Hvis n er et positivt heltall, kan ringen Z / n Z identifiseres med settet {0, 1, ..., n -1} av resten av den euklidiske divisjonen med n , addisjonen og multiplikasjonen består i å ta resten med n av resultatet av tillegg og multiplikasjon av heltall. Et element a av Z / n Z har en multiplikativ invers (det vil si at det er en enhet ) hvis det er kopi til n . Særlig hvis n er primtall , en har en multiplikativ invers hvis den ikke er null (modulo n ). Dermed er Z / n Z et felt hvis og bare hvis n er primtall.

Bézouts identitet hevder at a og n er coprime hvis og bare hvis det finnes heltall s og t slik at

Å redusere denne identiteten modulo n gir

Således er t , eller, mer nøyaktig, resten av divisjonen av t med n , multiplikativ invers av en modulo n .

For å tilpasse den utvidede euklidiske algoritmen til dette problemet, bør man bemerke at Bézout -koeffisienten til n ikke er nødvendig, og derfor ikke trenger å beregnes. For å få et resultat som er positivt og lavere enn n , kan man også bruke det faktum at heltallet t gitt av algoritmen tilfredsstiller | t | < n . Det vil si at hvis t <0 , må man legge n til det på slutten. Dette resulterer i pseudokoden, der inngangen n er et heltall større enn 1.

 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 "a is not invertible"
    if t < 0 then
        t := t + n

    return t

Enkle algebraiske feltutvidelser

Den utvidede euklidiske algoritmen er også hovedverktøyet for å beregne multiplikative inverser i enkle algebraiske feltutvidelser . Et viktig tilfelle, mye brukt i kryptografi og kodingsteori , er det for endelige felt av ikke-primær orden. Faktisk, hvis p er et primtall, og q = p d , er rekkefølge q en enkel algebraisk forlengelse av primfeltet til p -elementer, generert av en rot av et ureduserbart polynom med grad d .

En enkel algebraisk forlengelse L av et felt K , generert av roten til et ureduserbart polynom p av grad d, kan identifiseres til kvoteringsringen , og dens elementer er i bijektiv korrespondanse med polynomene av grad mindre enn d . Tilsetningen i L er tillegg av polynom. Multiplikasjonen i L er resten av den euklidiske divisjonen med p av produktet av polynomer. For å fullføre aritmetikken i L gjenstår det bare å definere hvordan du skal beregne multiplikative inverser. Dette gjøres av den utvidede euklidiske algoritmen.

Algoritmen er veldig lik den som er gitt ovenfor for å beregne den modulære multiplikative inverse. Det er to hovedforskjeller: for det første er den siste, men en linje ikke nødvendig, fordi Bézout -koeffisienten som gis alltid har en grad mindre enn d . For det andre kan den største fellesdeleren som er gitt, når inngangspolynomene er koprime, være alle ikke -nullelementer av K ; dette Bézout koeffisient (a polynom generelt positiv grad) må således multipliseres med den inverse av dette element av K . I pseudokoden som følger, er p et polynom med en grad større enn ett, og a er et polynom.

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

Eksempel

For eksempel, hvis polynomet som brukes til å definere det endelige feltet GF (2 8 ) er p = x 8  +  x 4  +  x 3  +  x  + 1, og a = x 6  +  x 4  +  x  + 1 er elementet hvis inverse er ønsket, og deretter utfører algoritmeresultatene i beregningen beskrevet i tabellen nedenfor. La oss huske at i felt av rekkefølge 2 n har en - z = z og z + z = 0 for hvert element z i feltet). Siden 1 er det eneste nullelementet i GF (2), er det ikke nødvendig med justering i den siste linjen i pseudokoden.

steg  kvotient  r, nyr s, nyheter t, newt
   p  =  x 8 + x 4 + x 3 + x + 1  1  0
   a  =  x 6 + x 4 + x + 1 0  1
1  x 2 + 1  x 2 = p - a ( x 2 + 1) 1  x 2 + 1 = 0 - 1 × ( x 2 + 1)
2  x 4 + x 2  x + 1 = a - x 2 ( x 4 + x 2 ) x 4 +x 2 = 0 - 1 (x 4 +x 2 )  x 6 + x 2 + 1 = 1 - ( x 4 + x 2 ) ( x 2 + 1)
3  x + 1  1 = x 2 - ( x + 1) ( x + 1) x 5 +x 4 +x 3 +x 2 +1 = 1 - (x +1) (x 4 +x 2 )  x 7 + x 6 + x 3 + x = ( x 2 + 1) - ( x + 1) ( x 6 + x 2 + 1)
4  x + 1  0 = ( x + 1) - 1 × ( x + 1) x 6 +x 4 +x +1 = (x 4 +x 2 ) - (x +1) (x 5 +x 4 +x 3 +x 2 +1)  

Dermed er det inverse x 7  +  x 6  +  x 3  +  x , som kan bekreftes ved å multiplisere de to elementene sammen , og ta resten med p av resultatet.

Saken om mer enn to tall

Man kan håndtere saken med mer enn to tall iterativt. Først viser vi det . For å bevise dette la . Per definisjon av gcd er en deler av og . Slik for noen . Tilsvarende er en deler av det for noen . La . Ved vår konstruksjon av , men siden er den største deleren er en enhet . Og siden resultatet er bevist.

Så hvis så er det og slik at så den endelige ligningen vil være

Så for å søke på n tall bruker vi induksjon

med ligningene som følger direkte.

Se også

Referanser

  • Knuth, Donald . The Computer of Computer Programming . Addison-Wesley. Bind 2, kapittel 4.
  • Thomas H. Cormen , Charles E. Leiserson , Ronald L. Rivest og Clifford Stein . Introduksjon til algoritmer , andre utgave. MIT Press og McGraw-Hill, 2001. ISBN  0-262-03293-7 . Side 859–861 i seksjon 31.2: Største fellesdeler.

Eksterne linker