matlab - matlab中的扩展算法实现

标签 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;

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

最佳答案

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

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

关于matlab - matlab中的扩展算法实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43118624/

相关文章:

matlab - 如何检测可以在蒙版上绘制的最大矩形?

matlab - 用于图像处理/计算机视觉的良好且兼容的网络摄像头?

matlab - 如何在matlab中应用 Gamma 滤波器?

algorithm - 模算术 (a*b/e)%m?

java - 模运算 : Division over factorials % Prime

python - scipy.sparse.linalg.eigsh() 不会给出与 Matlab 的 eigs() 相同的结果,为什么?

matlab - 多维数组的逐元素最大值

java - 两个整数的 Mod 除法

c - 具体模乘算法

c - c如何计算余数?