Algoritmo di Euclide: differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
m Annullata la modifica 98711591 di 79.43.33.156 (discussione) Etichetta: Annulla |
Nessun oggetto della modifica |
||
(47 versioni intermedie di 42 utenti non mostrate) | |||
Riga 1:
L''''algoritmo di Euclide''' è un [[algoritmo]] per trovare il [[massimo comun divisore|massimo comune divisore]] (indicato di seguito con MCD) tra due [[numero intero|numeri interi]]. È uno degli algoritmi più antichi conosciuti, essendo presente negli ''[[Elementi (Euclide)|Elementi]]'' di [[Euclide]]<ref>
{{en}} [[Thomas L. Heath]], ''The Thirteen Books of Euclid's Elements'', 2nd ed. [Facsimile. Original publication: Cambridge University Press, 1925], 1956, [[Dover Publications]]</ref> intorno al [[300 a.C.]]; tuttavia, probabilmente l'algoritmo non è stato scoperto da [[Euclide]], ma potrebbe essere stato conosciuto anche 200 anni prima. Certamente era conosciuto da [[Eudosso di Cnido]] intorno al [[375 a.C.]]; [[Aristotele]] (intorno al [[330 a.C.]]) ne ha fatto cenno ne ''[[Topici|I topici]]'', 158b, 29-35. L'algoritmo non richiede la [[fattorizzazione]] dei due interi.
Dati due [[numero naturale|numeri naturali]] <math>a</math> e <math>b</math>, l'algoritmo prevede che si controlli se <math>b</math> è zero. Se lo è, <math>a</math> è il MCD. Se non lo è, si
deve dividere <math>\frac{a}{b}</math> e definire <math>r</math> come il resto della divisione (operazione indicata con "a modulo b" più sotto). Se <math>r=0</math> allora si può affermare che <math>b</math> è il MCD cercato, altrimenti occorre assegnare <math>a'=b</math> e <math>b'=r</math> e ripetere nuovamente la divisione.
L'algoritmo può essere espresso in modo naturale utilizzando la [[Algoritmo ricorsivo#Ricorsione in coda|ricorsione in coda]].
Tenendo nota dei quozienti ottenuti durante lo svolgimento dell'algoritmo, si possono determinare due interi <math>p</math> e <math>q</math> tali che <math>ap+bq=MCD(a,b)</math>.
Questo è noto con il nome di [[Algoritmo esteso di Euclide|algoritmo di Euclide esteso]].
Questi algoritmi possono essere usati, oltre che con i [[numeri interi]], in ogni contesto in cui è possibile eseguire l'operazione di divisione con resto. Ad esempio, l'algoritmo funziona per i [[polinomio|polinomi]] ad una indeterminata su un [[campo (matematica)|campo]] ''K'', o polinomi omogenei a due indeterminate su un campo, o gli [[intero gaussiano|interi gaussiani]]. Un oggetto algebrico in cui è possibile eseguire la divisione col resto è chiamato [[anello euclideo]].
Euclide originariamente formulò il problema geometricamente, per trovare una "misura" comune per la lunghezza di due segmenti, e il suo algoritmo procedeva sottraendo ripetutamente il più corto dal più lungo. Questo procedimento è equivalente alla implementazione seguente, che è molto meno efficiente del metodo indicato sopra.
== Pseudocodice ==
Una scrittura in [[pseudocodice]] dell'algoritmo (in cui «mod» indica il resto della divisione intera) è la seguente<ref>{{Cita web|url=https://www.treccani.it/enciclopedia/algoritmo-di-euclide_(Enciclopedia-della-Matematica)/|titolo=Euclide, algoritmo di - Treccani|sito=Treccani|lingua=it|accesso=2023-12-27}}</ref>:
inizia
leggi (a, b)
finché b > 0 fai:
r <- mod(a, b)
a <- b
b <- r
fine ciclo
scrivi (a, "è il massimo comun divisore cercato")
finisci.
==Dimostrazione della correttezza dell'algoritmo==
Siano
Definiamo la successione di ricorrenza corrispondente ai passi dell'algoritmo di Euclide:
Per definizione di resto nella divisione,
Vogliamo dimostrare che
Infatti, per induzione si ha per ogni
==Tempo di calcolo==
Quando si analizza il tempo di calcolo dell'algoritmo di Euclide, si trova che i valori di input che richiedono il maggior numero di divisioni sono due successivi [[numeri di Fibonacci]], e il caso peggiore richiede [[O-grande|''O
Questo tempo è comunque considerevolmente migliore rispetto all'algoritmo euclideo originale, in cui l'operazione di modulo è effettuata mediante ripetute sottrazioni in
L'algoritmo di Euclide è ampiamente usato nella pratica, specialmente per numeri piccoli, grazie alla sua semplicità. Un algoritmo alternativo, l'algoritmo del MCD binario, utilizza la [[Sistema numerico binario|rappresentazione binaria]] dei computer per evitare le divisioni e quindi aumentare l'efficienza, sebbene anch'esso sia dell'ordine di
==Frazioni continue==
I quozienti che compaiono quando l'algoritmo euclideo viene applicato ai valori di input
:<math>1071
:<math>1029
:<math>42
Da questo elenco si può vedere che
:<math>\frac{1071}{1029} = \mathbf{1} + \frac{1}{\mathbf{24} + \frac{1}{\mathbf{2}}}</math>.
Questo metodo può anche essere usato per valori di
==Codici==
{{C|Controllare se i codici vanno mantenuti o trasferiti ad un altro progetto|informatica|giugno 2015}}
[[C (linguaggio di programmazione)|C]] e [[C++]] (algoritmo iterativo)
<
/* Algoritmo iterativo */
int euclide(int a, int b)
{
int r; // resto della divisione
while(b != 0) //
{
r = a % b; // in r salva il resto della divisione tra a e b
a = b; // scambia il ruolo di a e b
b = r; //
}
return a; //... e quando b è (o è diventato) 0, il risultato è in a
}
</syntaxhighlight>
[[C (linguaggio)|C]] e [[C++]] (algoritmo ricorsivo)
<syntaxhighlight lang="c" line="1">
/* Algoritmo ricorsivo */
int euclide(int a, int b)
{
if(b == 0)
return(a);
else
return euclide(b, a % b); // la funzione richiama sé stessa
}
</syntaxhighlight>
[[Scala (linguaggio di programmazione)|Scala]] (algoritmo ricorsivo)
<syntaxhighlight lang="scala" line="1">
@tailrec
def euclide(a: Int, b: Int): Int =
if (b == 0)
else
</syntaxhighlight>
[[MATLAB]] (algoritmo iterativo)
<syntaxhighlight lang="matlab" line="1">
function out = euclide(a, b)
if(b == 0)
out = a;
elseif(b == 1)
out = 1;
else
out = euclide(b, mod(a,b));
end
end
</syntaxhighlight>
[[Python]] (algoritmo iterativo)
<syntaxhighlight lang="python" line="1">
def euclide(a, b):
while b:
a, b = b, a % b
return a
</syntaxhighlight>
[[Ruby (linguaggio di programmazione)|Ruby]] (algoritmo iterativo)
<syntaxhighlight lang="ruby" line="1">
def euclide(a, b)
while
a, b = b, a % b
end
end
</syntaxhighlight>
[[Pascal (linguaggio di programmazione)|Pascal]] (algoritmo iterativo)
<
function
r: integer; begin
MCD := a
while not (r = 0) do
begin
r := (a mod b);
end;
MCD := b;
end;
end;
</syntaxhighlight>
[[BASIC]] (vb.net, algoritmo iterativo)
<
Function Euclide(ByVal a As Int16, ByVal b As Int16) As Int16
Dim r As Int16 = a Mod b
While (r <> 0)
a = b
b = r
r = a Mod b
Wend
Return b
End Function
</syntaxhighlight>
In questo algoritmo è stato usato per la rappresentazione numerica il tipo "int16", ma può essere cambiato a piacimento con qualsiasi altro tipo di variabile numerica secondo i bisogni del programma.
[[PHP]] (algoritmo iterativo)
<syntaxhighlight lang="php" line="1">
function euclide($a, $b) {
while ($b) {
list($a, $b) = array($b, $a % $b);
}
return $a;
}
</syntaxhighlight>
[[Java (linguaggio di programmazione)|Java]] (algoritmo iterativo)
<syntaxhighlight lang="java" line="1">
private static int euclide(int a, int b) {
int r;
a
b = r;
}
return Math.abs(a);
}
</syntaxhighlight>
[[Rust (linguaggio di programmazione)|Rust]]<ref>{{Cita web|url=https://github.com/ProgrammingRust|titolo=Programming Rust|sito=GitHub|lingua=en|accesso=2023-01-06}}</ref> (algoritmo iterativo)
<syntaxhighlight lang="rust" line="1">
fn euclide(mut a: u64, mut b: u64) -> u64 {
assert! (a != 0 && b != 0);
while b != 0 {
let r = a % b;
a = b;
b = r;
}
a
}
</syntaxhighlight>
[[Go (linguaggio di programmazione)|Go]] (algoritmo iterativo)
<syntaxhighlight lang="go" line="1">
func euclide(a, b int) int {
for b != 0 {
a, b = b, a%b
}
return a
}
</syntaxhighlight>
==Note==
Line 159 ⟶ 216:
*[[Minimo comune multiplo]]
*[[Massimo comun divisore]]
*[[Algoritmo esteso di Euclide]]
*[[Equazione diofantea lineare]]
*[[Ritmo di Euclide]]
*[[Identità di Bézout]]
==Altri progetti==
{{interprogetto
==Collegamenti esterni==
* {{Collegamenti esterni}}
* {{FOLDOC|Euclid's Algorithm|Euclid's Algorithm}}
*{{en}} [
*{{en}} [https://www.cut-the-knot.org/blue/binary.shtml Binary Euclid's Algorithm (Java)] su cut-the-knot
*{{en}} [https://www.cut-the-knot.org/blue/EuclidAlg.shtml Euclid's Game (Java)] su cut-the-knot
{{Algebra}}
Line 175 ⟶ 236:
{{Portale|matematica}}
[[Categoria:Algoritmi
[[Categoria:Euclide]]
|