拓展欧几里得算法

2019-03-15  本文已影响0人  gattonero

问题

思路

首先介绍下欧几里得算法的原理,众所周知,欧几里得算法是辗转相除法,这里给出证明:

假设a>b,证明 gcd(a,b) = gcd(a mod b,b)
设a=bk+c,c=a mod b
如果D=gcd(b,c)>gcd(a,b),则等式 a=bk+c 右边除以D是整数,但左边除以D不是整数
如果gcd(b,c)<gcd(a,b)=D,则等式 c=a-bk 右边除以D是整数,但左边除以D不是整数
可见均矛盾,故gcd(b,c)=gcd(a,b)

拓展欧几里得算法也是基于这个递推式,根据裴蜀定理,线性同余方程ax+by=c有整数解的充要条件是c|gcd(a,b),那么我们设a>=b,有

解决

    public int[] extended(int a, int b, int c){//ax+by=c
        if (a<b){a^=b;b^=a;a^=b;}
        return extended(a/c,b/c);
    }

    public int[] extended(int a, int b){
        if(b==1) return new int[]{0,1};//写成b==0 return 1,0一个道理,但为什么要多一步呢?
        int[] next = extended(b,a%b);
        return new int[]{next[1],next[0]-a/b*next[1]};
    }

Tips

上一篇 下一篇

猜你喜欢

热点阅读