欧几里得学习笔记

GCD

\(gcd(x,y)=gcd(x,y-x)\)

int GCD(int x,int y){return y? x:GCD(y,x%y);}

EXGCD

扩展欧几里得用于求一组特解 \((x,y)\) 使得 \(ax+by=(a,b)\)

\(\because ax+by=(a,b)\)

\(\therefore ax+by=(b,a\bmod b)=bx'+(a\bmod b)y'=bx'+(a-\lfloor\frac{a}{b}\rfloor b)\times y'=ay'+(x'-\lfloor \frac{a}{b} \rfloor y') \times b\)

\(ax+by=ay'+(x'-\lfloor \frac{a}{b} \rfloor y') \times b\)

所以只要每次递归进行以下操作

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

求逆元

\(a\times x \equiv 1\pmod b\),且 \(gcd(a,b)=1\),则称 \(x\)\(a\) 的逆元,记为 \(a^{-1}\)

可以用扩展欧几里得求解。

LL inv(int a,int mod){
    LL x,y;
    LL tmp=exgcd(a,mod,x,y);
    return tmp==1?(x%mod+mod)%mod:-1;
}

线性处理

\(p=k\times i+r\),则有 \(k\times i+r \equiv 0 \pmod p\)

\(k\times r^{-1}+i^{-1} \equiv 0 \pmod p\)

\(i^{-1} \equiv -k\times r^{-1} \pmod p\)

\(i^{-1} \equiv -[\frac{p}{i}]\times (p \bmod i)^{-1} \pmod p\)

inv[i]=-(p/i)*inv[p%i];

求解线性同余方程

1.对于方程 \(a\times x + b\times y=c\),该方程等价于 \(a\times x \equiv c \pmod b\),有解的充分必要条件是 $gcd(a,b)|c $$

2.若 \(gcd(a,b)=1\),且 \(x_0,y_0\)\(a\times x+b\times y=c\) 的一组特解。

则该方程的任意解可以表示为 \(x=x_0+b\times t\)\(y=y_0-a\times t\)

特别的,若要求最小非负整数 \(x\) , 则令 \(t=\frac{b}{gcd(a,b)}\),再令 \(x=(x\bmod t+t)\bmod t\)

bool solve(int a,int b,int c,int &x,int &y){
    int d=exgcd(a,b,x,y);
    if(c%d) return false;
    int k=c/d;
    x*=k;y*=k;
    return true;
}
posted @ 2019-03-07 21:21  Kreap  阅读(151)  评论(0编辑  收藏  举报