【数论】同余、费马小定理、乘法逆元
同余
\(a = pm + r, b = pn + r(p, m, r, n \in \mathbb{N})\),则 \(a\) 与 \(b\) 在模 \(p\) 情况下同余,记作 \(a \equiv b \pmod{p}\)。
同余具有传递性、结合律等性质。若 \(a \equiv b \pmod{p}, c \equiv d \pmod{p}\),则有:
- \(a \pm c \equiv b \pm d \pmod{p}\)
- \(a \times c \equiv b \times d \pmod{p}\)
- \(a^n \equiv b^n \pmod{p}\)
证明的话,可以运用同余的定义,表示 \(a, b, c, d\):
\(a = np + r_1, b = mp + r_1, c = xp + r_2, d = yp + r_2\).
那么:
\(a \pm c = (n \pm x)p + (r_1 \pm r_2), b \pm d = (m \pm y)p + (r_1 \pm r_2)\).
观察到,他们的余数部分是一样的,所以就有 \(a \pm c \equiv b \pm d \pmod{p}\).
对于其他的性质,也可以仿照上述方法证明。此处不展开说明。
但有一点是需要格外注意的:同余式中如果想除去一个数不能直接操作,如果直接除去某个数不一定能保证整除。在同余方程中,除去一个数等价于乘上这个数的逆元。很好理解:\(ab\equiv c \pmod p\),根据同余方程的性质,\(ab\times b^{-1} \equiv c \times b^{-1} \pmod p\)。又有 \(b \times b^{-1} \equiv 1 \pmod p\),所以原式变形为:\(a\equiv c \times b^{-1} \pmod p\),也就相当于除去了 \(b\)。
费马小定理
若 \(p\) 为一个质数,则有 \(a^{p - 1} \equiv 1 \pmod{p}\).
证明:待补充。
乘法逆元
定义和前提
若 \(\gcd(a, b) = 1, ax \equiv 1 \pmod{b}\), 则称 \(x\) 是 \(a\) 模 \(b\) 意义下的 乘法逆元,记作 \(a^{-1}\)。
为什么一定要满足 \(\gcd(a, b) = 1\) 呢?
考虑,\(\gcd(a, b) \neq 1\) 时,同余方程是否可能成立。
首先,先了解一个性质:若 \(d\) 是 \(a\) 的因子,那么 \(d\) 的倍数模以 \(a\) 的余数,一定能被 \(d\) 整除。
由题,可表示 \(a = pd\),\(d\) 的倍数为 \(b = qd\)。
只要把 \(a\) 表示成 \(a = kb + r\),并且证明 \(d \mid r\) 即可。
带入:\(pd = k(qd) + r\\\);
\(\;\;\;\;\;\;\;\;\;r = pd - kqd\\\);
\(\;\;\;\;\;\;\;\;\;r = (p - kq)d\).
因为 \(k, q, p\) 都是整数,所以 \(p - kq\) 一定也是整数。所以必有 \(d\mid r\),上述性质即得证。
所以如果 \(\gcd(a, b) = d > 1\),那么 \(a\) 除以 \(b\) 的余数一定是 \(d\) 的倍数,而 \(d > 1\),所以 \(ax\equiv 1\pmod{b}\) 一定不会成立。也就是说,\(\gcd(a, b) = 1\) 是乘法逆元存在的前提。
费马小定理求乘法逆元
由于有前提 \(\gcd(a, b) = 1\) 的前提,可以构造:\(a\times a^{p - 2} \equiv 1 \pmod{p}\)。由乘法逆元的定义,\(a^{p - 2}\) 即为 \(a\) 在模 \(p\) 意义上的一个乘法逆元,但不一定是最小的那个。
\(a \times a^{p - 2} \equiv 1 \pmod{p}\),若 \(c \equiv a^{p - 2} \pmod{p}\),则 \(a \times c \equiv 1\pmod{p}\),\(c\) 也就是 \(a\) 的一个乘法逆元。不难得出,\(c = a^{p - 2} \mod p\) 即为最小的那个,它满足上述需要的全部性质。
例:求 \(3\) 在模 \(7\) 意义上的最小乘法逆元。
由题,\(3 \times 3^5 \equiv 1 \pmod{7}\)
\(3^1 \equiv 3 \pmod{7}, 3^2 \equiv 2 \pmod{2}, 3^4 \equiv 3^2 \times 3^2 \equiv 4\pmod{7}, 3^5 \equiv 3^4 \times 3 \equiv 5 \pmod{7}\)。
用 \(5\) 代替 \(3^5\),有 \(3 \times 5 \equiv 1 \pmod{7}\),即 \(5\) 为 \(3\) 在模 \(7\) 意义下的最小乘法逆元。
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
ll a, p;
inline ll qkpow(ll a, ll b){
ll res = 1;
while(b){
if(b & 1)
res = res * a % p;
a = a * a % p;
b >>= 1;
}
return res % p;
}
int main(){
scanf("%lld%lld", &a, &p);
printf("%lld\n", qkpow(a, p - 2)); // 不用模以 p 是因为快速幂内部已经实现了这一功能
return 0;
}
扩展欧几里德法求逆元
考虑将 \(ax\equiv 1 \pmod p\) 化为不定方程 \(ax - pk = 1\),然后用 exgcd 求解即可。 \(k\) 无意义,保留 \((x \operatorname{mod} p + p) \operatorname{mod} p\) 作为最小逆元。
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
ll a, x, y, p;
void exgcd(ll a, ll b, ll& x, ll& y){
if(b == 0){
x = 1, y = 0;
return;
}
exgcd(b, a % b, x, y);
ll t = x;
x = y, y = t - a/ b * y;
return;
}
int main(){
scanf("%lld%lld", &a, &p);
exgcd(a, -p, x, y);
printf("%lld\n", (x % p + p) % p);
return 0;
}
欧拉定理求逆元
由欧拉定理 \(a^{\varphi(n)} \equiv 1 \pmod n\),可以构造出 \(a \times a^{\varphi(n) - 1} \equiv 1 \pmod p\),求值即可。
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
ll a, p;
ll phi(ll x){
ll res = x;
for(ll i = 2; i * i <= x; i++){
if(x % i == 0){
res = res * (i - 1) / i;
while(x % i == 0)
x /= i;
}
}
if(x > 1)
res = res * (x - 1) / x;
return res;
}
ll qkpow(ll a, ll b, ll p){
ll res = 1;
while(b){
if(b & 1)
res = res * a % p;
a = a * a % p;
b >>= 1;
}
return res % p;
}
int main(){
scanf("%lld%lld", &a, &p);
printf("%lld", qkpow(a, phi(p) - 1, p));
return 0;
}

浙公网安备 33010602011771号