扩展欧几里德算法——求最小整数解

这是一个数学推导!!!

首先我们已经知道了,如何通过扩展欧几里德算法,求出方程的其中一组解了

那么就可以继续往下看

  

  给出两个方程

    ax1+by1=gcd(a,b)

    ax2+by2=gcd(a,b)

  所以可以推出

    ax1+by1=ax2+by2

    a(x1-x2)=b(y2-y1)

  然后我们知道gcd(a,b)为a,b的最大公因数,所以我们将 A=a/gcd(a,b),B=b/gcd(a,b),接着往下推出

    A(x1-x2)=B(y2-y1)

  现在A和B两个已经是互素了,所以又可以接着推出

    (这个地方要好好理解,重点!)

    A*(n*B)=B*(m*A)

    (x1-x2)=n*B

    (y2-y1)=m*A

  这里我们从x入手

    (x1-x2)=n*B

    x1=x2+n*B

  由此,我们推出了x解的通解公式    x=x0+n*B

  同理,我们推出了y解的通解公式 y=y0-m*A

  那么我们如果要求 x 的最小整数解,也就是 x0, 不就是这样 x0=x%B

  但是要记得现在的 x是  ax+by=gcd(a,b)的x

  我们要求的 X 是  aX+bY=c的X,所以还得先转化  X=x*c/gcd(a,b).

  然后套入我们的公式

  X0=X%B

  X0=X%(b/gcd(a,b))

  嗯,到此结束,下面给下实现代码

  

void solve() 
{
    int gcd = gcd_pro(a, b, x, y);
    if (c % gcd != 0) 
    {
        cout << "无解" << endl;
    }
    else
    {
        x = x * c / gcd;
        b = b / gcd;

        x_min = x % b;
        if (x_min <= 0)
        {
            if (b < 0)b = -b;
            x_min += b;
        }
    }
}

猜你喜欢

转载自www.cnblogs.com/caibingxu/p/10850664.html