欧拉函数
非常有用的欧拉函数!嗯……好像应该放在四大定理前讲的来着QAQ
1. 欧拉函数的定义
定义φ ( N ) φ ( N ) 为1 1 ~N N 中与N N 互质的数,假设N N 可以表达为p a 1 1 × p a 2 2 . . . p a k k p 1 a 1 × p 2 a 2 . . . p k a k ,∀ i ∈ [ 1 , k ] , p i ∀ i ∈ [ 1 , k ] , p i 为质数,a i > 0 a i > 0
则φ ( N ) = N × ( 1 − 1 p 1 ) × ( 1 − 1 p 2 ) . . . ( 1 − 1 p k ) φ ( N ) = N × ( 1 − 1 p 1 ) × ( 1 − 1 p 2 ) . . . ( 1 − 1 p k )
特别的,规定φ ( 1 ) = 1 φ ( 1 ) = 1 。(唯一和1互质的数就是1本身)
证明:容斥原理
先去掉1~N中p 1 p 1 的倍数,再去掉1~N中p 2 p 2 的倍数,……直到去掉1~N中p k p k 的倍数。那么,此时答案就是
N − N p 1 − N p 2 − . . . − N p k N − N p 1 − N p 2 − . . . − N p k
这个答案,将p i × p j , ( i , j ∈ [ 1 , k ] , i ≠ j ) p i × p j , ( i , j ∈ [ 1 , k ] , i ≠ j ) 重复减去了多次,需要把它们加回来
N − N p 1 − N p 2 − . . . − N p k + N p 1 p 2 + N p 1 p 3 + . . . + N p k − 1 p k N − N p 1 − N p 2 − . . . − N p k + N p 1 p 2 + N p 1 p 3 + . . . + N p k − 1 p k
考虑这样的三元组p a p b p c p a p b p c ,它们先是被1中的式子p a , p b , p c p a , p b , p c 减去了三次,又在2中的式子p a p b , p a p c , p b p c p a p b , p a p c , p b p c 中加了三次,总体没加也没减。因此要把三元组的倍数从N N 中减去
N − N p 1 − N p 2 − . . . − N p k + N p 1 p 2 + N p 1 p 3 + . . . + N p k − 1 p k − N p 1 p 2 p 3 − . . . − N p k − 2 p k − 1 p k N − N p 1 − N p 2 − . . . − N p k + N p 1 p 2 + N p 1 p 3 + . . . + N p k − 1 p k − N p 1 p 2 p 3 − . . . − N p k − 2 p k − 1 p k
以此类推,最终化简上面的式子,可得
N × ( 1 − 1 p 1 − . . . − 1 p k + 1 p 1 p 2 + . . . + 1 p k − 1 p k − . . . ) = N × ( 1 − 1 p 1 ) × ( 1 − 1 p 2 ) . . . ( 1 − 1 p k ) N × ( 1 − 1 p 1 − . . . − 1 p k + 1 p 1 p 2 + . . . + 1 p k − 1 p k − . . . ) = N × ( 1 − 1 p 1 ) × ( 1 − 1 p 2 ) . . . ( 1 − 1 p k )
时间复杂度:欧拉函数时间复杂度最大的地方在于分解质因数,因此时间复杂度为O ( √ N ) O ( N ) 。
欧拉函数模板
int phi (int x) {
int res = x;
for (int i=2 ;(ll)i*i<=x;++i){
if (x % i == 0 ){
res = res / i * (i - 1 );
while (x % i == 0 ) x /= i;
}
}
if (x > 1 ) res = res / x * (x - 1 );
return res;
}
2. 欧拉函数的性质
性质1
∑ a = n × φ ( n ) 2 , n > 1 , a ∈ [ 1 , n ) , ( a , n ) = 1 ∑ a = n × φ ( n ) 2 , n > 1 , a ∈ [ 1 , n ) , ( a , n ) = 1 。
性质2
证明:∵ ( n , x ) = ( n , n − x ) , n > x ∵ ( n , x ) = ( n , n − x ) , n > x
假设∃ x ∈ [ 1 , n ) ∃ x ∈ [ 1 , n ) ,( n , x ) = ( n , n − x ) = 1 , x = n − x , n > 2 ( n , x ) = ( n , n − x ) = 1 , x = n − x , n > 2 ,则n = 2 x n = 2 x ,矛盾。
∴ [ 1 , n ) ∴ [ 1 , n ) 中与n n 互质的数均是成对出现的,因此[ 1 , n ) [ 1 , n ) 与n n 互质的数是偶数,即φ ( n ) φ ( n ) 为偶数。
观察( n , x ) = ( n , n − x ) = 1 ( n , x ) = ( n , n − x ) = 1 ,也说明了任意一对与n n 互质的数,相加均为n n ,所以有∑ a = n × φ ( n ) 2 ∑ a = n × φ ( n ) 2
性质3
设f ( n ) = φ ∗ I = ∑ d | n φ ( d ) f ( n ) = φ ∗ I = ∑ d | n φ ( d ) ,则f ( n ) f ( n ) 为一个积性函数。
将n n 唯一分解为n = ∏ k i = 1 p a i i = p a 1 1 p a 2 2 . . p a k k n = ∏ i = 1 k p i a i = p 1 a 1 p 2 a 2 . . p k a k ,则
f ( p a i i ) = φ ( 1 ) + φ ( p i ) + . . + φ ( p a k i ) = 1 + ( p − 1 ) + . . + ( p k − p k − 1 ) = p k f ( p i a i ) = φ ( 1 ) + φ ( p i ) + . . + φ ( p i a k ) = 1 + ( p − 1 ) + . . + ( p k − p k − 1 ) = p k
f ( n ) = f ( p a 1 1 ) × f ( p a 2 2 ) × . . × f ( p a k k ) = ∏ k i = 1 p a i i = n f ( n ) = f ( p 1 a 1 ) × f ( p 2 a 2 ) × . . × f ( p k a k ) = ∏ i = 1 k p i a i = n ,证毕。
性质4
欧拉函数为积性函数,但不是完全积性函数,当( n , m ) = 1 ( n , m ) = 1 时,满足φ ( m × n ) = φ ( m ) × φ ( n ) φ ( m × n ) = φ ( m ) × φ ( n ) 。那么显然,当n n 唯一分解后,φ ( n ) = ∏ k i = 1 φ ( p a i i ) φ ( n ) = ∏ i = 1 k φ ( p i a i ) 。
证明:若( n , m ) = 1 ( n , m ) = 1 ,则n , m n , m 没有相同的质因子,记n n 的质因子个数为c 1 c 1 ,m m 的质因子个数为c 2 c 2 ,则
φ ( n ) × φ ( m ) = n × m × ∏ c 1 i = 1 ( 1 − 1 p i ) × ∏ c 2 i = 1 ( 1 − 1 p i ) = ∏ c 1 + c 2 i = 1 ( 1 − 1 p i ) = φ ( n × m ) φ ( n ) × φ ( m ) = n × m × ∏ i = 1 c 1 ( 1 − 1 p i ) × ∏ i = 1 c 2 ( 1 − 1 p i ) = ∏ i = 1 c 1 + c 2 ( 1 − 1 p i ) = φ ( n × m )
例题:cf776E The Holmes Children
性质5
φ ( n ) n = ∑ d ∣ n μ ( d ) d φ ( n ) n = ∑ d ∣ n μ ( d ) d 。
写成狄利克雷卷积的形式
φ ∗ I = i d φ ∗ I = i d ,φ ∗ I ∗ μ = i d ∗ μ φ ∗ I ∗ μ = i d ∗ μ
φ ∗ ( I ∗ μ ) = i d ∗ μ φ ∗ ( I ∗ μ ) = i d ∗ μ
φ ∗ e = i d ∗ μ φ ∗ e = i d ∗ μ
即φ ( n ) = ∑ d | n n d × μ ( d ) φ ( n ) = ∑ d | n n d × μ ( d ) ,也就是φ ( n ) n = ∑ d ∣ n μ ( d ) d φ ( n ) n = ∑ d ∣ n μ ( d ) d
性质6
当n = p k n = p k 时,φ ( n ) = p k − p k − 1 φ ( n ) = p k − p k − 1
证明:当n n 只有一个质因数时,φ ( n ) = p k × ( 1 − 1 p ) = p k − p k − 1 φ ( n ) = p k × ( 1 − 1 p ) = p k − p k − 1
3. 筛法求欧拉函数
假设目前已知φ ( i ) φ ( i ) 的值,p j p j 为某一质数,求φ ( i × p j ) φ ( i × p j ) 的值。
将i i 表示为p a 1 1 × p a 2 2 . . . p a k k p 1 a 1 × p 2 a 2 . . . p k a k ,φ ( i ) = i × ( 1 − 1 p 1 ) × ( 1 − 1 p 2 ) . . . ( 1 − 1 p k ) φ ( i ) = i × ( 1 − 1 p 1 ) × ( 1 − 1 p 2 ) . . . ( 1 − 1 p k ) ,
i % p j == 0 i % p j == 0 时,i × p j i × p j 中不存在新的质因子
∴ φ ( i × p j ) = i × p j × ( 1 − 1 p 1 ) × ( 1 − 1 p 2 ) . . . ( 1 − 1 p k ) = φ ( i ) × p j ∴ φ ( i × p j ) = i × p j × ( 1 − 1 p 1 ) × ( 1 − 1 p 2 ) . . . ( 1 − 1 p k ) = φ ( i ) × p j
i % p j ≠ 0 i % p j ≠ 0 时,p j p j 为新的质因子
∴ φ ( i × p j ) = i × p j × ( 1 − 1 p 1 ) × ( 1 − 1 p 2 ) . . . ( 1 − 1 p k ) × ( 1 − 1 p j ) = φ ( i ) × p j × ( 1 − 1 p j ) = φ ( i ) × ( p j − 1 ) (1) (2) (3) (1) ∴ φ ( i × p j ) = i × p j × ( 1 − 1 p 1 ) × ( 1 − 1 p 2 ) . . . ( 1 − 1 p k ) × ( 1 − 1 p j ) (2) = φ ( i ) × p j × ( 1 − 1 p j ) (3) = φ ( i ) × ( p j − 1 )
int n, cnt;
const int N = 1e6 + 10 ;
int E[N], p[N];
bool st[N];
void Eulers () {
E[1 ] = 1 ;
for (int i=2 ;i<=n;++i){
if (!st[i]){
p[++cnt] = i;
E[i] = i - 1 ;
}
for (int j=1 ;p[j]<=n/i;++j){
int t = p[j] * i;
st[t] = true ;
if (i % p[j] == 0 ){
E[t] = E[i] * p[j];
break ;
}
E[t] = E[i] * (p[j] - 1 );
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】