擴展歐幾里得求逆元模板

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即爲逆元

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章