Algoritmo euclideo esteso - Extended Euclidean algorithm

In aritmetica e programmazione informatica , l' algoritmo euclideo esteso è un'estensione dell'algoritmo euclideo e calcola, oltre al massimo comun divisore (mcd) degli interi a e b , anche i coefficienti dell'identità di Bézout , che sono gli interi x e y tale che

Questo è un algoritmo di certificazione , perché il mcd è l'unico numero che può soddisfare contemporaneamente questa equazione e dividere gli input. Essa permette di calcolare anche, con un costo quasi senza supplemento, i quozienti di un e b dal loro massimo comun divisore.

L'algoritmo euclideo esteso si riferisce anche a un algoritmo molto simile per il calcolo del massimo comun divisore polinomiale e dei coefficienti dell'identità di Bézout di due polinomi univariati .

L'algoritmo di Euclide esteso è particolarmente utile quando un e b sono coprimi . Con tale disposizione, x è l' inverso moltiplicativo modulare di a modulo b , e y è l'inverso moltiplicativo modulare di b modulo a . Analogamente, l'algoritmo euclideo polinomiale esteso permette di calcolare l' inverso moltiplicativo nelle estensioni di campo algebrico e, in particolare, nei campi finiti di ordine non primo. Ne consegue che entrambi gli algoritmi euclidei estesi sono ampiamente utilizzati in crittografia . In particolare, il calcolo dell'inverso moltiplicativo modulare è un passaggio essenziale nella derivazione di coppie di chiavi nel metodo di crittografia a chiave pubblica RSA .

Descrizione

L'algoritmo euclideo standard procede per una successione di divisioni euclidee i cui quozienti non vengono utilizzati. Vengono mantenuti solo i resti . Per l'algoritmo esteso vengono utilizzati i quozienti successivi. Più precisamente, l'algoritmo euclideo standard con a e b come input, consiste nel calcolare una sequenza di quozienti e una sequenza di resti tali che

È la proprietà principale della divisione euclidea che le disuguaglianze a destra definiscano in modo univoco e da e

Il calcolo si ferma quando si raggiunge un resto che è zero; il massimo comun divisore è allora l'ultimo resto diverso da zero

L'algoritmo euclideo esteso procede in modo simile, ma aggiunge altre due sequenze, come segue

Il calcolo si ferma anche quando e dà

  • è il massimo comun divisore dell'input e
  • I coefficienti di Bézout sono e cioè
  • I quozienti di un e b per il loro massimo comun divisore sono date da e

Inoltre, se a e b sono entrambi positivi e , allora

per dove denota la parte integrale di x , che è il massimo intero non maggiore di x .

Ciò implica che la coppia di coefficienti di Bézout fornita dall'algoritmo euclideo esteso è la coppia minima di coefficienti di Bézout, essendo l'unica coppia che soddisfa entrambe le disuguaglianze di cui sopra.

Inoltre significa che l'algoritmo può essere eseguito senza integer overflow da un programma per computer utilizzando interi di dimensione fissa maggiore di quella di a e b .

Esempio

La tabella seguente mostra come procede l'algoritmo euclideo esteso con gli input 240 e 46 . Il massimo comun divisore è l'ultima voce diversa da zero, 2 nella colonna "resto". Il calcolo si ferma alla riga 6, perché il resto è 0 . I coefficienti di Bézout compaiono nelle ultime due voci della penultima riga. Infatti, è facile verificare che −9 × 240 + 47 × 46 = 2 . Infine gli ultimi due elementi 23 e -120 dell'ultima riga sono, fino al segno, i quozienti dell'ingresso 46 e 240 per il massimo comun divisore 2 .

indice i quoziente q i −1 Resto r io s i t i
0 240 1 0
1 46 0 1
2 240 ÷ 46 = 5 2405 × 46 = 10 15 × 0 = 1 0 − 5 × 1 = −5
3 46 ÷ 10 = 4 464 × 10 = 6 04 × 1 = −4 1 − 4 × −5 = 21
4 10 ÷ 6 = 1 101 × 6 = 4 11 × −4 = 5 −5 − 1 × 21 = −26
5 6 ÷ 4 = 1 61 × 4 = 2 −41 × 5 = −9 21 − 1 × −26 = 47
6 4 ÷ 2 = 2 42 × 2 = 0 52 × −9 = 23 −26 − 2 × 47 = −120

Prova

Poiché la sequenza di è una sequenza decrescente di interi non negativi (da i = 2 in poi). Quindi deve fermarsi con alcuni Questo dimostra che l'algoritmo si ferma alla fine.

Poiché il massimo comun divisore è lo stesso per e Questo mostra che il massimo comun divisore dell'input è uguale a quello di Questo dimostra che è il massimo comun divisore di a e b . (Fino a questo punto, la dimostrazione è la stessa del classico algoritmo euclideo.)

Come e abbiamo per i = 0 e 1. La relazione segue per induzione per tutti :

Così e sono coefficienti di Bézout.

Considera la matrice

La relazione di ricorrenza può essere riscritta in forma matriciale

La matrice è la matrice identità e il suo determinante è uno. Il determinante della matrice più a destra nella formula precedente è −1. Ne segue che il determinante di è In particolare, poiché abbiamo Considerando questo come un'identità di Bézout, questo mostra che e sono coprimi . La relazione che è stata dimostrata sopra e il lemma di Euclide mostrano che divide b e divide a . Essendo coprimi, sono, fino al loro segno, i quozienti di b e a per il loro massimo comun divisore.

Per dimostrare l'ultima affermazione, supponiamo che a e b siano entrambi positivi e . Allora, , e se , si può vedere che le sequenze s e t per ( a , b ) sotto l'EEA sono, fino agli 0 e 1 iniziali, le sequenze t e s per ( b , a ). Le definizioni mostrano quindi che il caso ( a , b ) si riduce al caso ( b , a ). Quindi supponiamo che senza perdita di generalità.

Si può vedere che è 1 e (che esiste da ) è un numero intero negativo. Successivamente, l' alternanza di segno e strettamente crescente in grandezza, che segue induttivamente dalle definizioni e dal fatto che per , il caso vale perché . Lo stesso vale per il dopo i primi termini, per lo stesso motivo. Inoltre, è facile vedere che (quando un e b sono entrambi positivi e ). Così,

Questo, accompagnato dal fatto che sono maggiori o uguali a in valore assoluto rispetto a qualsiasi precedente o rispettivamente completata la dimostrazione.

Algoritmo euclideo esteso polinomiale

Per i polinomi univariati con coefficienti in un campo , tutto funziona in modo simile, divisione euclidea, identità di Bézout e algoritmo euclideo esteso. La prima differenza è che, nella divisione euclidea e nell'algoritmo, la disuguaglianza deve essere sostituita da una disuguaglianza sui gradi Altrimenti, tutto ciò che precede in questo articolo rimane lo stesso, semplicemente sostituendo gli interi con i polinomi.

Una seconda differenza risiede nel vincolo sulla dimensione dei coefficienti di Bézout fornito dall'algoritmo euclideo esteso, che è più accurato nel caso polinomiale, portando al seguente teorema.

Se a e b sono due polinomi diversi da zero, allora l'algoritmo euclideo esteso produce l'unica coppia di polinomi ( s , t ) tale che

e

Una terza differenza è che, nel caso polinomiale, il massimo comun divisore è definito solo fino alla moltiplicazione per una costante diversa da zero. Esistono diversi modi per definire in modo univoco un massimo comun divisore.

In matematica, è comune richiedere che il massimo comun divisore sia un polinomio monico . Per ottenere questo, è sufficiente dividere ogni elemento dell'uscita dal primo coefficiente di Ciò permette che, se un e b sono coprimi, si ottiene 1 sul lato destro della disuguaglianza di Bézout. Altrimenti, si può ottenere qualsiasi costante diversa da zero. In computer algebra , i polinomi hanno comunemente coefficienti interi, e questo modo di normalizzare il massimo comun divisore introduce troppe frazioni per essere conveniente.

Il secondo modo per normalizzare il massimo comun divisore nel caso di polinomi a coefficienti interi è dividere ogni output per il contenuto di per ottenere un massimo comun divisore primitivo . Se i polinomi di input sono coprimi, questa normalizzazione fornisce anche un massimo comun divisore uguale a 1. Lo svantaggio di questo approccio è che molte frazioni dovrebbero essere calcolate e semplificate durante il calcolo.

Un terzo approccio consiste nell'estendere l'algoritmo delle sequenze di pseudo-resti subrisultati in modo simile all'estensione dell'algoritmo euclideo all'algoritmo euclideo esteso. Ciò consente che, partendo da polinomi con coefficienti interi, tutti i polinomi calcolati abbiano coefficienti interi. Inoltre, ogni resto calcolato è un polinomio sottorisultante . In particolare, se i polinomi di input sono coprimi, allora l'identità di Bézout diventa

dove denota la risultante di a e b . In questa forma dell'identità di Bézout, non c'è alcun denominatore nella formula. Se si divide tutto per il risultante si ottiene l'identità classica di Bézout, con un esplicito denominatore comune per i numeri razionali che vi compaiono.

Pseudocodice

Per implementare l'algoritmo sopra descritto, si dovrebbe prima notare che sono necessari solo gli ultimi due valori delle variabili indicizzate ad ogni passo. Pertanto, per risparmiare memoria, ogni variabile indicizzata deve essere sostituita da due sole variabili.

Per semplicità, l'algoritmo seguente (e gli altri algoritmi in questo articolo) usa assegnazioni parallele . In un linguaggio di programmazione che non ha questa caratteristica, le assegnazioni parallele devono essere simulate con una variabile ausiliaria. Ad esempio, il primo,

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

è equivalente a

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

e analogamente per gli altri incarichi paralleli. Questo porta al seguente codice:

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)

I quozienti di un e b per il loro massimo comune divisore, che è uscita, possono avere un segno non corretto. Questo è facile da correggere alla fine del calcolo, ma non è stato fatto qui per semplificare il codice. Allo stesso modo, se a o b è zero e l'altro è negativo, il massimo comun divisore che viene prodotto è negativo e tutti i segni dell'output devono essere modificati.

Infine, si noti che nell'identità di Bézout, , si può risolvere per dato . Pertanto, un'ottimizzazione dell'algoritmo di cui sopra consiste nel calcolare solo la sequenza (che produce il coefficiente di Bézout ), e quindi calcolare alla fine:

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

Tuttavia, in molti casi questa non è realmente un'ottimizzazione: mentre il primo algoritmo non è suscettibile di overflow se utilizzato con numeri interi macchina (cioè interi con un limite superiore fisso di cifre), la moltiplicazione di old_s * a nel calcolo di bezout_t può traboccare, limitando questa ottimizzazione agli input che possono essere rappresentati in meno della metà della dimensione massima. Quando si utilizzano interi di dimensione illimitata, il tempo necessario per la moltiplicazione e la divisione cresce quadraticamente con la dimensione degli interi. Ciò implica che l'"ottimizzazione" sostituisce una sequenza di moltiplicazioni/divisioni di numeri interi piccoli con un'unica moltiplicazione/divisione, che richiede più tempo di calcolo rispetto alle operazioni che sostituisce, messe insieme.

Semplificazione delle frazioni

Una frazione un/Bè in forma canonica semplificata se a e b sono coprimi e b è positivo. Questa forma canonica semplificata si ottiene sostituendo le tre righe di output dello pseudo codice precedente con

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

La dimostrazione di questo algoritmo si basa sul fatto che s e t sono due interi coprimi tali che come + bt = 0 , e quindi . Per ottenere la forma canonica semplificata è sufficiente spostare il segno meno per avere un denominatore positivo.

Se b divide a equamente, l'algoritmo esegue solo un'iterazione e abbiamo s = 1 alla fine dell'algoritmo. È l'unico caso in cui l'output è un numero intero.

Calcolo degli inversi moltiplicativi in ​​strutture modulari

L'algoritmo euclideo esteso è lo strumento essenziale per il calcolo degli inversi moltiplicativi nelle strutture modulari, tipicamente gli interi modulari e le estensioni algebriche di campo . Un esempio notevole di quest'ultimo caso sono i campi finiti di ordine non primo.

Interi modulari

Se n è un intero positivo, l'anello Z / n Z può essere identificato con l'insieme {0, 1, ..., n -1} dei resti della divisione euclidea per n , l'addizione e la moltiplicazione consistenti nel prendere il resto per n del risultato dell'addizione e della moltiplicazione di numeri interi. Un elemento a di Z / n Z ha un inverso moltiplicativo (cioè è un'unità ) se è coprimo con n . In particolare, se n è primo , a ha un inverso moltiplicativo se non è zero (modulo n ). Quindi Z / n Z è un campo se e solo se n è primo.

L'identità di Bézout afferma che a e n sono coprimi se e solo se esistono interi s e t tali che

Riducendo questa identità modulo n si ottiene

Quindi t , o più esattamente il resto della divisione di t per n , è l'inverso moltiplicativo di a modulo n .

Per adattare l'algoritmo euclideo esteso a questo problema, si dovrebbe notare che il coefficiente di Bézout di n non è necessario, e quindi non deve essere calcolato. Inoltre, per ottenere un risultato positivo e minore di n , si può utilizzare il fatto che l'intero t fornito dall'algoritmo soddisfa | t | < n . Cioè, se t < 0 , si deve aggiungere n alla fine. Ciò si traduce nello pseudocodice, in cui l'input n è un numero intero maggiore di 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

Estensioni di campi algebrici semplici

L'algoritmo euclideo esteso è anche lo strumento principale per il calcolo degli inversi moltiplicativi in semplici estensioni di campo algebrico . Un caso importante, ampiamente utilizzato in crittografia e teoria dei codici , è quello dei campi finiti di ordine non primo. Infatti, se p è un numero primo, eq = p d , il campo di ordine q è una semplice estensione algebrica del campo primo di p elementi, generato da una radice di un polinomio irriducibile di grado d .

All'anello quoziente si può identificare una semplice estensione algebrica L di un campo K , generato dalla radice di un polinomio irriducibile p di grado d , ed i suoi elementi sono in corrispondenza biunivoca con i polinomi di grado minore di d . L'addizione in L è l'addizione di polinomi. La moltiplicazione in L è il resto della divisione euclidea per p del prodotto dei polinomi. Quindi, per completare l'aritmetica in L , resta solo da definire come calcolare gli inversi moltiplicativi. Questo viene fatto dall'algoritmo euclideo esteso.

L'algoritmo è molto simile a quello fornito sopra per il calcolo dell'inverso moltiplicativo modulare. Ci sono due differenze principali: in primo luogo la penultima riga non è necessaria, perché il coefficiente di Bézout fornito ha sempre un grado inferiore a d . In secondo luogo, il massimo comun divisore che viene fornito, quando i polinomi di input sono coprimi, può essere un qualsiasi elemento non nullo di K ; questo coefficiente di Bézout (un polinomio generalmente di grado positivo) va quindi moltiplicato per l'inverso di questo elemento di K . Nello pseudocodice che segue, p è un polinomio di grado maggiore di uno, e a è un polinomio.

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

Esempio

Ad esempio, se il polinomio utilizzato per definire il campo finito GF(2 8 ) è p = x 8  +  x 4  +  x 3  +  x  + 1, e a = x 6  +  x 4  +  x  + 1 è l'elemento il cui inverso è desiderato, quindi l'esecuzione dell'algoritmo porta al calcolo descritto nella tabella seguente. Ricordiamo che nei campi di ordine 2 n , si ha - z = z e z + z = 0 per ogni elemento z nel campo). Poiché 1 è l'unico elemento diverso da zero di GF(2), l'aggiustamento nell'ultima riga dello pseudocodice non è necessario.

fare un passo  quoziente  r, nuovo s, notizie 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)  

Quindi, l'inverso è x 7  +  x 6  +  x 3  +  x , come può essere confermato moltiplicando i due elementi tra loro e prendendo il resto per p del risultato.

Il caso di più di due numeri

Si può trattare iterativamente il caso di più di due numeri. Per prima cosa lo mostriamo . Per dimostrare questo let . Per definizione di gcd è un divisore di e . Così per alcuni . Allo stesso modo è un divisore di così per alcuni . Lascia . Dalla nostra costruzione di , ma poiché è il massimo divisore è un'unità . E poiché il risultato è dimostrato.

Quindi se poi ci sono e tali che così l'equazione finale sarà

Quindi per applicare a n numeri usiamo l'induzione

con le equazioni che seguono direttamente.

Guarda anche

Riferimenti

  • Knuth, Donald . L'arte della programmazione informatica . Addison-Wesley. Volume 2, Capitolo 4.
  • Thomas H. Cormen , Charles E. Leiserson , Ronald L. Rivest e Clifford Stein . Introduzione agli algoritmi , seconda edizione. MIT Press e McGraw-Hill, 2001. ISBN  0-262-03293-7 . Pagine 859–861 della sezione 31.2: Massimo comun divisore.

link esterno