線性同餘方程(每日感謝:感謝sky神)
阿新 • • 發佈:2020-07-27
線性同餘方程
形式
\(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為有解 }