扩展欧几里得总结

 

1)欧几里得

Gcd(a,b)=Gcd(b,a%b)

注解:递归,循环也行,a=Gcd(a,0)

2) 扩展欧几里得

有  Ax + By = D

A,B,D已知,当且仅当gcd(A,B)|D(即D%gcd(A,B)=0)时,x,y有整数解

I.典型同余模问题

问题链接:http://poj.org/problem?id=2115

题意:

for (variable = A; variable != B; variable += C)statement;

以上变量均为k位unsigned integer type (int为32位),会给出A.B.C.k,让你求这个循环运行多少次,如果是死循环,输出Forever.

题解:

(A+x*C)%2^k=B

x有解,x即为答案;

x无解,输出Forever.

进行同余模转化:

(A+x*C)%2^k=B%2^k……①

Cx+y*2^k=B-A……②

②式就很明显了,若gcd(C,2^k)|B-A,则答案有解

怎么求这个解呢?可用如下算法求出一个特解

int exgcd(int a, int b, int &x, int &y) {
    if(b == 0) {
        x = 1;
        y = 0;
        return a;
    }
    int r = exgcd(b, a % b, x, y);
    int t = x; x = y; y = t - a / b * y;
    return r;
}

  ps:关于这个算法的推导与欧几里得定理有关(难怪叫扩展欧几里得)

然后由特解求出通解:

x=x0+k(b/gcd(a,b));

y=y0+k(a/gcd(a,b));

这里的k为任意整数

最后,最小正整数解就是答案了

posted @ 2017-11-14 20:10  hzhuan  阅读(201)  评论(0编辑  收藏  举报