有關貝祖定理的一個小問題
所謂貝祖定理是說:
兩個整數 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;
}
