擴展歐幾裏得算法
阿新 • • 發佈:2017-11-19
註意 中間變量 代碼 int span pan 成了 size 擴展
用途
當我們已知$(a,b)$
擴展歐幾裏得算法可以求出滿足$p*a+q*b=GCD(a,b)$的$(p,q)$解集
$GCD(a,b)$表示$a,b$的最大公約數
前導知識
$GCD(a,b)=GCD(b,a\%b)$
$GCD(a,0)=0$
$a\%b=a-a/b*b$
推導過程
其實擴展歐幾裏得的推導過程挺自然的
$p*a+q*b$
$=GCD(a,b)$
$=GCD(b,a\%b)$
$=p*b+q*(a\%b)$
$=p*b+q*(a-a/b*b)$
$=p*b+q*a-q*a/b*b$
$=q*a+p*b-q*a/b*b$
$=q*a+(p-q*a/b)*b$
這樣不斷的遞歸下去
當$b==0$時
$p=1,q=0$
代碼
註意:
我們在求$(p-q*a/b)$的時候需要用到上一層的$p$
但此時上一層$p$已經被賦值成了$q$
所以我們需要開一個中間變量來記錄上一層的$p$
1 int exgcd(int a,int b,int &x,int &y) 2 { 3 if(b==0) 4 { 5 x=1,y=0; 6 return a; 7 } 8 int r=exgcd(b,a%b,x,y),tmp; 9 tmp=x,x=y,y=tmp-a/b*y;10 return r; 11 }
擴展歐幾裏得算法