之前见过若干解二元一次不定方程解法,都看的个一知半解的...
方法(1):数论书上的定理来解答...说实话定理的理解和证明真心的不简单.....
方法(2): a = q1*b +r1; r1 = a - q1*b;
b = q2*r1+r2; r2 = - q2*a + (1+q1*q2)*b
..................... ............................................
结论:最新余数 = a 的倍数 + b 的倍数;
最后余数gcd(a,b)= a 的倍数 + b 的倍数;
gcd(a,b)= a*x + b*y ; x = a 的倍数 / a ;y = b 的倍数 / b;
方法(3):
a*x + b*y = gcd(a,b); 式子1
a‘*x’ + b'*y' = gcd(a',b'); 式子2
a' = b; b' = a%b = a - (a/b)*b ; 式子3 注:’ / ‘ 是C语言中的除法
式子3 代入式子2得:b*x' + (a-(a/b)*b)*y' = gcd(a',b'); 式子4
式子4变形得:a*y' + b*(x' - (a/b)* y')= gcd(a‘,b');
比对式子1和式子4,则有:x = y’ ; y = x' - (a/b)* y' ;,所以只要知道 x' 和 y‘ 就一定求的出 x , y ;
/*
方法三:源代码----扩展欧几里德
*/
#include<iostream>
using namespace std;
int x,y;
void kzgcd(int a,int b){
if(b==0){
x=1,y=0;
return ;
}
kzgcd(b,a%b);
int t=y;
y=x-(a/b)*y;
x=t;
}
int main(){
int a,b;
while(cin>>a>>b){
kzgcd(a,b);
cout<<x<<" "<<y<<endl;
}
}
(4)说明:ax - by = 1 ;===>> ax + b*(-y) = 1; (处理系数为负数的情况...)
令 (-y) = t ;
则:ax + bt =1;
解的 x‘ ,和 t’ ====>> y = -t ;a 的逆元依旧不变是 x‘