擴展歐幾裏德算法——求最小整數解
阿新 • • 發佈:2019-05-12
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; } } }
擴展歐幾裏德算法——求最小整數解