二进制欧几里得算法进入无限循环
BInary Eucledian algorithms goes to infinite loop
我已经在matlab中实现了二进制欧几里得算法,这里是代码
function d=EuclidBinary(a,b)
if a==0
d=b;
return ;
elseif b==0
d=a;
return;
elseif mod(a,2)==0 && mod(b,2)==0
d=2*EuclidBinary(a/2,b/2);
elseif mod(a,2)==0 && mod(b,2)==1
d=EuclidBinary(a/2,b);
elseif mod(a,2)==1 && mod(b,2)==0
d=EuclidBinary(a,b/2);
else
d=EuclidBinary(fix(abs(a-b)/2),b);
end
然后我输入了以下数据
a=27;
b=36;
d=EuclidBinary(a,b)
d =
9
它工作正常,但是当我更改为以下数据时
a=36;
b=28;
d=EuclidBinary(a,b)
Out of memory. The likely cause is an infinite recursion within the program.
Error in EuclidBinary (line 16)
d=EuclidBinary(fix(abs(a-b)/2),b);
我已经开始调试,如果我按照说明进行操作,那么我就会
d=2*EuclidBinary(a/2,b/2);第一次通话 (a=18,b=14)
第二次相同
d=2*EuclidBinary(a/2,b/2); (a=9,b=7)
对于第三种情况,我们有
a=1 b=7
通常程序会无限次重复这些值,我使用以下伪代码
请帮我解决这个问题
这个算法(您消息底部的打印屏幕)似乎有缺陷。让我们看看如果 a=1 和 b=7 会发生什么:
a=1,b=7 --> a=(6/2)=3, b=7 --> a=(4/2)=2, b=7 --> a=1, b=7.
所以问题不在您的代码中,而在您使用的算法中。它只是用这个输入进入无限循环。
我认为错误在第 4 步。请参阅 following link。
在您的问题中,第 4 步在每种情况下都将 b
作为其第二个参数,而在我给您的 link 中,第二个参数由某些条件决定。另请注意,还有第 5 步。
您的算法有误。参见 Binary GCD Algorithm。最后一种情况 a 和 b 都是奇数,应该不同地处理:
function d=EuclidBinary(a,b)
if a==0
d = b;
return;
elseif b==0
d = a;
return;
elseif mod(a, 2)==0 && mod(b, 2)==0 % Both a and b are even.
d = 2*EuclidBinary(a/2, b/2);
elseif mod(a, 2)==0 && mod(b, 2)==1 % a is even
d = EuclidBinary(a/2, b);
elseif mod(a, 2)==1 && mod(b, 2)==0 % b is even
d = EuclidBinary(a, b/2);
else
if (a>b) % both are a and b are odd
d = EuclidBinary((a-b)/2, b); % <- b is the second argument
else
d = EuclidBinary((b-a)/2, a); % <- a is the second argument
end
end
我已经在matlab中实现了二进制欧几里得算法,这里是代码
function d=EuclidBinary(a,b)
if a==0
d=b;
return ;
elseif b==0
d=a;
return;
elseif mod(a,2)==0 && mod(b,2)==0
d=2*EuclidBinary(a/2,b/2);
elseif mod(a,2)==0 && mod(b,2)==1
d=EuclidBinary(a/2,b);
elseif mod(a,2)==1 && mod(b,2)==0
d=EuclidBinary(a,b/2);
else
d=EuclidBinary(fix(abs(a-b)/2),b);
end
然后我输入了以下数据
a=27;
b=36;
d=EuclidBinary(a,b)
d =
9
它工作正常,但是当我更改为以下数据时
a=36;
b=28;
d=EuclidBinary(a,b)
Out of memory. The likely cause is an infinite recursion within the program.
Error in EuclidBinary (line 16)
d=EuclidBinary(fix(abs(a-b)/2),b);
我已经开始调试,如果我按照说明进行操作,那么我就会
d=2*EuclidBinary(a/2,b/2);第一次通话 (a=18,b=14) 第二次相同 d=2*EuclidBinary(a/2,b/2); (a=9,b=7)
对于第三种情况,我们有
a=1 b=7
通常程序会无限次重复这些值,我使用以下伪代码
请帮我解决这个问题
这个算法(您消息底部的打印屏幕)似乎有缺陷。让我们看看如果 a=1 和 b=7 会发生什么:
a=1,b=7 --> a=(6/2)=3, b=7 --> a=(4/2)=2, b=7 --> a=1, b=7.
所以问题不在您的代码中,而在您使用的算法中。它只是用这个输入进入无限循环。
我认为错误在第 4 步。请参阅 following link。
在您的问题中,第 4 步在每种情况下都将 b
作为其第二个参数,而在我给您的 link 中,第二个参数由某些条件决定。另请注意,还有第 5 步。
您的算法有误。参见 Binary GCD Algorithm。最后一种情况 a 和 b 都是奇数,应该不同地处理:
function d=EuclidBinary(a,b)
if a==0
d = b;
return;
elseif b==0
d = a;
return;
elseif mod(a, 2)==0 && mod(b, 2)==0 % Both a and b are even.
d = 2*EuclidBinary(a/2, b/2);
elseif mod(a, 2)==0 && mod(b, 2)==1 % a is even
d = EuclidBinary(a/2, b);
elseif mod(a, 2)==1 && mod(b, 2)==0 % b is even
d = EuclidBinary(a, b/2);
else
if (a>b) % both are a and b are odd
d = EuclidBinary((a-b)/2, b); % <- b is the second argument
else
d = EuclidBinary((b-a)/2, a); % <- a is the second argument
end
end