扩展算法在matlab中的实现
我发现了以下扩展欧几里德算法的伪代码扩展算法在matlab中的实现,matlab,modular-arithmetic,Matlab,Modular Arithmetic,我发现了以下扩展欧几里德算法的伪代码 function [x1,y1,d1]=extend_eucledian(a,b) if b==0 x1=1; y1=0; d1=a; return; end [x1,y1,d1]=extend_eucledian(b,mod(a,b)); x1
function [x1,y1,d1]=extend_eucledian(a,b)
if b==0
x1=1;
y1=0;
d1=a;
return;
end
[x1,y1,d1]=extend_eucledian(b,mod(a,b));
x1=y1;
y1=x1-floor(a/b)*y1;
d1=d1;
end
我实现了以下算法
function [x1,y1,d1]=extend_eucledian(a,b)
if b==0
x1=1;
y1=0;
d1=a;
return;
end
[x1,y1,d1]=extend_eucledian(b,mod(a,b));
x1=y1;
y1=x1-floor(a/b)*y1;
d1=d1;
end
当我按照这个程序运行时,我得到了如下结果
[x1,y1,d1]=extend_eucledian(23,20)
x1 =
0
y1 =
0
d1 =
1
我猜[x1,y1,d1]在迭代过程中没有改变它们的值,例如,我尝试了以下代码
function [x1,y1,d1]=extend_eucledian(a,b)
if b==0
x1=1;
y1=0;
d1=a;
return;
else
x1=y1;
y1=x1-floor(a/b)*y1;
d1=d1;
end
[x1,y1,d1]=extend_eucledian(b,mod(a,b));
end
但是我有
>> [x1,y1,d1]=extend_eucledian(23,20)
Undefined function or variable 'y1'.
Error in extend_eucledian (line 8)
x1=y1;
我如何解决这个问题?我哪里出错了?问题中的错误是
x1、y1、d1
同时用作工作变量和输出变量。对于输出值,可以使用新的tern[x,y d]
重写代码:
function [x y d]=eucledian_pairs(a,b)
%a>0,b>0
%d=gcd(a,b) a*x+y*b=d
[x1,y1,d1]=extend_eucledian(a,b);
x=y1;
y=x1-floor(a/b)*y1;
d=d1;
function [x1,y1,d1]=extend_eucledian(a,b)
if b==0
x1=1;
y1=0;
d1=a;
return;
end
[x1,y1,d1]=extend_eucledian(b,mod(a,b));
end
end
执行此代码将得到所需的结果
>> [x y d]=eucledian_pairs(20,25)
x =
0
y =
1
d =
5
这个问题可以通过引入中间工作变量来解决,中间工作变量将存储递归调用的结果:
function [x,y,d]=extended_euclid(a,b)
if b==0
x=1;
y=0;
d=a;
return;
end
[x1,y1,d1]=extended_euclid(b,mod(a,b));
x=y1;
y=x1-floor(a/b)*y1;
d=d1;
end
此功能按预期工作:
>> [x, y, d] = extended_euclid(23,20)
x =
7
y =
-8
d =
1
>> [x, y, d] = extended_euclid(25,20)
x =
1
y =
-1
d =
5
在最后几行中,您将重用x1、y1、d1并混合使用“输入”和“输出”值。更具体地说,您可以使用x1=y1,在下一行中使用y1=x1-…,但最后一个x1不是预期的值:您在最后一行中使用y1重写了它。尝试将extend_eucledian的结果命名为临时变量,然后计算最终值。我尝试了bit,但它不起作用,然后编写正确的代码。你的例子在我看来显然是错误的。让我们检查一下我的答案楼下的Rit仍然不起作用检查一下我的答案:-)