嚴格證明擴充套件歐幾里得演算法的正確性

2022-05-06 15:57:08 字數 3219 閱讀 2460

引理一:\(m\mid x_i, i\in[1, k]\),則\(m\mid a_1x_1+\dots + a_kx_k, a_i\in z\)

​ 證明:設\(mb_i=x_i\),則\(a_1x_1+\dots+a_kx_k=a_1mb_1+\dots+a_kmb_k=m(a_1b_1+\dots+a_kb_k),m \mid m(a_1b_1+\dots+a_kb_k)\)

引理二:設正整數\(m \mid (a_1,\dots,a_k)\),則\(m(\frac,\dots,\frac)=(a_1,\dots,a_k)\)。

​ 證明:設\(d=(a_1,\dots,a_k)\),由\(m \mid d\),\(d \mid a_j\),得\(m \mid a_j\)(假定了整除滿足同乘同除乙個數依然成立),\(\frac \mid \frac\),因此\(\frac\)是\(\frac\)的公約數,有\(\frac\le(\frac,\dots,\frac)\)

​ 另一方面,若\(d\mid \frac,1\le j\le k\),則\(md \mid a_j,j=1,\dots,k\)。由於\(d\)是\(a_j\)的最大公約數,所以\(md\le d\),\(\frac \ge d\)

​ 取\(d=(\frac,\dots,\frac)\),則可得\(\frac=(\frac,\dots,\frac)\)

​ 兩邊同乘\(m\),可得\(m(\frac,\dots,\frac)=d=(a_1,\dots,a_k)\)

​ 將\(m=(a_1,\dots,a_k)\)代入上式,即得 \((\frac,\dots,\frac)=1\)

定理一: \((x_1, \dots , x_k)=min\\)

​ 證明:設\(s_=a_1'x_1+\dots +a_k'x_k\)。對於任意\(d\mid x_i\),由引理可得\(d\mid s_\),因此\((x_1, \dots, x_k)\mid s_\),\((x_1, \dots, x_k)\le s_\)

​ 又因為\(x_i\% s_\in [0, s_)\)【不嚴格】,且\(s_\)是\(a\)中的最小正元素,所以\(x_i\% s_=0\),即\(s_ \mid x_i\),

​ 所以\(s_\)是\(x_i\)的公約數,小於等於最大公約數。即\(s_\le (x_1,\dots,x_k)\)

​ 綜上,可得\((x_1,\dots, x_k)=s_\)

推論一:一定存在一組整數\(a_1', \dots, a_k'\),使得\((x_1, \dots, x_k)=a_1'x_1+\dots+a_k'x_k\)。這是因為\((x_1, \dots, x_k)=s\in a\),而\(a\)中的元素表示為\(a_1x_1+\dots +a_ks_k\)。因此一定存在一組整數表示\((x_1,\dots,x_k)=s\)

推論二:\((x_1,\dots,x_k)\mid a_1x_1+\dots+a_kx_k,a_i\in z\)。這是因為\((x_1,\dots,x_k)\mid x_i\),根據引理推論二得證。

【注】本節的\(a\)和\(x\)與前兩節的位置是互換了的。

設整數\(k \ge 2\),\(a_1,\dots,a_k\)是整數且不等於零,\(c\)是整數,\(x_1,\dots,x_k\)是整數變數,方程\(a_1x_1+\dots+a_kx_k=c\)稱為k元一次不定方程,\(a_1,\dots, a_k\)稱為它的係數。

定理二 k元一次不定方程有解的充要條件是\((a_1,\dots,a_k)\mid c\)

​ 證明:首先證明充分性。根據推論一,必定存在一組整數\(x_1',\dots,x_k'\),使得\(a_1x_1'+\dots+a_kx_k'=(a_1,\dots,a_k)\)。新方程的解之一就是\(x_i=x_i'\frac\)

​ 然後證明必要性。根據推論二,\((a_1,\dots,a_k)\mid a_1x_1+\dots+a_kx_k=c\),必要性直接得證。

定理三 設二元一次不定方程\(a_1x_1+a_2x_2=c\)有解,\(x_,x_\)是它的一組解,那麼它的所有解為

\[\left \ x_1=x_+\fract, \\ x_2=x_-\fract, \end \right. t=0,\pm1,\pm2,\dots

\]​ 證明:容易驗證對於所有給出的解\(x_1,x_2\),對於所有整數\(t\)都滿足不定方程4。

​ 反過來,設\(x_1,x_2\)是方程的一組解,我們有\(a_1x_1+a_2x_2=c=a_1x_+a_2x_\),進而有\(a_1(x_1-x_)=-a_2(x_2-x_)\),\(\frac(x_1-x_)=-\frac(x_2-x_)\)

​ 根據引理二,\((\frac,\frac)=1\),而上式可以轉化為\(\frac\mid \frac(x_1-x_)\)。根據定理\((m,a)=1,m\mid ab\rightarrow m \mid b\)(可用算數基本定理證明【不嚴格】),\(\frac \mid (x_1-x_)\)。

​ 因此,\(x_1=x_+\fract\),\(x_2=x_-\fract\),這就證明了滿足二元一次不定方程的解一定滿足上述解的前面的通式。

求解二元一次不定方程需要用到擴充套件歐幾里得演算法。

我們現在需要求出方程\(ax+by=z\)的解\((x,y)\)。根據定理二,方程\(ax+by=z\)有解等價於\((a,b) \mid z\),因此我們只要先求出方程\(ax+by=(a, b)\)的解,再將解的值乘上\(\frac\),就求出了原方程的一組解。

那麼,如何求解\(ax+by=(a,b)\)?考慮歐幾里得演算法\((a,b)=(b, a\%b)\),設\(bx'+(a\%b)y'=(b,a\%b)=(a,b)=ax+by\),

則\(bx'+(a\%b)y'=bx'+(a-b\lfloor\frac\rfloor)y'=ay'+b(x'-\lfloor \frac\rfloor)\)

可以發現\(x=y',y=x'-\lfloor \frac\rfloor\)就是方程\(ax+by=(a,b)\)的一組解。

不斷地列出\(ax+by=ay'+b(x'-\lfloor\frac\rfloor)\),代入\(x=y',y=x'-\lfloor \frac\rfloor\)求解,最後就能求出\(ax+by=(a,b)\)的某一組解\((x_0,y_0)\)。在這之後再利用定理三求出通解:

\[\left \ x_1=x_+\fract, \\ x_2=x_-\fract, \end \right. t=0,\pm1,\pm2,\dots

\]就完成了解二元一次不定方程的過程。

打【不嚴格】的部分是為了可讀性省略的部分。如果展開會引入一些過長的概念。

擴充套件歐幾里得演算法

includeusing namespace std typedef struct nodenode node t node extend euclid int a,int b else extend euclid b,a b int tmp t.x t.x t.y t.y tmp a b t.y ...

擴充套件歐幾里得演算法筆記

在學習擴歐之前,我們首先要了解下面這兩個部分的知識。給定數 a,b 求 gcd a,b 也就是說,對於數 a,b gcd a,b gcd b,a b 對於歐幾里得演算法,也比較好用遞迴實現。c 如下 int gcd int a,int b 若 a,b 是整數,且 gcd a,b d 那麼對於任意的整...

擴充套件歐幾里得演算法分析詳細

如果a,b兩數是整數,那麼一定存在整數x,y 使得 ax by bcd a,b int bcd int a,int b 這個演算法很好理解,如果實在看不懂,用筆紙帶入兩個數相信你能懂 代入數字加深理解 求 50,35 50 1 35 15 15 50 1 35 35 15 2 5 5 35 15 2...