歐幾里得算法


 

一、歐幾里得算法(輾轉相除法)

ll gcd(ll a, ll b){
    if(b==0)    return a;
    else return gcd(b,a%b);
}

 

二、擴展歐幾里得算法

在求a,b的gcd的同時求出一組特解 x,y滿足方程  ax + by = gcd(a,b)

 

void extgcd(ll a,ll b,ll& d,ll& x,ll& y){
    if(!b){ d=a; x=1; y=0;}
    else{ extgcd(b,a%b,d,y,x); y-=x*(a/b); }
}

 

三、關於方程 ax + by = c

若gcd(a,b) | c,則方程有解,否則無解。

 

【解法】先運用擴展歐幾里得算法求出ax + by = gcd(a,b) 一組特解x0,y0

則通解:

x = x0 + b/gcd(a,b) * t

y = y0 - a/gcd(a,b) * t

對應方程 ax + by = c只需要在通解基礎上乘以一個比例系數:c/gcd(a,b)

 

【求最小正整數解】

 使用拓展歐幾里德找到ax+by=c的一組整數解(x0,y0)之后,

令k=b/gcd(a,b),x'=(x0%k+k)%k,y'=(c-ax)/b,就可以得到x的最小正整數解。

同理,令k=a/gcd(a,b),y'=(y0%k+k)%k,x'=(c-by)/a,就可以得到y的最小正整數解。

 

四、解模線性方程 ax ≡ b (mod p)

先對方程進行轉換  (ax - b) = -y*p 根據同余的性質ax與b的差是模數的倍數

移項可知: ax + py = b

顯然,這個方程有解的條件是gcd(a,p) | b

用擴歐先求出ax + py = gcd(a,p)的一個解x0

則ax + py = b的一個特解是 x = b/gcd(a,p) * x0

然后把x處理成最小的正整數,x = (x%p + p) % p即可

ll linearCong(ll a, ll b, ll p){
    ll d,x,y;
    extgcd(a,p,d,x,y);
    if(b % d != 0)    return -1;
    x = x*b/d;
    x = (x%p + p) % p;
    return x;
}

 

五、求逆元

六、解模線性方程組

這兩節見另一篇博客:中國剩余定理

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM