扩展gcd

    xiaoxiao2021-03-25  206

    若d | a && d | b

    则d | (a * x + b * y)

    且可证d是a * x + b * y ,a,b的线形组合中最小正整数(a,b,d,x,y均整数)

    d = gcd(a,b) = a * x + b * y 即d也是a,b的一个线形组合

    即,可求,a * x + b * y = d = gcd( a , b )的整数解(x0,y0)。

    扩展欧几里德求出的x,y只是一组解,x,y 的通解为 x = x0 * c + b * k, y = y0 * c - a *k a * x + b * y = p = c * d = c * gcd(a,b)

    通解如上

    //已知x2,y2

    //a2 = b1

    //b2 = a1 % b1

    //x1 = y2;

    //y1 = x2 - a1 / b1 * y2

    #include <iostream>

    using namespacestd;

    int ectgcd(int a,int b,int& x,int& y)

    {

        int d = a,t;

        if (b ==0) {

            x = 1;

            y = 0;

           

        }

        else {

            d = ectgcd(b, a % b,x,y);

            t = x;

            x = y;

            y = t - a / b * y;

            cout << x <<" " << y <<endl;

    // cout << x <<" * "   << a <<" + "<< y  << " * " << b  <<" = " << d<<endl;

        }

        

               return d;

    }

    int main()

    {

        int a,b,x,y;

        a = 99,b =78;

        cout <<ectgcd(a, b,x,y) <<endl;

        return0;

    }

    转载请注明原文地址: https://ju.6miu.com/read-2462.html

    最新回复(0)