擴充套件歐幾里德演算法

2022-09-20 09:24:13 字數 1426 閱讀 7033

擴充套件歐幾里德演算法已經搞了好幾天了,今天終於看明白,小做總結。

講擴充套件歐幾里得演算法之前,先講歐幾里得演算法和貝祖定理。

歐幾里得演算法

歐幾里得演算法就是輾轉相除法,即gcd(a,b)=gcd(b,a%b)。

簡單證明一下:

r=gcd(a,b),a=nr,b=mr。

a%b=(n-n/m*m)r。

因為gcd(n,m)=1。

設w=n/m。

則gcd(m,n-w*m)=1。

所以gcd(m,n-n/m*m)=1。

那麼gcd(b,a%b)=1。

上**。

int gcd(int a,int

b)

return gcd(b,a%b);

}

貝祖定理

a,b是整數,c=gcd(a,b),對於任意整數x,y,a*x+b*y是c的倍數。

今天我們運用的是當gcd(a,b)|c時,關於x,y的不定方程a*x+b*y=c(a,b,c均為整數)有整數解無數個。

下面是證明:

設r=gcd(a,b)。

a=nr,b=mr,c=qr。

y=(c-a*x)/b=(qr-nr*a)/mr=(q-n*a)/m。

當x為整數時,y為整數。

反之,當c不是gcd(a,b)的倍數時,q不為整數,則當x為整數時,y不為整數,當y為整數時,x不為整數。

擴充套件歐幾里德演算法

下面就是今天的重點——擴歐。

擴歐一般是用來解決不定方程(a*x+b*y=c(a,b,c為整數常數))整數解的問題的。

首先第一步,是根據貝祖定理判斷有無整數解(gcd(a,b)|c則有整數解)。那麼c=n*gcd(a,b),則設x=n*q,y=n*p。所以a*q+b*p=gcd(a,b)。

接著是第二步,是運用歐幾里得演算法得到a*q+b*p=gcd(a,b)=gcd(b,a%b)=b*q`+(a-a/b*b)*p`=a*p`+b*(q`-a/b*p`)。

再得到遞迴式,q=p`,p=q`-a/b*p`,從而推出q,p的一組整數解,*n可得x,y的一組整數解,最終整數解有x-k(b/gcd(a,b)),y-k(a/gcd(a,b)),因為k有無數個,所以整數解由無數個。

上**。

#includeusing

namespace

std;

intx,y;

int exgcd(int a,int

b)

int w=exgcd(b,a%b);

int k=x;

x=y;

y=k-a/b*y;

returnw;}

intmain()

else

return0;

}

擴充套件歐幾里德

擴充套件歐幾里德通常用於求出二元一次方程的解,類似a x b y c a,b均不為0 的方程,a,b,c都是整數,x y的整數解。1 判斷是否有解 整數二元一次不定方程有解的充分必要是gcd a,b c。如果不能整除則無解。2 擴充套件歐幾里德求特解 歐幾里德給出了計算a x b y gcd a,b...

歐幾里德演算法

歐幾里德演算法稱為輾轉相除法,用來求已知m n兩個自然數的公因數。結合程式說明一下輾轉相除的具體情況。首先看遞迴實現 1 int getcd int m,intn 2 6if m if m n 1316 else 1720 主要計算過程分為三個步驟 1 對輸入的兩個自然數m n取餘數r,使得0 r ...

歐幾里德演算法 冪運算

文中x n 表示x的n次方 計算x n 的明顯演算法是使用n 1次乘法自乘,有一種遞迴演算法更好 n 1是這種遞迴的基準情形,否則若n為偶數,我們有x n x n 2 x n 2 若x為奇數,則x n x n 1 2 x n 1 2 x 例如 為了計算x 62 演算法將如下進行,它只用到9次乘法 在...