二元一次不定方程

一、假设(x0,y0)为a*x + b*y = c  (a,b,c,x,y为整数,a、b互质)的一组解,证明该不等式的通解为:(x0 + k*b,y0 - k*a);

证明:

1、首先将(x0 + k*b,y0 - k*a)带入原方程,使得方程成立,说明这些解为原方程的解。

2、假设除了这些解之外还存在至少一个解(x1,y1),这个点坐落在(x0+k1*b,y0-k1*a)和(x0+(k1+1)*b,y0-(k1+1)*a)之间,如下图所示:

如果(x1,y1)是这两点连成线段的的n等分点(2等分、3等分......n等分点),那么a和b具有公约数n。

如果(x1,y1)不是这两点连成线段的n等分点,那么可以还可以等间隔找出其他的解:



其中最后一个点与(x0+(k1+1)*b,y0-(k1+1)*a)的横坐标距离为(|b|%|M|),

然后又可以以(|b|%|M|)等间距找到一系列点,就像辗转相除法一样最终可以找到为b的约数的距离(可以为1),一旦找到这样的点(n1等分点)同样说明a和b具有公约数n1.与题设a,b互为质数矛盾。

二:

对于方程 a*x + b*y = 1  (a,b,x,y为整数,a、b互质)---------------------------------(1式)

设a/b = k,a%b = t;则a = b*k+t;

原方程变形为:

(b*k+t)*x + b*y = 1;

即b*(k*x+y) + t*x = 1;-----------------------------------------------------------------------(2式)

2式与1式为同样的问题,只是参数有a,b变成了b,t(参数减小了,相当于问题规模缩小了),因此可以设计一个递归的方法解这个方程。




/*

 * test.cpp
 *
 *  Created on: 2013-8-28
 *      Author: zhijian
 */
#include <stdio.h>


int gcd(int a,int b){
return a?gcd(b%a,a):b;
}
int extends_gcd(int a,int b,int &x,int &y){
if(b==0){
x = 1;
y = 0;//这里可以为任意整数值
return a;
}
int tempx;
int result = extends_gcd(b,a%b,tempx,y);
x = y;
y = tempx - a/b*x;
return result;
}
void F(int a,int b,int c){
int x0,y0;
int gc = gcd(a,b);
a /= gc;
b /= gc;
c /= gc;
extends_gcd(a,b,x0,y0);
printf("%d*x+%d*y=%d的通解为:(%d+k*%d,%d-k*%d)\n",a,b,c,x0*c,b,y0*c,a);
}




int main(){
F(111,-321,75);
return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值