gcd, exgcd

\(gcd(a,b)=gcd(b,a\%b)\)

int gcd(int a, int b) return b ? gcd(b, a % b), a;

证明 :

\(设r=a\%b,则a=kb+r.\)

\(设d是(a,b)的公约数,则d\mid a, d\mid b,因为r=a-kb,所以d\mid r,因此d也是(b,a\%b)的公约数.\)

\(设d是(b,a\%b)的公约数,则d\mid b, d\mid r, 因为a=kb+r,所以d\mid a,因此d也是(a,b)的公约数.\)

\(综上,gcd(a,b)=gcd(b,a\%b).\)

扩展欧几里得定理 : \(exgcd(a,b,x,y)\)

对于任意正整数\(a,b\), 必能找到整数\(x,y\), 使得 \(ax+by=gcd(a,b).\)

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

推导 :

\(设gcd(a,b)=d.\)

\(bx_1+(a\%b)y_1=d\)

\(即:bx_1+(a-[\frac{a}{b}]*b)y_1=d\)

\(整理得:ay_1+b(x_1-[\frac{a}{b}]*y_1)=d\)

\(因此:\)

\(x_0=y_1\)

\(y_0=x1-[\frac{a}{b}]*y_1\)

posted @ 2021-07-22 15:35  phr2000  阅读(39)  评论(0编辑  收藏  举报