1. 程式人生 > 實用技巧 >線性同餘方程(每日感謝:感謝sky神)

線性同餘方程(每日感謝:感謝sky神)

線性同餘方程

形式

\(ax+by\equiv c \pmod b\)

求解方法

定理 1 :方程\(ax+by=c\) 與方程\(ax+by\equiv c \pmod b\)是等價的,有整數解的充要條件為\(gcd(a,b)\mid c\)

根據定理 1,方程\(ax+by=c\),我們可以先用擴充套件歐幾里得演算法求出一組解\(x_0,y_0\),也就是\(ax_0+by_0=gcd(a,b)\) ,然後兩邊同時除以\(gcd(a,b)\),再乘\(c\)。然後就得到了方程\(\dfrac{ax_0c}{gcd(a,b)}+\dfrac{by_0c}{gcd(a,b)}=c\)

,然後我們就找到了方程的一個解。

定理 2 :若\(gcd(a,b)=1\)\(x_0,y_0\)為方程 的一組解,則該方程的任意解可表示為:\(x=x_0+bk,y=y_0-ak\)(對任意整數\(k\)均成立) ,。

根據定理 2,可以求出方程的所有解。但在實際問題中,我們往往被要求求出一個最小整數解,也就是一個特解\(x\)此時\(k=b/gcd(a,b),x=(x\%k+k)%k\)

int x,y;

void exgcd(int a, int b, int &x, int &y)//x,y傳地址
{
	if (!b)
	{
		x = 1;
		y = 0;
		return;
	}
	ex_gcd(b, a % b, x, y);
	int tmp = x;
	x = y;
	y = tmp - a / b * y;
}
bool mod(int a, int b, int c, int &x, int &y)//在可以直接輸出x,y
{
	int d = exgcd(a, b, x, y);
	if (c % d)
		return 0;//0為無解
	int k = c / d;
	x *= k;
	y *= k;
	return 1;//1為有解
}

返回首頁