1. 擴展歐幾里德算法是用來在已知a, b求解一組x,y,使它們滿足貝祖等式: ax+by = gcd(a, b) =d(解一定存在,根據數論中的相關定理)。擴展歐幾里德常用在求解模線性方程及方程組中。
下面的模板即用來求一組x,y的特解
2.設c是b的逆元,則有b*c≡1(mod m);
推論:(a/b)%m=( a*(b的逆元))%m=(a%m * (b的逆元)%m)%m
3.同餘定理:給定一個正整數m,如果兩個整數a和b滿足(a-b)能夠
被m整除,即(a-b)/m得到一個整數,那麼就稱整
數a與b對模m同餘,記作a≡b(mod m)。
數學表述:
(a+b)%c=(a%c+b%c)%c
(a*b)%c=(a%c*b%c)%c
除法沒有上述表述,除法可轉化成乘法來求,見2
下面的模板即用擴展歐幾里得求逆元的模板
#include<cstdio>
int exgcd(int a,int b,int &x,int &y)
{
if(!b)
{
x=1;
y=0;
return a;
}
int r=exgcd(b,a%b,x,y);
int t=x;
x=y;
y=t-(a/b)*y;
return r;
}
int main()
{
int a,b,x,y;
scanf("%d %d",&a,&b);
int c=exgcd(a,b,x,y);//最大公約數
printf("%d %d\n",c,(x+b)%b);
return 0;
}
其中(x+b)%b即爲逆元