Utente:Grasso Luigi/sandbox4/Algoritmo esteso di Euclide

Da Wikipedia, l'enciclopedia libera.
Vai alla navigazione Vai alla ricerca

In aritmetica e nella programmazione l'algoritmo esteso di Euclide ( abbreviato:EEA) è un'estensione dell'algoritmo di Euclide che calcola non solo il massimo comun divisore (indicato con MCD nel seguito) tra due interi a e b, ma anche i coefficienti x e y dell'identità di Bézout.

L'algoritmo esteso di Euclide è particolarmente utile quando a e b sono interi coprimi: in questo caso x è l'inverso moltiplicativo di a modulo b e y è l'inverso moltiplicativo di b modulo a.

Spesso si indica con l'espressione algoritmo esteso di Euclide anche un altro algoritmo, molto simile al precedente, per il calcolo del massimo comun divisore tra polinomi e i loro coefficienti dell'identità di Bézout.

Storia[modifica | modifica wikitesto]

Le prime documentazioni sull'algoritmo risalgono al V-VI secolo a.C., ad opera del matematico indiano Aryabhata. Fu poi riscoperto più volte indipendentemente, ad esempio dal francese Bachet nel 1621 e poi da Eulero intorno al 1731[1].

Descrizione[modifica | modifica wikitesto]

Dati due numeri interi a e b, l'algoritmo di Euclide permette di calcolare due insiemi di successioni di numeri interi dette dei quozienti e dei resti. Prendiamo come indice la variabile che denotiamo . L'algoritmo indica il calcolo dei resti intermedi tramite una divisione-con-resto sulla coppia precedente ottenendo un quoziente tale che:

cioè

quindi otteniamo le due successioni d'interi:

.

Il calcolo si ferma quando si raggiunge un resto nullo ; allora il massimo comune divisore ha il valore

Con un cambio dell'indice del tipo , la (*) diventa

che si può mettere nella forma

con le relative successioni

.

L'algoritmo esteso di Euclide procede in modo simile: si considerano oltre a due ulteriori insiemi di successioni di numeri interi dette coefficienti di Bézout tali che:

cioè

quindi otteniamo le due successioni d'interi:

.

Al termine dell'algoritmo, i coefficienti dell'identità di Bézout sono . Il calcolo si ferma quando si raggiunge un resto nullo e permette di ottenere

  • è il massimo comune divisore dell’input
  • sono i coefficienti di Bézout dell'identità di Bézout:
    in particolare se si verificano le relazioni
    xn è l'inverso moltiplicativo di a modulo b, oppure yn è l'inverso rispetto operazione di b modulo a
  • sono i quozienti di a e b quando li dividiamo per il loro massimo comun divisore, cioè:
  • Inoltre, se , allora
    dove denota la parte intera dell'intero x, cioè il più grande intero non maggiore di x. Ciò implica che la coppia di coefficienti di Bézout fornita dall'algoritmo euclideo esteso è la coppia minima, in quanto è l'unica coppia che soddisfa entrambe le disuguaglianze di cui sopra.

Da quanto visto l'algoritmo può essere eseguito senza overflow da un programma per computer utilizzando numeri interi di dimensione fissa maggiore di quella di a e b.


Esempi[modifica | modifica wikitesto]

  • :
    La tabella seguente mostra come procede l'algoritmo euclideo esteso con gli input . Il massimo comun divisore è l'ultimo numero diverso da zero, 2 nella colonna "resto". Il calcolo si ferma per n=4, poichè il resto è 0. I coefficienti Bézout compaiono nelle ultime due colonne della penultima riga, inoltre i due valori dell'ultima riga sono, compreso il segno, i quozienti delle divisioni 46 e 240 per il massimo comun divisore 2. Cioè si ha
    .
    indice quoziente resto Coefficienti Bézout
    i qi+1 ri+1 xi+1 yi+1
    r-1 = 240 x-1 = 1 y-1 =0
    r0 = 46 x0 = 0 y0 =1
    0 240 ÷ 46 = 5 240 − 5 · 46 = 10 1 − 5 · 0 = 1 0 − 5 · 1 = −5
    1 46 ÷ 10 = 4 46− 4 · 10= 6 0 − 4 · 1 = −4 1 − 4 · −5 = 21
    2 10 ÷ 6 = 1 10 − 1 · 6 = 4 1 − 1 · −4 = 5 −5 − 1 ·t 21 = −26
    3 6 ÷ 4 = 1 6 − 1 · 4 = 2 −4 − 1 · 5 = −9 21 − 1 · −26 = 47
    n=4 4 ÷ 2 = 2 4 − 2 · 2 = 0 5 − 2 · −9 = 23 −26 − 2 · 47 = −120

    ottenendo le sequenze

    Si verifica facilmente la proprietà per le sequenze coefficienti Bèzout dei valori assoluti

    con
    con
  • :
    La seguente tabella mostra con un esempio come procede l'algoritmo esteso di Euclide nel caso dei numeri . Il calcolo procede con una serie di iterazioni i da 0 a n. Si arresta quando è nullo il risultato nella colonna "resto" (rn+1 = r3 = 0).I coefficienti di Bézout sono i risultati nelle ultime due colonne della penultima riga. I risultati delle ultime due colonne nell'ultima riga, 7 e −20, sono rispettivamente, con il segno, i quozienti di 7 e 20 rispetto al massimo comun divisore 1. Riassumendo:
    quindi 20 e 7 sono coprimi.
    indice quoziente resto Coefficienti Bézout
    i qi+1 ri+1 xi+1 yi+1
    r-1 = 20 x-1 = 1 y-1 =0
    r0 = 7 x0 = 0 y0 =1
    0 20 ÷ 7 = 2 20 − 2 · 7 = 6 1 − 2 · 0 = 1 0 − 2 · 1 = −2
    1 7 ÷ 6 = 1 7 − 1 · 6 = 1 0 − 1 · 1 = −1 1 − 1 · (−2) = 3
    n=2 6 ÷ 1 = 6 6 − 6 · 1 = 0 1 − 6 · (−1) = 7 −2 − 6 · 3 = −20

    ottenendo le sequenze

    Si verifica facilmente la proprietà per le sequenze coefficienti Bèzout dei valori assoluti

    con
    con

    Essendo i due numeri coprimi si ha anche:

    -1 è l'inverso moltiplicativo di 20 modulo 7 e 3 è l'inverso moltiplicativo di 7 modulo 20.

Dimostrazione[modifica | modifica wikitesto]

  • Una successione limitata dei resti ha carattere decrescente con tutti i termini non negativi () quindi ammette un limite inferiore e deve fermarsi con qualche Ciò dimostra che l'algoritmo prima o poi si ferma.
    Quando
    allora
    Ciò dimostra che e quindi è il massimo comune divisore di a and b. (Fino a questo punto la dimostrazione è la stessa dell’algoritmo euclideo classico.)
    L'input si ottiene dalla
    La relazione segue per induzione per ogni :
    in particolare si ha
    .
  • Definiamo la seguente matrice dei coefficienti
    e la relazione di ricorrenza in forma di matrice diventa
    la matrice iniziale per i = 0 è quella identica
    quindi ne segue che
    In particolare, per abbiamo
    Considerandola come l'identità di Bézout, si dimostra che sono coprimi. Infatti la relazione provata in precedenza
    e il lemma di Euclide indicano (sono divisibili)
    adesso dividendo per la relazione (*) si ottiene
    in conclusione, e sono interi coprimi e corrispondono ai quozienti di a e b per un fattore comune, che può essere o il loro massimo comun divisore o l'opposto.
  • Allora , e se , si può vedere che le sequenze per l'input (a,b) coincidono, compreso i valori iniziali 0 e 1, con le sequenze per l'input (b,a). Quindi il caso (a,b) si riduce al caso (b,a). Allora ipotizziamo senza perdita di generalità.
    Notiamo che (x3 esiste essendo ). Successivamente, gli si alternano di segno e aumentano strettamente di valore, che segue induttivamente dalle definizioni e dal fatto che , compreso il caso . Lo stesso ragionamento vale per . Inoltre è facile vedere che . Quindi, essendo
    si ottengono
    inoltre sono maggiori o uguali in valore assoluto rispetto a qualsiasi precedente , cioè
    queste due ultime relazioni portano alla tesi.

EEA polinomiale[modifica | modifica wikitesto]

Per i polinomi univariatil con in coefficienti in un campo, tutto funziona allo stesso modo: la divisione euclidea, l'identità di Bézout e l'algoritmo esteso di Euclide. Vediamo di confrontare.

MCD interi, MCD polinomiale

La prima differenza è che, nella divisione euclidea e nell'algoritmo, la disuguaglianza viene sostituita come disuguaglianze sul grado Altrimenti tutto ciò che precede in questo articolo rimane lo stesso, semplicemente sostituendo gli interi con i polinomi.

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

Se a, b sono due polinomi non nulli, allora EEA produce una sola coppia di polimoni (s, t) tali 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 inequivocabile un massimo comun divisore.

Normalizzazione MCD
  • In matematica, è comune richiedere che il massimo comun divisore sia un polinomio monico. Per ottenere ciò è sufficiente dividere ogni elemento dell'output per il coefficiente principale di Ciò consente, se a e b sono coprimi, di ottenere 1 nel membro destro della disuguaglianza di Bézout. Altrimenti si potrebbe ottenere qualsiasi costante diversa da zero. In algebra computazionale, i polinomi hanno comunemente coefficienti interi, e questo modo di normalizzare il massimo comun divisore ha l'effetto d'introdurre troppe frazioni.]], i polinomi hanno comunemente coefficienti interi, e questo modo di normalizzare il massimo comun divisore ha l'effetto d'introdurre troppe frazioni.
  • Il secondo modo per normalizzare MCD nel caso di polinomi a coefficienti interi è dividere ogni output per il contenuto di per ottenere il polinomio primitivo MCD. Se i polinomi di input sono coprimi, questa normalizzazione fornisce anche
Lo svantaggio di questo metodo è il calcolo e la semplificazione di molte frazioni.
  • Un terzo metodo consiste nell'estendere l'algoritmo della successione dei pseudo-resti in modo simile all'estensione dell'algoritmo euclideo all'algoritmo euclideo esteso. Con questo metodo quando si inizia con polinomi a coefficienti interi, tutti i polinomi calcolati restano con i 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 il risultante di a e b. In questa forma dell'identità di Bézout, non c'è alcun denominatore nella formula. Se si divide tutto per la risultante si ottiene l'identità classica di Bézout, con un esplicito denominatore comune per i numeri razionali che vi compaiono.

Pseudocodice[modifica | modifica wikitesto]

In questa sezione e nelle successive, div è una funzione ausiliaria che calcola il quoziente della divisione euclidea del suo argomento di sinistra con il suo argomento di destra.

Per implementare l'algoritmo sopra descritto, occorre innanzitutto osservare che in ogni passaggio sono necessari solo gli ultimi due valori delle variabili indicizzate. Pertanto, per risparmiare memoria, ciascuna variabile indicizzata deve essere sostituita solo da due variabili. Per semplicità, gli algoritmi che descriviamo utilizzano assegnazioni parallele. In un linguaggio di programmazione che non dispone di questa funzionalità, le assegnazioni parallele vengono simulate con una variabile ausiliaria. Ad esempio, le assegnazioni

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

si ottiene usando la variabile ausiliaria prov

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

e lo stesso per altri assegnamenti. Otteniamo il codice seguente:

 '''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''' "coefficienti Bézout i=n:", (old_s, old_t)
     '''output''' "massimo comune divisore:", old_r
     '''output''' "coefficienti Bèzout i=n+1:", (t, s)

I quozienti di a e b ottenuti per il loro massimo comun divisore, visualizzati, potrebbero avere un segno errato. Questo è facile da correggere alla fine del calcolo ma non viene fatto per semplificare il codice. Allo stesso modo, se a o b è zero e l'altro è negativo, il massimo comun divisore restituito è negativo e tutti i segni dell'output devono essere modificati.

Infine, notare che nell'identità di Bézout

possiamo risolvere in essendo dati . Quindi, possiamo ottimizzare l'algoritmo precedente calcolando solo la sequenza (che produce il coefficiente di Bézout ), e infine calcolare :

 '''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''' "coefficienti Bézout i=n:", (old_s, bezout_t)
     '''output''' "massimo comune divisore:", old_r

Tuttavia, in molti casi questa non è realmente un'ottimizzazione: mentre il primo algoritmo non è suscettibile di overflow quando utilizzato con numeri interi macchina (cioè numeri 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 numeri interi di dimensione illimitata, il tempo necessario per la moltiplicazione e la divisione cresce quadraticamente con la loro dimensione. Ciò implica che l'"ottimizzazione" sostituisce una sequenza di moltiplicazioni/divisioni di piccoli numeri interi al posto di un'unica moltiplicazione/divisione, questo comporta un tempo di calcolo superiore rispetto alle operazioni sostituite.

EEA generalizzato[modifica | modifica wikitesto]

È possibile generalizzare l'algoritmo al caso di più di due numeri in modo iterativo.

All'inizio consideriamo n= 3 numeri e vogliamo provare

.

Supponiamo che . Per definizione di MCD è divisore di e . Cioè:

inoltre è divisore di cioè:

.

Let . By our construction of , but since is the greatest divisor is a unit. And since the result is proven.

Se la coppia di coefficienti Bèzout danno l'identità

allora vi è pure una coppia per cui vale l'identità

ottenendo l'identità di Bèzout per n= 3 numeri

Allora per applicarlo ad n numeri usiamo il principio di induzione

mentre l'identità di Bèzout con coefficienti diventa

con le equazioni che seguono direttamente.

Applicazioni[modifica | modifica wikitesto]

L'algoritmo di Euclide trova applicazione nella crittografia, in particolare il calcolo dell'inverso moltiplicativo modulare è un passo fondamentale per criptare i messaggi con l'algoritmo a chiave pubblica RSA.

Note[modifica | modifica wikitesto]

  1. ^ (EN) André Weil, Number Theory, Birkhäuser, 2001, pp. 6-7, 176-77, ISBN 978-0-8176-4571-7.

Bibliografia[modifica | modifica wikitesto]

Voci correlate[modifica | modifica wikitesto]