gcd 和 同余方程(Exgcd)


求關於x的同余方程 ax≡1(mod b) 的最小正整數解。

對於 100%的數據,2≤a,b≤2*109

NOIP 2012 提高組 第二天 第一題

(只看Exgcd的自行跳過這段文字)
先撇開擴展歐幾里得什么的不管,首先證明輾轉相除法。
gcd(greatest common divisor),是一種計算兩個數最大公約數的算法,時間復雜度為O(1)。簡單來說,我們定義gcd(a,b)為a、b的最大公約數,那么gcd(a,b)=gcd(b,a mod b)。一般使用遞歸計算,在最后一層,a≡0(mod b)的時候,這一層的b即為答案。
下面給出證明:
令a>b,則存在正整數k、r,使得a=kb+r,而r≡a(mod b),所以我們要證明的結論就是gcd(a,b)=gcd(b,r)。
若r=0,那么以上結論顯然。
那么,若r≠0呢?
假設gcd(a,b)=d,那么存在正整數p、q,使得a=pd,b=qd(p>q)。
所以pd=kqd+r,整理得r=(p-kq)d。因為r>0,所以pd>kqd,顯然p-kq為正整數,所以r必為d的倍數,不難證明gcd(a,b)=gcd(b,r),也就是gcd(a,b)=gcd(b,a mod b)。
 1 #include<bits/stdc++.h>
 2 #define LL long long
 3 using namespace std;
 4 
 5 LL a,b;//不開long long見祖宗 
 6 
 7 LL gcd(LL a,LL b)
 8 {
 9     if(b==0) return a;
10     return gcd(b,a%b);
11 }
12 int main(){
13     scanf("%d%d",&a,&b);
14     printf("%lld",gcd(a,b));
15     return 0;
16 }
View Code

 

踏入正題~
問題是求解同余方程 ax≡1(mod b) 的最小正整數解
將問題轉化一下,這個方程的實質是ax+by=1(其中y為整數)。
擴歐求的是ax+by=gcd(a,b)的解。
那顯然,這里的gcd(a,b)=1,所以這里a,b互質。
 
擴展歐幾里得算法~前置知識:輾轉相除法。
對於ax+by=gcd,輸入中已經給了a、b我們只要求出一組x,y解,滿足x是無數組解中最小的正整數。
假設我們求出了另一組數x 2、y 2,使得bx 2+(a mod b)y 2=gcd(b,a mod b),則因為gcd(a,b)=gcd(b,a mod b),所以bx 2+(a mod b)y 2=gcd(a,b);
聯立等式,得到ax+by=bx 2+(a mod b)y 2
我們可以將a mod b轉化成a-(a/b)*b。
所以ax+by=bx2+(a-(a/b)*b)y2
ax+by=ay2-b(x2-(a/b)y2)
解得x=y2,y=x2(a/b)y2。
對於等式bx2+(a mod b)y2=gcd(b,a mod b),我們再觀察等式ax+by=gcd(a,b)。發現兩個等式本質上是相同的,可得依次推出x3,y3,x4,y4……
直到最后一組b=0時,解得x=1,y=任意整數,當然,y最好取0,有可能會數值越界。
另外,x還要進行最后的處理,x=(x%b+b)%b就做到了x為最小正整數解,想想為什么?
 1 #include<bits/stdc++.h>
 2 #define int long long
 3 using namespace std;
 4 
 5 int a,b,x,y;
 6 
 7 void Exgcd(int a,int b)
 8 {
 9     if(b==0)
10     {
11         x=1,y=0;//最終的x、y 
12         return;
13     }
14     Exgcd(b,a%b);
15     int tmp=x; 
16     x=y;//更新上一層x 
17     y=tmp-(a/b)*y;//更新上一層y 
18 }
19 signed main()//main函數不能為long long 
20 { 
21     scanf("%lld%lld",&a,&b);
22     Exgcd(a,b);
23     x=(x%b+b)%b;//最小正整數解 
24     cout<<x<<endl;
25     return 0;
26 }
View Code

數學題多手算模擬幾遍就理解了~


免責聲明!

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



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