Inverse Element #
反元素是指在運算中使原本運算還原度元素,在小學學過的負數和倒數其實就是加法和乘法的反元素,這裡談的則是模下乘法反元。 模反元素的定義是,在模 n 的情況下 ab相乘後取模為 1,可以表達成:
\(ab\equiv 1{\pmod {n}}\)也可以寫成:
\(a^{{-1}}\equiv b{\pmod {n}}\)整數 a 對模數 n 之模反元素存在的充分必要條件是 a 和 n 互質,若此模反元素存在,在模數 n 下的除法可以用和對應模反元素的乘法來達成,此概念和實數除法的概念相同。
如何求模反元素 #
由上可知,不是所有元素都存在模反元素。那什麼情況會用到模反元素呢?許多排列組合相關的問題因為答案過大,題目通常要求對 1e9+7 取模,在排列組合的公式中,常會出現除以某階乘的運算,此時就需要用到反元素,因為在同餘的性質中並不包含除法的分配率,也就是
\(\dfrac{a}{b} \% c \ne \dfrac{a\%c}{b\% c}\)對此可以乘以分母的模反元素達到一樣的效果,找反元素的方法有三種:
擴展歐幾里德法 #
\[ax+ny=1\]原理和求線性方程一樣,在模 n 下
\[ax+ny \equiv ax \equiv 1\]因此求出一組 x, y 後 x 即為 a 的模反元素。
void exgcd(int a, int b, int& x, int& y) {
if (b == 0) {
x = 1, y = 0;
return;
}
exgcd(b, a % b, y, x);
y -= a / b * x;
}
快速冪法 #
透過費馬小定理可以列出,費馬小定理可以用 (a+1)^n 以二項式展開證明看看。
\(ax \equiv 1 \pmod b \\ ax \equiv a^{b-1} \pmod b \\ x \equiv a^{b-2} \pmod b\)用擴展歐幾里德法前提是 a, b 互質,而費馬小定理的前提則是 b 為質數。
inline int qpow(long long a, int p) {
int b = 1;
a = (a % p + p) % p;
for (int i = p-2; i; i >>= 1) {
if (i & 1) ans = (a * ans) % p;
a = (a * a) % p;
}
return b;
}
線性求逆元 #
常遇到需要求多個數字的模反元素,此時是可以透過線性的時間算出 n 個數字的反元素。
\(i^{-1} \equiv \begin{cases} 1, & \text{if } i = 1, \\ -\lfloor\frac{p}{i}\rfloor (p \bmod i)^{-1}, & \text{otherwise}. \end{cases} \pmod p\)inv[1] = 1;
for (int i = 2; i <= n; ++i) {
inv[i] = (long long)(p - p / i) * inv[p % i] % p;
}