前置知识:
欧拉函数:质数相关,约数相关
欧拉定理:同余,简化剩余系
详情可见 OI wiki
定义 1∼N 中和 N 互质的数个数称欧拉函数,记作 φ(N)
单个欧拉函数求解:
φ(N)=N×∏p∣n(pp−1) 其中p是质数
证明
容斥原理,设 p,q 分别是 N 的质因子
则要筛掉 N/p 和 N/q 个数,并且 p∗q 及倍数算了两次,还要加上 N/(p∗q) 个
所以 N−pN−qN+pqN=N×pp−1×qq−1
欧拉函数性质定理
- ∀n>1,1∼n 和 n 互质的数的和为 n×φ(n)/2
证明1
gcd(a,b)=gcd(a,a−b) 所以和 n 互质的数成对出现,平均值为 n/2
互质的数个数为 φ(n)
-
φ(n) 是积性函数,也就是对于 a,b 互质,有 φ(ab)=φ(a)×φ(b),该定理由分解质因数得到
-
∑p∣nφ(p)=n
-
若 p 为质数,p∣n 且 p2∣n , 有 φ(n)=φ(n/p)×p
-
若 p 为质数,p∣n 且 p2∤n , 有 φ(n)=φ(n/p)×(p−1)
证明3,4
p∣n 且 p2∣n,则 p,n/p 质因子种类相同,计算 φ(n)÷φ(n/p)=p
p∣n 且 p2∤n,则 p,n/p 互质,根据 定理2,φ(n)=φ(n/p)×φ(p)=φ(n/p)×(p−1)
运用性质3,4,可以在 O(n) 时间计算 φ(2∼n)
在线性素数筛中直接计算即可
code
cpp1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| void cal_pri(int x) { for(int i=2;i<=x;i++) { if(!v[i]) { v[i]=i; pri[++top]=i; phi[i]=i-1; } for(int j=1;j<=top&&i*pri[j]<=x;j++) { if(pri[j]>v[i]) break; v[i*pri[j]]=pri[j]; phi[i*pri[j]]=phi[i]*(i%pri[j]?pri[j]-1:pri[j]); } } }
|
欧拉定理
若 n,p 互质,则 nφ(p)≡1 (mod p)
证明
设 n 的简化剩余系为 {a1,a2,...,aφ(n)}
对于 ∀ai,aj , 有 n∗ai≡n∗aj(mod p) , 移项得 n∗(ai−aj)≡0(mod p)
因为 n,p 互质,所以 ai−aj≡0 , 进而 ai≡aj
因为简化剩余系模p乘法封闭,n,p 互质,所以 ∀ai,n∗ai也属于 n 的简化剩余系
所以:
nφ(p)a1a2...aφ(n)≡(aa1)(aa2)...(aaφ(n))≡a1a2...aφ(n)(mod p)
由此得到费马小定理:(同时乘a)
p是质数,则对于任意整数 a , ap≡a(mod p)
欧拉定理的扩展
-
若 a,p 互质, 则对于任意整数 b ,有 ab≡ab mod φ(p) (mod p)
-
若 a,p 不互质,对于整数b≥φ(p),有 ab≡a(b mod φ(p) )+φ(p) (mod p)
定理1证明
b可表示为 k×φ(p)+r,r∈[0,φ(p) ) , 得 r=b mod φ(p)
于是 ab≡ak×φ(p)+r≡(aφ(p))k×ar≡1k×ar≡ab mod φ(p) (mod p)
例题:
UVA11327 Enumerating Rational Numbers
hint
每一个大于1的数贡献为 φ(a) , 掐指一算
前20000位欧拉函数的和正好为12158598919,可以在很快时间内枚举出来
[POJ3696] The Luckiest number
hint
x 个 8 可以写成 8(10x−1)/9
L∣98(10x−1) 等同于 9L∣8(10x−1)
设 d=gcd(9L,8)
可以得到 gcd(d9L,d8)=1
所以 d9L,d8(10x−1) 的共同因数存在于 d9L 和 10x−1中
所以得出 10x≡1 (mod d9L)
若 gcd(10,d9L)=1 , 则模运算一定不等于1,则无解
设 x0 为 使得式子成立的最小解,那么 10x0≡1 (mod d9L) , 于是 10kx0≡1 (mod d9L)
根据欧拉定理,10φ(p)≡1 (mod p) , 所以 x0 是 φ(p) 的约数
参考资料
- OI wiki (欧拉函数,欧拉定理 & 费马小定理) , 详情
- 算法竞赛进阶指南(0x33同余)