Evaluación de la implementación del algoritmo de Euclides extendido.
Después de algunas experimentaciones y búsquedas, llegué a la siguiente definición:
emcd' :: Integer -> Integer -> (Integer,Integer,Integer)
emcd' a 0 = (a, 1, 0)
emcd' a b =
let (g, t, s) = emcd' b r
in (g, s, t - (q * s))
where
(q, r) = divMod a b
Evaluaría emcd' 56 15
hasta el nivel más interno, por ejemplo, de esta manera:
emcd' 56 15
= let (g, t, s) = emcd' 15 11 in (
let (g, t, s) = emcd' 11 4 in (
let (g, t, s) = emcd' 4 3 in (
let (g, t, s) = emcd' 3 1 in (
let (g, t, s) = emcd' 1 0 in (
(1, 1, 0)
) in (g, s, t - (3 * s))
) in (g, s, t - (1 * s))
) in (g, s, t - (2 * s))
) in (g, s, t - (1 * s))
) in (g, s, t - (3 * s))
- ¿Está mi evaluación yendo en la dirección correcta?
EDITADO:
A partir de los comentarios de Will Ness, estoy actualizando la evaluación.
davy.ai
No, su evaluación no va en la dirección correcta.
En primer lugar, el paso
(g, t, s) = emcd' 15 11
está mal, debería ser(g, s, t) = emcd' 15 11
, ya que la tupla devuelta es(gcd, x, y)
.En segundo lugar, parece que está evaluando la función de manera recursiva en profundidad, lo cual no es la forma correcta de evaluarla. En cambio, debería evaluar la función de abajo hacia arriba, reemplazando cada llamada por su resultado hasta llegar al resultado final.
Aquí tienes un ejemplo de evaluación:
Explicación:
b
es igual a 0. En este caso, devuelve(a, 1, 0)
ya que el máximo común divisor dea
y0
esa
y1*a + 0*0 = a
.b
no es igual a 0, calcula el cocienteq
y el restor
de la división dea
porb
.emcd'
, pasandob
yr
como argumentos.(g, t, s)
, dondeg
es el máximo común divisor deb
yr
, yt
ys
son enteros tal queb*t + r*s = g
.g
,s
, yt
de la siguiente manera:g
es igual al resultado de la llamada recursiva (es decir, el máximo común divisor deb
yr
),s
es igual al tercer elemento de la tupla devuelta por la llamada recursiva (es decir,s
es el valor det
enemcd' b r
), yt
se calcula comot - q*s
.(g, s, t)
.En la evaluación
emcd' 56 15
,b
no es igual a 0, por lo que la función calculaq
yr
como3
y11
, respectivamente, y hace una llamada recursiva aemcd' 15 11
. La llamada recursiva devuelve(1, -13, 4)
, lo que significa que el máximo común divisor de15
y11
es1
, y15*(-13) + 11*4 = 1
.Al sustituir los valores de
g
,s
yt
en la llamada original, obtenemos(1, 4, -13)
como resultado final.