擴展歐幾裏得算法、裴蜀定理與乘法逆元
擴展歐幾裏得算法
擴展歐幾裏得算法(擴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是負數呢?答案是取絕對值就好了。(我也不知道為什麽)
下面貼代碼:(待更)
擴展歐幾裏得算法、裴蜀定理與乘法逆元