1. 程式人生 > >擴展歐幾裏得算法、裴蜀定理與乘法逆元

擴展歐幾裏得算法、裴蜀定理與乘法逆元

關於 算法 需要 bsp 同時 們的 乘法 str mod

擴展歐幾裏得算法

擴展歐幾裏得算法(擴O)能在求gcd(a,b)的同時求出丟番圖方程ax+by=gcd(a, b)的解。

然而怎麽求呢?我們觀察gcd(a, b)=gcd(b, a%b),所以設如下兩個方程:

ax+by = gcd(a,b) = d;

bx’+(a%b)y’ = gcd(b,a%b);

明顯gcd(a,b) = gcd(b,a%b),也就是ax+by = bx’+(a%b)y’。

為了求得x與y,我們需要保證a,b不變,所以:ax+by = bx’+(a%b)y’ = bx’+(a-[a/b]*b)y’

=ay’ + b(x’ – [a/b]y’)  ([a/b]表示a/b的值向下取整。)

所以可得恒等關系: x = y’ , y = (x’ – [a/b]y’)。這樣就求出了一組特解。

那麽如何求全解呢?直接給出遞推式:

x = x0 + (b/gcd)*t

y = y0 – (a/gcd)*t

明顯,b/gcd與a/gcd是互素的,也就是說它們的gcd為1。如果它們再除以一個值,某些解可能就不是整數了。

裴蜀定理

擴O有什麽卵用嗎?其實它可以求線性丟番圖方程(不定方程)。

對任何整數a、b和它們的最大公約數d,關於未知數x和y的線性丟番圖方程(稱為裴蜀等式):

ax + by = m

有解當且僅當m是d的倍數。因為ax+by=gcd(a,b)。如果m不是d的整數倍的話,m就不是整數了。而因為是丟番圖方程,所以a,b,x,y都為整數。m不為整數時方程無解。

裴蜀等式有解時必然有無窮多個整數解,每組解x、y都稱為裴蜀數,可用擴O求得。只要將x與y同時乘上m/gcd(a,b)就行了。

特別來說,方程 ax + by = 1 有解當且僅當整數a和b互素。(因為gcd(a,b)=1)

乘法逆元

給定一個形如ax≡1 (mod m)的關於x的方程,x即為a關於m的乘法逆元。

怎麽求呢?我們把它等價一下:ax mode m = 1 mod m = 1,ax=m(-y)+1,ax+my=1。

也就是說,只要求出ax+my=1這個方程的解就行了。是不是有點熟悉?對,用擴O+裴蜀求出x,y。

(註意要滿足gcd(a,m)=1)

但是明顯,一道題目出給你不可能讓你輸出無數解,通解也不現實,一般是讓你求出x最小的正整數解。那怎麽辦呢?

x的通解是x0+m/gcd*t,在乘法逆元情況下gcd=1,所以不用考慮。所以x的通解是x0+mt。

因為通解是x0+mt,明顯最小正整數解的區間是[ 0,m),所以似乎只要讓x0%m就可以找到最小解了。

可是萬一x0%m是負數呢?答案是取絕對值就好了。(我也不知道為什麽)

下面貼代碼:(待更)

擴展歐幾裏得算法、裴蜀定理與乘法逆元