matlab中的扩展算法实现

时间:2017-03-30 12:59:18

标签: matlab modular-arithmetic

我找到了以下用于扩展欧几里德算法的伪代码

enter image description here

我实现了以下算法

    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;

我该如何解决这个问题?我在哪里弄错了?

2 个答案:

答案 0 :(得分:1)

问题中的错误是x1, y1, d1同时用作工作和输出变量。可以使用新的术语[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

答案 1 :(得分:1)

问题可以通过引入中间工作变量来解决,这些变量将存储递归调用的结果:

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