Algoritmo di Euclide: differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
Aggiunta di un esempio di rust |
Nessun oggetto della modifica |
||
(14 versioni intermedie di 13 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>F. Acerbi, ''Euclide, Tutte le opere'', 2007, [[Bompiani]].
{{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 ''[[
Dati due [[numero naturale|numeri naturali]] <math>a</math> e <math>b</math>, l'algoritmo prevede che si controlli se <math>b</math> è zero
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]].
Riga 10:
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
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
finché b > 0 fai:
fine ciclo
scrivi (a, "è il massimo comun divisore cercato")
finisci.
==Dimostrazione della correttezza dell'algoritmo==
Riga 39 ⟶ 52:
==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)
<syntaxhighlight lang="c" line="1">
/* 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
{ if(
return(
else
return
}
</syntaxhighlight>
[[Scala (linguaggio di programmazione)|Scala]] (algoritmo ricorsivo)
<syntaxhighlight lang="scala" line="1"> @tailrec
def
if (
else
</syntaxhighlight>
[[MATLAB]] (algoritmo iterativo)
<syntaxhighlight lang="matlab" line="1">
function out =
if(b == 0)
out = a;
elseif(b == 1)
out = 1;
else
out =
end
Riga 89 ⟶ 104:
</syntaxhighlight>
[[Python]] (algoritmo iterativo)
<syntaxhighlight lang="python" line="1">▼
▲<syntaxhighlight lang="python">
▲def mcd(a, b):
while b:
a, b = b, a % b
Riga 98 ⟶ 112:
</syntaxhighlight>
[[Ruby (linguaggio di programmazione)|Ruby]] (algoritmo iterativo)
<syntaxhighlight lang="ruby" line="1">▼
▲<syntaxhighlight lang="ruby">
def euclide(a, b)
while
a, b = b, a % b
end
end
</syntaxhighlight>
[[Pascal (linguaggio di programmazione)|Pascal]] (algoritmo iterativo)
<syntaxhighlight lang="
function
r: integer; begin
MCD := a
begin
a:=b;▼
end;
</syntaxhighlight>
[[BASIC]] (vb.net, algoritmo iterativo)
<syntaxhighlight lang="vbnet" line="1">
While (r <> 0)
▲ Function Euclide_MCD(ByVal a As Int16, ByVal b As Int16) As Int16
r = a Mod b
Wend
Return b
▲ Dim r As Int16 = a Mod b
▲ While (r <> 0)
▲ a = b
▲ b = r
▲ r = a Mod b
▲ End While
▲ 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="
function euclide($a, $b) {
▲ }
}
</syntaxhighlight>
[[Java (linguaggio di programmazione)|Java]] (algoritmo iterativo)
<syntaxhighlight lang="java" line="1">
}
▲ }
</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
assert! (a != 0 && b != 0);
while b != 0 {
▲ a = t;
▲ }
▲ b = b % a;
}
a
Riga 189 ⟶ 197:
</syntaxhighlight>
[[Go (linguaggio di programmazione)|Go]] (algoritmo iterativo)
<syntaxhighlight lang="
func
for b != 0 {
a, b = b, a%b
}
return a
}
==Note==
Riga 207 ⟶ 216:
*[[Minimo comune multiplo]]
*[[Massimo comun divisore]]
*[[Algoritmo esteso di Euclide]]
*[[Equazione diofantea lineare]]
*[[Ritmo di Euclide]]
Riga 216 ⟶ 226:
==Collegamenti esterni==
* {{Collegamenti esterni}}
* {{FOLDOC|Euclid's Algorithm|Euclid's Algorithm}}
*{{en}} [https://www.cut-the-knot.org/blue/Euclid.shtml Euclid's Algorithm] su cut-the-knot
*{{en}} [https://www.cut-the-knot.org/blue/binary.shtml Binary Euclid's Algorithm (Java)] su cut-the-knot
Riga 225 ⟶ 236:
{{Portale|matematica}}
[[Categoria:Algoritmi
[[Categoria:Euclide]]
|