扩展欧几里得算法(求最大公约数与逆)

来源:互联网 发布:网络主播协议 编辑:程序博客网 时间:2024/05/16 17:05
#include <iostream>class GCD{    public:       long long a1,a2;       long long Gcd;       long long u,v;      // Gcd=this->gcd(a1,a2);    public:        /*long gcd(long a1,long a2){            if(a2==0){                return a1;            }            else{                return gcd(a2,a1%a2);            }        }*/        GCD(long long i,long long j){            a1=i>=j?i:j;            a2=i+j-a1;;        }        void Euclid_extend(){            long long U_temp[100],V_temp[100];            long long b[100];            int i;            b[0]=(a1>=a2?a1:a2);            b[1]=a1+a2-b[0];            U_temp[0]=0;            V_temp[0]=1;            U_temp[1]=1;            if(b[1]==0){                u=1;                v=0;                Gcd=u*b[0]+v*b[1];                return;            }            V_temp[1]=-(b[0]/b[1]);            if(b[0]%b[1]==0){                u=0;                v=1;                Gcd=u*b[0]+v*b[1];                return;            }            else{                b[2]=b[0]%b[1];                i=1;                if(b[1]%b[2]==0){                    u=1;                    v=V_temp[1];                    Gcd=u*b[0]+v*b[1];                    return;                }                else{                    Euclid_extend_compute(U_temp,V_temp,i,b);                    u=U_temp[i];                    v=V_temp[i];                    Gcd=u*b[0]+v*b[1];                    return;                }            }        }        void Euclid_extend_compute(long long U_temp[],long long V_temp[], int &i,long long b[]){            long long q;            q=b[i]/b[i+1];            b[i+2]=b[i]%b[i+1];            if(b[i+2]==0){                return;            }            else{                 U_temp[i+1]=U_temp[i-1]-q*U_temp[i];                 V_temp[i+1]=V_temp[i-1]-q*V_temp[i];                 i++;                 Euclid_extend_compute( U_temp, V_temp, i, b);                 return;            }        }};using namespace std;int main(){    long long i,j;    cin>>i>>j;    GCD gcd_compute(i,j);    //gcd_compute.Gcd=gcd_compute.gcd(i,j);    //cout<<gcd_compute.gcd(i,j)<<endl;    //cout<<i/161<< ' '<<j/161<<endl;    gcd_compute.Euclid_extend();    cout<<gcd_compute.Gcd<<' '<<gcd_compute.u<<' '<<gcd_compute.a1<<' '<<gcd_compute.v<<' '<<gcd_compute.a2<<endl;    //cout<<(long long)16534528044*(-518146091)+(long long)8332745927*648263<<endl;    return 0;}

0 0
原创粉丝点击