擴充套件歐幾里得演算法——exgcd
阿新 • • 發佈:2018-12-21
擴充套件歐幾里德演算法是用來在已知求解一組,使它們滿足貝祖(裴蜀)等式:
試著來搞一下
先考慮一下特殊情況,如果,那麼,顯然存在一組解
設當前的式子為,肯定存在式子%%
根據歐幾里得演算法,%
%
%(這裡的除是指整除)
於是就可以愉快的遞推下去了
程式碼賊短:
int exgcd(int a,int b,long long &x,long long &y)
{
if(b==0)return x=1,y=0,a;
int d=exgcd(b,a%b,y,x);
return y-=a/b*x,d;
}
順便普及一下逗號運算子,
:在c++中,(a,b,c)==c。(巧妙的使用可以使得程式碼複雜度降低)
當然exgcd不可能只有這麼點用途呀,它還可以用來求逆元,並且比用費馬小定理
求更方便,比如求在模意義下的逆元,如果用費馬小定理
求的話,還要保證是個質數,但是用exgcd就不用了。
怎麼求呢?
設為在模意義下的逆元,那麼滿足式子:
那麼有:
然後用exgcd搞出即可(以及這就是為什麼 a和m一定要互質 才能使得在模意義下有逆元)
以及逆元的程式碼在此:
long long inv(long long a,long long m)
{
long long x,y;
long long d=exgcd(a,m,x,y);
return d==1?(x+m)%n:-1;//不互質就沒有逆元
}