1. 程式人生 > >由不定方程想到的——數論選講

由不定方程想到的——數論選講

正整數 () clu 遇到的問題 推出 假設 class 存在 數論

所謂二元一次不定方程,指的是關於$x,y$的,形如$ax+by=c$的方程

在這裏我們約定$a,b,c$均為整數。

那麽我們遇到的問題是:如何判斷這個方程有解呢?

裴蜀定理:設$a,b,d$均為整數,且$(a,b)=d$,則存在$u,v$使得$ua+vb=d$

證明:由$(a,b)=d$知$且d|a且d|b$,那麽就有$d|ua+vb$

? 記$ua+vb$的最小正值為$s$,則$d|s$

? 對a做帶余除法得:$,且與均為整數a=qs+r(0\leq r<s,且q與r均為整數)$

? 則$r=a-qs=a-q(ua+vb)=(1-qu)a+(-qv)b$,故r為a,b的線性組合(你可以將線性組合理解為一個整數z可以被表示成ax+by(都是整數))

? 而s為$ua+vb$的最小正值且$0\leq r<s$,所以$r=0$,即$a=qs$

? 所以$s|a$

? 同理可證$s|b$

? 故$即s|(a,b)即s|d$,又由$d|s$知$d=s$

在明確了裴蜀定理之後,我們便可以得出二元一次不定方程有解的條件:$gcd(a,b)|c$

證明:設$d=gcd(a,b),a=a_1d,b=b_1d,c=c_1d$,則原方程可化為$a_1x+b_1y=c_1,gcd(a_1,b_1)=1$

? 由裴蜀定理知,存在整數$x_0,y_0$,使得$a_1x_0+b_1y_0=1$

? 所以$a_1(x_0c_1)+b_1(y_0c_1)=c_1$

? 從而原方程有一組整數解$x=x_0c_1,y=y_0c_1$

我們在剛剛的證明中構造出了方程的一組解,很明顯的發現如果按照上述方法求解明顯是行不通的,所以我們必須得想一個方法求出不定方程的一組解

在上面的證明過程中,除了已知數,我們反復提到了另一個數$gcd(a,b)$

我們來看一下能否從這個數中發現一些端倪

先解這個方程$ax+by=gcd(a,b)$

(1)若$b=0$,則$gcd(a,b)=a$,原方程即$a·x+0·y=a$,顯然$x=1,y=0$

(2)若$b\neq 0$,則$gcd(a,b)=gcd(b,a\ mod\ b)$

? 由此可以知道$ax+by=bx_0+(a\ mod\ b)y_0=bx_0+(a-a\ div\ b*b)y_0=ay_0+b(x_0-a\ div \ b*y_0)$

因此$x=y_0,y=x_0-a\ div\ b*y_0$

而我們已經知道了最後一次的$與x_0與y_0$的值

所以逐層往上倒推即可

由於所有過程是建立在求$gcd(a,b)$的基礎上的,所以這個方法叫做擴展歐幾裏得

代碼如下

 1 #include<iostream>
 2 #include<string>
 3 #include<string.h>
 4 #include<stdio.h>
 5 #include<algorithm>
 6 #include<vector>
 7 #include<queue>
 8 #include<map>
 9 using namespace std;
10  
11 void exgcd(int a,int b,int &x,int &y)
12 {
13     if
(b==0) {x=1;y=0;return;} 14 exgcd(b,a%b,x,y); 15 int tmpx=x,tmpy=y; 16 x=tmpy;y=tmpx-(a/b)*tmpy; 17 } 18 19 int main() 20 { 21 int a,b; 22 cin >> a >> b; 23 int x,y; 24 exgcd(a,b,x,y); 25 cout << x << " " << y; 26 return 0; 27 }


若不定方程為$ax+by=k*gcd(a,b)$,則直接在所求得的$x,y$的基礎上乘上$k$即可

我們在求出了原不定方程的一組解後,能否用它來推出所有解呢?

假設我們當前求出的解是$(x_0,y_0)$,下一組解是$(x_0+d_1,y_0+d_2)(其中d_1是滿足條件的最小的正整數)$

則$a(x_0+d_1)+b(y_0+d_2)=c,ax_0+by_0=c$

帶入解得$ad_1+bd_2=0$,即$\frac{d_1}{d_2}=-\frac{b}{a}$

化簡得$\frac{d_1}{d_2}=-\frac{\frac{b}{gcd(a,b)}}{\frac{a}{gcd(a,b)}}$

因而二元一次不定方程$ax+by=c$的一般解可表示為

$$x=x_0+k*\frac{b}{gcd(a,b)},y=y_0-k*\frac{a}{gcd(a,b)}$$,其中$k\in Z$

由不定方程想到的——數論選講