1. 程式人生 > >擴展歐幾裏德算法——求最小整數解

擴展歐幾裏德算法——求最小整數解

pre 推出 數學 歐幾裏德算法 bsp 們的 span style 中一

這是一個數學推導!!!

首先我們已經知道了,如何通過擴展歐幾裏德算法,求出方程的其中一組解了

那麽就可以繼續往下看

  

  給出兩個方程

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

擴展歐幾裏德算法——求最小整數解