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

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值