有關貝祖定理的一個小問題
所謂貝祖定理是說:
兩個整數 a、b 是互質的。等價於方程 ax+by=1有整數解。
當然。 貝祖定理另一種更一般的形式,說的是兩個整數 a、b有最大公因數是c,等價於方程 ax+by=c有整數解。
這兩種表述事實上是等價的。由於對另外一種形式略微一變形就得到了:
所以我們僅僅須要考慮第一種形式的貝祖定理就能夠了。
貝祖定理的證明
貝祖定理的證明並不復雜。只是由於不管是中學還是大學(除了數學專業)都非常少討論這類跟數論相關的問題,所以可能有些人會感覺這個問題有些無從下手。
這里先給個貝祖定理的簡單證明。
首先,很easy就能夠證明a、b 假設不互質。那么 ax+by=1無整數解。因此我們僅僅須要考慮a、b 是互質的這樣的情況。
當x、y取不同整數值時。ax+by 也會有不同的結果,這些結果中最小的那個正整數設為s,也就是
ax+by=s
設a整除s 的商為q,余數為r。也就是
那么
如果 r 不等於0就與我們如果s為ax+by這個集合的最小的正整數矛盾了。所以r僅僅能等於0,也就是說a能夠整除s。同理也能夠證明b能夠整除s。這說明s是a和b的公約數,而我們知道a和b是互質的,所以s僅僅能等於1。這就證明了貝祖定理。
x、y的計算
怎樣計算x、y的值是還有一個問題,當然我們知道x、y有無數多組整數解。我們僅僅須要求出一組解就夠了。
不失一般性,我們設 a > b。a = bq+r
能夠看到。我們將 ax+by=1轉化為 ax+by'=1當中d比a要小。這個過程能夠一直反復,直到當中一個整數等於1。
方程變類似形式:
ex+y=1
這時僅僅要讓x=0,y=1 就能夠了。然后一步步回帶,就能求得最初的x、y了。
這是一個典型的遞歸的過程。
以下給個C語言實現的代碼。代碼比較簡單,就沒有加入凝視:
bool Bezout(int a, int b, int *px, int *py) { int q, r; int x, y; bool ok; if( a == 1 ) { *px = 1; *py = 0; return true; } if( b == 1 ) { *px = 0; *py = 1; return true; } if( a >= b ) { q = a / b; r = a % b; if ( r == 0 ) { return false; } ok = Bezout(r, b, &x, &y); if( ok ) { *px = x; *py = y - q * x; } return ok; } else { q = b / a; r = b % a; if ( r == 0 ) { return false; } ok = Bezout(a, r, &x, &y); if( ok ) { *py = y; *px = x - q * y; } return ok; } return true; }
這里是測試用例:
#include <stdio.h> #include <stdlib.h> #include <stdbool.h> bool Bezout(int a, int b, int *px, int *py); int main() { int x, y; int a = 73; int b = 32; bool ok; ok = Bezout(a, b, &x, &y); if(ok) { printf("%d * %d + %d * %d = %d, is ok\n", a, x, b, y, a * x + b * y); } return 0; }