码迷,mamicode.com
首页 > 其他好文 > 详细

由不定方程想到的——数论选讲

时间:2018-10-13 11:40:45      阅读:199      评论:0      收藏:0      [点我收藏+]

标签:stream   \n   如何   除法   cout   最小   rac   另一个   pre   

所谓二元一次不定方程,指的是关于$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$

由不定方程想到的——数论选讲

标签:stream   \n   如何   除法   cout   最小   rac   另一个   pre   

原文地址:https://www.cnblogs.com/zhou2003/p/9782210.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!