【数论】——欧拉定理与快速幂
作者:互联网
【数论】——欧拉定理与快速幂
文章目录
欧拉定理
- 若正整数 a,b 互质,则有:(其中:$ phi(n)$ 为欧拉函数)
a ϕ ( n ) ≡ 1 ( m o d n ) a^{\phi(n)}\equiv 1\qquad (mod\ n) aϕ(n)≡1(mod n)
推论
- 费马小定理
若 p 是质数,则对于任意整数 a,有:
a p − 1 ≡ 1 ( m o d p ) a^{p-1}\equiv 1\qquad (mod\ p) ap−1≡1(mod p)
- 证明(构造函数法)——(来自 李煜东 《算法竞赛进阶指南》)
- 若正整数 a,n 互质,则对任意正整数 a 有:
a b ≡ a p m o d ϕ ( n ) ( m o d n ) a^b \equiv a^{p\ mod \ \phi(n)}\qquad(mod\ n) ab≡ap mod ϕ(n)(mod n)
- 证明(构造函数法)——(来自 李煜东 《算法竞赛进阶指南》)
快速幂
- 反复平方法
k 位二进制可以表示所有 [1, 2 k − 1 2^k-1 2k−1] 的所有数(状态压缩),由此性质,对于给定一个取模数 p,预处理:
a 2 0 ( m o d p ) , a 2 1 ( m o d p ) , . . . , a 2 k ( m o d p ) a^{2^0}\ (mod\ p),a^{2^1}(mod\ p),...,a^{2^k}(mod\ p) a20 (mod p),a21(mod p),...,a2k(mod p)
然后将根据所求数的二进制表示每一位取出相乘即可求出要求的幂。 - 代码
int qickmi(int a,int k,int p)// a^k%p
{
int res = 1;
// 要转为 LL 防止溢出
while(k){if(k&1)
res = (long long)res * a % p;
a = (long long)a * a % p;
k >>= 1;
}
return res;
}
乘法逆元
- 定义
若 b,m 互质,并且有 b ∣ n b\mid n b∣n,则存在一个整数 x,使得
a b ≡ a ∗ x ( m o d m ) \frac{a}{b} \equiv a *x\qquad (mod\ m) ba≡a∗x(mod m)
称 x 为 b mod m 的乘法逆元,记作:
b − 1 ( m o d m ) b^{-1} \qquad (mod\ m) b−1(mod m)
变形后也可以得到:
b ∗ b − 1 ≡ ( m o d m ) b*b^{-1} \equiv \qquad (mod\ m) b∗b−1≡(mod m) - 如果m是质数,则根据费马小定理:
b m − 1 ≡ 1 ( m o d m ) b^{m-1} \equiv 1 \qquad (mod\ m) bm−1≡1(mod m)
代入上式
b ∗ b m − 1 ≡ 1 ( m o d m ) b*b^{m-1} \equiv 1 \qquad (mod\ m) b∗bm−1≡1(mod m)
根据乘法逆元定义式,此时b的乘法逆元为:
b p − 2 b^{p-2} bp−2 - 调用快速幂即可求出逆元,在求组合数时会派上用场
标签:数论,qquad,定理,int,逆元,mod,欧拉,equiv 来源: https://blog.csdn.net/GXT020507/article/details/122790382