乘法逆元的解法及证明
寫在前面
刷題過程中,為了避免高精度的整數(shù)運算,常常會要求答案對某個數(shù)取模。但這衍生了一個新問題,如果運算過程中涉及了除法,如ab\frac{a}{b}ba?,如果先對a和b取模再做除法,會導致答案錯誤。比如:
205mod10=4\frac{20}{5}\ mod\ 10 = 4520??mod?10=4
但是,
20mod105mod10=0\frac{20\ mod\ 10}{5\ mod\ 10} = 05?mod?1020?mod?10?=0
為了解決這個問題,我們需要學習新知識:模運算下的乘法逆元。
乘法逆元
什么是逆元呢?百度百科告訴我們:逆元是指一個可以取消另一給定元素運算的元素。
比如,在實數(shù)的加法中,任意實數(shù) a 和它的相反數(shù) -a,互為加法逆元。因為對于任意實數(shù) x,加上a之后,再加上-a,仍然等于 x,換言之,-a取消了x和a的加法運算。
再比如,在實數(shù)的乘法中,任意不為0的實數(shù)b和它的倒數(shù)1b\frac{1}{b}b1?,互為乘法逆元。因為對于任意實數(shù)x,乘上b之后,在乘上1b\frac{1}{b}b1?,仍然等于x,換言之,1b\frac{1}{b}b1?取消了x 和 b 的乘法運算。
接下來看看模運算下的乘法逆元定義:如果兩個整數(shù)a 和 b 滿足 (a?b?1)modp=0(a*b-1)\ mod\ p = 0(a?b?1)?mod?p=0,即 a?b≡1(modp)a*b≡1(mod\ p)a?b≡1(mod?p),則稱,a 和 b 互為模 p 的乘法逆元。
換言之,如果整數(shù)a, b, p 滿足a?b≡1(modp)a*b≡1(mod\ p)a?b≡1(mod?p),那么 b 可以取消 a 和任意整數(shù)x在模p時的乘法,即 a 和 b 互為模 p 的乘法逆元。即 x?a?b≡x(modp)x*a*b≡x (mod\ p)x?a?b≡x(mod?p),證明過程如下:
xmodp=x(a?b?1)+xmodp=(x?a?b?x)+xmodp=x?a?bmodp\begin{aligned} x\ mod\ p &= x(a*b-1)+x \ mod\ p \\ &= (x*a*b-x)+x \ mod \ p \\ &= x*a*b \ mod \ p \end{aligned} x?mod?p?=x(a?b?1)+x?mod?p=(x?a?b?x)+x?mod?p=x?a?b?mod?p?
舉個實際的例子:比如 10 和 12 互為模7時的乘法逆元。然后再找個整數(shù),比如 18,此時有:
18mod7=418\ mod\ 7 = 4 \\ 18?mod?7=4
另有,
18?10?12mod7=2160mod7=4\begin{aligned} 18 * 10 * 12\ mod\ 7 &= 2160\ mod\ 7 \\ &= 4 \end{aligned} 18?10?12?mod?7?=2160?mod?7=4?
何時存在乘法逆元
結(jié)論
先說結(jié)論:a 與 p 互質(zhì) 是 存在a關于模p的乘法逆元b 的充分必要條件。
存在逆元 → 互質(zhì)
證明 a 與 p 互質(zhì) 是 存在乘法逆元b 的必要條件。不妨先假設 a 與 b 互為模p時的乘法逆元,且a與p的最大公約數(shù)為d,則有:
(a?b?1)modp=0(a*b-1)\ mod\ p = 0(a?b?1)?mod?p=0
顯然,a*b-1 為 p 的 n 倍,n 為整數(shù),則上式轉(zhuǎn)化為:
(a?b?1)=np(a*b-1)=np(a?b?1)=np
將等式中的a與p用d代替,則等式轉(zhuǎn)化為:
(x?d?b?1)=n?y?d(x?d?b?n?y?d)=1(x?b?n?y)?d=1x?b?n?y=1d\begin{aligned} (x*d*b-1)&=n*y*d \\ (x*d*b - n*y*d) &= 1 \\ (x*b - n*y)*d &= 1 \\ x*b - n*y &= \frac{1}ze8trgl8bvbq \\ \end{aligned} (x?d?b?1)(x?d?b?n?y?d)(x?b?n?y)?dx?b?n?y?=n?y?d=1=1=d1??
顯然,x*b-n*y是一個整數(shù),所以僅當d為1時,即a與p互質(zhì)時,上述等式才可能成立。
互質(zhì) → 存在逆元
證明 a 與 p 互質(zhì) 是 存在乘法逆元b 的充分條件。
在證明之前先來回憶一下輾轉(zhuǎn)相除法:
gcd(a,p)=gcd(p,amodp)\begin{aligned} gcd(a,p) &= gcd(p, a\ mod\ p) \\ \end{aligned} gcd(a,p)?=gcd(p,a?mod?p)?
不妨用r來表示模運算的結(jié)果:
gcd(a,p)=gcd(p,r1)=gcd(r1,r2)=...=gcd(rm?1,rm)=1//因為a與p互質(zhì)\begin{aligned} gcd(a,p) &= gcd(p, r_1) \\ &= gcd(r_1,r_2) \\ &= ... \\ &= gcd(r_{m-1}, r_m) \\ &= 1\ \ //因為a與p互質(zhì) \end{aligned} gcd(a,p)?=gcd(p,r1?)=gcd(r1?,r2?)=...=gcd(rm?1?,rm?)=1??//因為a與p互質(zhì)?
將上式用除法表示,則有:
a=n1p+r1p=n2r1+r2r1=n3r2+r3...=...rm?3=nm?1rm?2+rm?1rm?2=nmrm?1rm?1=1rm=0\begin{aligned} a &= n_1p + r_1\\ p &= n_2r_1 + r_2 \\ r_1 & = n_3r_2 + r_3 \\ ... &= ... \\ r_{m-3} &= n_{m-1}r_{m-2} + r_{m-1} \\ r_{m-2} &= n_{m}r_{m-1} \\ r_{m-1} &= 1\\ r_{m} &= 0 \\ \end{aligned} apr1?...rm?3?rm?2?rm?1?rm??=n1?p+r1?=n2?r1?+r2?=n3?r2?+r3?=...=nm?1?rm?2?+rm?1?=nm?rm?1?=1=0?
由上述的m+2個等式移項可得:
r1=a?n1pr2=p?n2r1...=...ri=ri?2?ni?ri?1rm?1=rm?3?nm?1rm?2特別的,1=rm?1\begin{aligned} r_1 &= a - n_1p \\ r_2 &= p - n_2r_1 \\ ... &= ... \\ r_{i} &= r_{i-2} - n_{i}*r_{i-1} \\ r_{m-1} &= r_{m-3} - n_{m-1}r_{m-2} \\ 特別的,1 &= r_{m-1} \\ \end{aligned} r1?r2?...ri?rm?1?特別的,1?=a?n1?p=p?n2?r1?=...=ri?2??ni??ri?1?=rm?3??nm?1?rm?2?=rm?1??
將 rm-1,rm-2 … 以及 r1 依次代入
1=rm?11 = r_{m-1}1=rm?1?
可以得到用 a,p 以及 ni表示的等式:
ax+py=1ax+py=1ax+py=1
其中,x 與 y 為 n1,n2,n3 … 的加減乘的運算結(jié)果,顯然為整數(shù)。
得證,當 a 與 p 互質(zhì)時,存在整數(shù)x與y 滿足
ax+py=1ax?1=py(ax?1)modp=0ax≡1(modp)\begin{aligned} ax+py &= 1 \\ ax-1 &= py \\ (ax-1)\ mod\ p &= 0 \\ ax &≡ 1\ (mod\ p) \end{aligned} ax+pyax?1(ax?1)?mod?pax?=1=py=0≡1?(mod?p)?
即,當 a 與 p 互質(zhì)時,存在整數(shù)x 與 a互為模p時的乘法逆元。
如何計算乘法逆元
擴展歐幾里得算法
回憶一下歐幾里得的遞歸過程:
gcd(a,b)=gcd(b,amodb)=gcd(b,a?b?ab?)\begin{aligned} gcd(a,b) &= gcd(b, a\ mod\ b) \\ &= gcd(b, a - b\lfloor \frac{a}{b} \rfloor) \end{aligned} gcd(a,b)?=gcd(b,a?mod?b)=gcd(b,a?b?ba??)?
當 a 與 b 互質(zhì)時,有 x,y,x',y' 滿足:
{ax+by=1bx′+(a?b?ab?)y′=1\left\{ \begin{aligned} ax+by=1 \\ bx'+ (a - b\lfloor \frac{a}{b} \rfloor)y' = 1\\ \end{aligned} \right. ????ax+by=1bx′+(a?b?ba??)y′=1?
將上式合并移項:
bx′+(a?b?ab?)y′=ax+bya(x?y′)+b(y?(x′??ab?)y′)=0\begin{aligned} bx'+ (a - b\lfloor \frac{a}{b} \rfloor)y'&=ax+by \\ a(x-y') + b(y-(x'-\lfloor \frac{a}{b} \rfloor)y')&=0 \end{aligned} bx′+(a?b?ba??)y′a(x?y′)+b(y?(x′??ba??)y′)?=ax+by=0?
令x,y,x',y' 滿足下述關系,則對于任意 a 和 b 上述公式都能成立。
{x=y′y=(x′??ab?)y′\left\{ \begin{aligned} x &= y' \\ y &= (x'-\lfloor \frac{a}{b} \rfloor)y' \\ \end{aligned} \right. ????xy?=y′=(x′??ba??)y′?
😯好巧,這就是我們要尋找的x,y和x',y'的計算公式。另外,當 b = 0,即到達歐幾里得算法的遞歸邊界時,令 x = 1, y = 0 即可滿足ax+by=1(此時的a顯然為1)。
于是我們得到了下述代碼,最終得到的 x 即為 a 在模 b 時的乘法逆元,當然前提是函數(shù)的返回值為1,即 a 與 b 互質(zhì)。
int exgcd(int a,int b,int &x,int &y) {if(b==0) {x=1;y=0;return a;}int r = exgcd(b,a%b,x,y);int t = y;y = x-(a/b)*y;x = t;return r; }費馬小定理 & 快速冪
費馬小定理:若 p 為素數(shù),且 gcd(a, p) = 1,則滿足
ap?1≡1(modp)a?ap?2≡1(modp)\begin{aligned} a^{p-1} ≡ 1\ (mod\ p) \\ a*a^{p-2} ≡ 1\ (mod\ p) \end{aligned} ap?1≡1?(mod?p)a?ap?2≡1?(mod?p)?
于是,a 在模 p 時的乘法逆元為ap?2a^{p-2}ap?2,可用快速冪求得。
inline int quick_power(int a, int b, int p) {int ans = 1;a = (a % p + p) % p;for (; b; b >>= 1) {if (b & 1) ans = (a * ans) % p;a = (a * a) % p;}return ans; } // quick_power(a, p-2, p) 即為 a 的乘法逆元。值得注意的是,該算法僅在 p 為素數(shù)時有效,而擴歐并沒有該限制。
線性求1到n中每個數(shù)的逆元
現(xiàn)在要求1到n中每個數(shù)i在模p時的乘法逆元。
特別的,i = 1時,其乘法逆元i-1為1。
當 i > 1 時,不妨先設:
{k=?pi?j=pmodi\left\{ \begin{aligned} k &= \lfloor\frac{p}{i}\rfloor \\ j &= p\ mod\ i \\ \end{aligned} \right. ????kj?=?ip??=p?mod?i?
則有:
{p≡0(modp)(k?i+j)≡0(modp)(k?i+j)?i?1?j?1≡0(modp)k?j?1+i?1≡0(modp)?k?j?1≡i?1(modp)??pi??(pmodi)?1≡i?1(modp)\left\{ \begin{aligned} p &≡ 0\ (mod\ p) \\ (k*i +j) &≡ 0\ (mod\ p) \\ (k*i +j)*i^{-1}*j^{-1} &≡ 0\ (mod\ p) \\ k*j^{-1}+i^{-1} &≡ 0\ (mod\ p) \\ -k*j^{-1} &≡i^{-1}\ (mod\ p) \\ -\lfloor\frac{p}{i}\rfloor *(p\ mod\ i)^{-1} &≡i^{-1} \ (mod\ p) \\ \end{aligned} \right. ????????????????????????p(k?i+j)(k?i+j)?i?1?j?1k?j?1+i?1?k?j?1??ip???(p?mod?i)?1?≡0?(mod?p)≡0?(mod?p)≡0?(mod?p)≡0?(mod?p)≡i?1?(mod?p)≡i?1?(mod?p)?
而且,在遞推過程中,當我們要求i?1i^{-1}i?1時,對于任意的(pmodi)?1(p\ mod\ i)^{-1}(p?mod?i)?1都是已知的啦(因為 p mod i肯定小于 i),所以可根據(jù)(pmodi)?1(p\ mod\ i)^{-1}(p?mod?i)?1 通過常數(shù)次運算得到i?1i^{-1}i?1。
i?1≡{1,i=1??pi?(pmodi)?1,i>2(modp)i^{-1}≡\left\{ \begin{aligned} 1&, i = 1 \\ -\lfloor\frac{p}{i}\rfloor(p\ mod\ i)^{-1}&, i > 2 \\ \end{aligned} \right. \ (mod\ p) i?1≡????1??ip??(p?mod?i)?1?,i=1,i>2??(mod?p)
求任意n個整數(shù)的乘法逆元
設有 n 個整數(shù),分別為 a1,a2,a3…,對應的逆元為a1-1,a2-1,a3-1…。
設Si 為 a1 到 ai i 個數(shù)的乘積,Si-1 為 a1-1 到 ai-1 i 個數(shù)的乘積。那么 Si 與 Si-1 互為逆元。證明過程如下:
∏i=1nai?ai?1≡1modp∏i=1nai?∏i=1nai?1≡1modpSn?Sn?1≡1modp\begin{aligned} \prod_{i = 1}^{n}{a_i*{a_i}^{-1}} &≡ 1\ mod\ p \\ \prod_{i = 1}^{n}a_i*\prod_{i = 1}^{n}{a_i}^{-1} &≡ 1\ mod\ p \\ S_n*{S_n}^{-1} &≡ 1\ mod\ p \\ \end{aligned} i=1∏n?ai??ai??1i=1∏n?ai??i=1∏n?ai??1Sn??Sn??1?≡1?mod?p≡1?mod?p≡1?mod?p?
接下來,我們可以先求出 S1 到 Sn,然后通過擴展歐幾里得或者快速冪求出 Sn 的乘法逆元 Sn-1。
又有
Si?1?ai+1?1?ai+1≡Si?1(modp)Si+1?1?ai+1≡Si?1(modp)\begin{aligned} {S_i}^{-1}*{a_{i+1}}^{-1}*a_{i+1} &≡ {S_i}^{-1}\ (mod\ p) \\ {S_{i+1}}^{-1}*a_{i+1} &≡ {S_i}^{-1}\ (mod\ p) \end{aligned} Si??1?ai+1??1?ai+1?Si+1??1?ai+1??≡Si??1?(mod?p)≡Si??1?(mod?p)?
換言之,我們可以利用 ai可以取消ai-1乘法運算的性質(zhì),由Si-1 計算出 Si-1-1。
這樣就可以O(n)的計算出所有的 Si-1。
最后,由Si-1以及Si 計算出所有的 ai-1:
ai?1≡Si?1?Si?1(modp){a_i}^{-1} ≡ S_{i-1}*{S_{i}}^{-1}\ (mod\ p) ai??1≡Si?1??Si??1?(mod?p)
總結(jié)
以上是生活随笔為你收集整理的乘法逆元的解法及证明的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: QT: 界面隐藏后台显示
- 下一篇: EPLAN 部件汇总表制作