快速幂
快速幂算法可以在
反复平方法:
- 预处理以下值:
,其中 - 而根据
的二进制表示,例如 ,是 1 的位就加上即可 - 这里还有模的积性:若
,那么 (代入证明一下即可)
核心代码:
cpp
int qmi(int a, int k, int p) {
int res = 1;
while (k) {
if (k & 1) {
res = (LL)res * a % p;
}
k >>= 1;
a = (LL)a * a % p;
}
}
if (k & 1)
当末位数字是 1 时,乘以这个时候的(模了 之后的值) - 每次
k
都要右移一位 - 每次
a
更新,其实就是自身 反复平方
其实:
- 前面的是:
res = (LL)res * (a % p);
- 后面的是:
a = (LL)(a * a) % p;
快速幂求逆元
逆元定义:若整数
同时称
证明:对上面式子两边同时乘以
由于乘法逆元与
该条件对于不互质的
所谓的求逆元问题就是找到满足
费马小定理
对于正整数
我们先证明一个引理:若
这下直接矛盾。因此引理得证。而
由于
这正是费马小定理的一个推论,前提是
回到原题,对于