扩展欧几里德算法

之前见过若干解二元一次不定方程解法,都看的个一知半解的...

方法(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‘         


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值