一些 update
update 2021/5/20:删除了一些话语,精炼了一些语言。
update 2021/8/11:发现扩展性质 3 的证明有问题,讲解的也不清不楚,已经更正证明。
update 2021/8/12:发现基本性质 1 有误,已经更正。
update 2021/8/24:根据最近所学到的东西,添加扩展性质 4。
update 2021/12/14:更新了一下前言部分与简单性质部分,往基本性质 2 中加了一句不影响理解但有帮助的话,添加了扩展性质 2 的第二种证明,更新了摘要部分。
1. 前言
本篇博文将会重点讲解欧拉函数,数论入门级别的函数。
在此之前,您需要知道以下几个符号:
d | n d | n 表示 d d 能整除 n n ,等价于 d d 是 n n 的因数。d ∤ n d ∤ n 表示 d d 不能整除 n n ,等价于 d d 不是 n n 的因数。
∑ n i = 1 = a i ∑ i = 1 n = a i 是求和符号,表示所有 a i a i 的和。
∏ n i = 1 a i ∏ i = 1 n a i 是求积符号,表示所有 a i a i 的积。
[ A ] [ A ] 表示当 A A 成立时 [ A ] = 1 [ A ] = 1 ,否则 [ A ] = 0 [ A ] = 0 ,比如 [ 5 = 1 ] = 0 [ 5 = 1 ] = 0 ,[ 6 = 6 ] = 1 [ 6 = 6 ] = 1 。
本文默认读者学过质数及其简单性质与应用,包括但不限于分解质因数与线性筛/欧拉筛。
若无特殊说明,本文默认所有数都是正整数。
2. 前置定理
简单定理:
gcd ( a + m b , b ) = gcd ( a , b ) gcd ( a + m b , b ) = gcd ( a , b ) 。
gcd ( a , b ) = d ⇔ gcd ( a d , b d ) = 1 gcd ( a , b ) = d ⇔ gcd ( a d , b d ) = 1
一些别的定理(比如辗转相除法之类的)
两个关键定义:
积性函数:假设一个函数满足以下条件:
f ( a × b ) = f ( a ) × f ( b ) , gcd ( a , b ) = 1 f ( a × b ) = f ( a ) × f ( b ) , gcd ( a , b ) = 1
那么称这个函数为积性函数。也就是说,积性函数的定义域内任取两个互质的数 a , b a , b ,必有 f ( a × b ) = f ( a ) × f ( b ) f ( a × b ) = f ( a ) × f ( b ) 。
比如我们熟知的一次函数 f ( x ) = x f ( x ) = x 就是积性函数。
完全剩余系:我们知道一个数模 n n 共有 n n 种结果,为 0 , 1 , 2 , . . . , n − 1 0 , 1 , 2 , . . . , n − 1 。
那么我们将其看成 n n 类,第 i i 类结果为 i i ,那么从每一类中取出一个数,这些数构成的集合就叫做模 n n 的完全剩余系。
比如说 { 51 , 22 , 63 , 104 , 200 } { 51 , 22 , 63 , 104 , 200 } 就是模 5 5 的一个完全剩余系,因为其模 5 5 的结果为 { 1 , 2 , 3 , 4 , 0 } { 1 , 2 , 3 , 4 , 0 } 。
一个简单的性质:假设 t < a t < a 且 gcd ( t , a ) = 1 gcd ( t , a ) = 1 ,那么 t , 2 t , 3 t , . . . , ( a − 1 ) t t , 2 t , 3 t , . . . , ( a − 1 ) t 构成了模 a a 的完全剩余系,且 ∀ i ∈ N ∀ i ∈ N ,i + t , i + 2 t , i + 3 t , . . . , i + ( a − 1 ) t i + t , i + 2 t , i + 3 t , . . . , i + ( a − 1 ) t 也构成了模 a a 的完全剩余系。
3. 定义
首先来讲讲欧拉函数是个啥:
定义:在数论中,记欧拉函数 φ ( n ) φ ( n ) 表示在 [ 1 , n − 1 ] [ 1 , n − 1 ] 内几个数与 n n 互质。
更加严谨的,有:φ ( n ) = n ∑ i = 1 [ gcd ( i , n ) = 1 ] φ ( n ) = ∑ i = 1 n [ gcd ( i , n ) = 1 ] 。
这就是欧拉函数。
4. 性质
强烈建议读者拿出纸笔自己写一些,可以更方便的理解。
欧拉函数的基本性质:
接下来一条一条证明。
基本性质 1:
p p 为质数的时候,显然有 [ 1 , p − 1 ] [ 1 , p − 1 ] 内所有正整数都与 p p 互质,那么由定义:φ ( p ) = p − 1 φ ( p ) = p − 1 。因为 1 和 1 互质,那么 φ ( 1 ) = 1 φ ( 1 ) = 1 。
基本性质 2:
引理:假设在 [ 1 , n ] [ 1 , n ] 范围内有一个数 x x 与 n n 互质,那么 x x 与 n n 互质的充要条件是 x x 与 p p 互质。引理正确性显然。
那么考虑正难则反,也就是:φ ( n ) = n − n ∑ i = 1 [ g c d ( i , n ) ≠ 1 ] φ ( n ) = n − ∑ i = 1 n [ g c d ( i , n ) ≠ 1 ] 。
也就是 n n 减去与其不互质的数。
而要使 i i 与 n n 不互质,考虑到 p p 是质数,那么必然有 i i 与 p p 不互质。
那么 [ 1 , n ] [ 1 , n ] 范围内有几个数与 p p 不互质呢?n p n p 个。
于是又因为 n = p k n = p k ,且 φ ( p ) = p − 1 φ ( p ) = p − 1 ,那么:
φ ( n ) = n − n k = n − p k − 1 = p k − 1 × ( p − 1 ) = p k − 1 × φ ( p ) φ ( n ) = n − n k = n − p k − 1 = p k − 1 × ( p − 1 ) = p k − 1 × φ ( p )
基本性质 3:
不妨假设 n = a × b n = a × b ,其中 gcd ( a , b ) = 1 gcd ( a , b ) = 1 。
那么要证明的就是 φ ( n ) = φ ( a ) × φ ( b ) φ ( n ) = φ ( a ) × φ ( b ) 。
接下来考虑将 a × b a × b 个数按照矩阵铺开,也就是长这样:
1 2 ⋯ a − 1 a a + 1 a + 2 ⋯ 2 a − 1 2 a ⋮ ⋮ ⋱ ⋮ ⋮ ( b − 1 ) × a + 1 ( b − 1 ) × a + 2 ⋯ b × a − 1 b × a 1 2 ⋯ a − 1 a a + 1 a + 2 ⋯ 2 a − 1 2 a ⋮ ⋮ ⋱ ⋮ ⋮ ( b − 1 ) × a + 1 ( b − 1 ) × a + 2 ⋯ b × a − 1 b × a
那么显然的,对于每一列的数而言,这一列的所有数模 a a 的结果是相同的。
那么考虑这 a a 列,模 a a 的结果就是 [ 1 , a ] [ 1 , a ] 。这里为了后续方便,就将模 a a 为 0 0 视为模 a a 为 a a 。
考虑到 gcd ( x , n ) = 1 gcd ( x , n ) = 1 的充要条件为 gcd ( x , a ) = 1 , gcd ( x , b ) = 1 gcd ( x , a ) = 1 , gcd ( x , b ) = 1 ,而使得 gcd ( x , a ) = 1 gcd ( x , a ) = 1 的数总共有 φ ( a ) φ ( a ) 列,因此先将这 φ ( a ) φ ( a ) 列取出来,再做进一步的讨论。
比如我们当前取出了第 i i 列,那么第 i i 列的数就是 0 a + i , 1 a + i , 2 a + i , . . . , ( b − 1 ) a + i 0 a + i , 1 a + i , 2 a + i , . . . , ( b − 1 ) a + i ,总共 b b 个数。
于是您会发现这些数构成了模 b b 的完全剩余系。
证明如下:不妨令 a > b a > b 。
首先显然有 gcd ( a , b ) = 1 gcd ( a , b ) = 1 (否则不符合积性函数的条件),那么假设 a mod b = t a mod b = t ,那么我们可以将数列转换成如下形式:i , i + t , i + 2 t , . . . , i + ( b − 1 ) t i , i + t , i + 2 t , . . . , i + ( b − 1 ) t ,而且必有 gcd ( t , b ) = 1 gcd ( t , b ) = 1 。于是乎,这些数构成了模 b b 的完全剩余系。
那么在这些数当中,有多少数满足 gcd ( x , b ) = 1 gcd ( x , b ) = 1 呢?因为是完全剩余系,所以有 φ ( b ) φ ( b ) 个。
上面所有过程对于所有 φ ( a ) φ ( a ) 列均成立,因此 φ ( n ) = φ ( a ) × φ ( b ) φ ( n ) = φ ( a ) × φ ( b ) ,证毕。
基本性质 4:
考虑到欧拉函数为积性函数且 ∀ i , j ∈ [ 1 , k ] , gcd ( p r i i , p r j j ) = 1 ∀ i , j ∈ [ 1 , k ] , gcd ( p i r i , p j r j ) = 1 ,那么有:φ ( n ) = ∏ k i = 1 φ ( p r i i ) φ ( n ) = ∏ i = 1 k φ ( p i r i )
记得基本性质 2 的连等式吗?通过第三个式子可以得到:φ ( n ) = ∏ k i = 1 ( p r i − 1 i × ( p i − 1 ) ) φ ( n ) = ∏ i = 1 k ( p i r i − 1 × ( p i − 1 ) )
然后提取公因数 p p ,将乘积符号裂成两项,结合欧拉函数是积性函数,于是就有:
φ ( n ) = k ∏ i = 1 ( p r i i × ( 1 − 1 p i ) ) = k ∏ i = 1 p r i i × k ∏ i = 1 ( 1 − 1 p i ) = n × k ∏ i = 1 ( 1 − 1 p i ) φ ( n ) = ∏ i = 1 k ( p i r i × ( 1 − 1 p i ) ) = ∏ i = 1 k p i r i × ∏ i = 1 k ( 1 − 1 p i ) = n × ∏ i = 1 k ( 1 − 1 p i )
证毕。
您会发现其实基本性质 4 可以用来求 φ ( n ) φ ( n ) 。
欧拉函数的扩展性质:
接下来一条一条证明。
扩展性质 1:
首先先对 a , b , d , n a , b , d , n 做个质因数分解:
a = m ∏ i = 1 p r 1 i i , b = m ∏ i = 1 p r 2 i i , d = m ∏ i = 1 p min ( r 1 i , r 2 i ) i , n = m ∏ i = 1 p r 1 i + r 2 i i a = ∏ i = 1 m p i r 1 i , b = ∏ i = 1 m p i r 2 i , d = ∏ i = 1 m p i min ( r 1 i , r 2 i ) , n = ∏ i = 1 m p i r 1 i + r 2 i
然后根据基本性质 4:
φ ( a ) = m ∏ i = 1 φ ( p r 1 i i ) , φ ( b ) = m ∏ i = 1 φ ( p r 2 i i ) φ ( a ) = ∏ i = 1 m φ ( p i r 1 i ) , φ ( b ) = ∏ i = 1 m φ ( p i r 2 i )
φ ( d ) = m ∏ i = 1 φ ( p min ( r 1 i , r 2 i ) i ) , φ ( n ) = m ∏ i = 1 φ ( p r 1 i + r 2 i i ) φ ( d ) = ∏ i = 1 m φ ( p i min ( r 1 i , r 2 i ) ) , φ ( n ) = ∏ i = 1 m φ ( p i r 1 i + r 2 i )
对要证明的式子直接暴力带入:
m ∏ i = 1 φ ( p r 1 i + r 2 i i ) = ∏ m i = 1 φ ( p r 1 i i ) × ∏ m i = 1 φ ( p r 2 i i ) × ∏ m i = 1 p min ( r 1 i , r 2 i ) i ∏ m i = 1 φ ( p min ( r 1 i , r 2 i ) i ) ∏ i = 1 m φ ( p i r 1 i + r 2 i ) = ∏ i = 1 m φ ( p i r 1 i ) × ∏ i = 1 m φ ( p i r 2 i ) × ∏ i = 1 m p i min ( r 1 i , r 2 i ) ∏ i = 1 m φ ( p i min ( r 1 i , r 2 i ) )
结合基本性质 4 再一次转化:
左边:∏ m i = 1 ( p r 1 i + r 2 i − 1 i × ( p i − 1 ) ) ∏ i = 1 m ( p i r 1 i + r 2 i − 1 × ( p i − 1 ) )
右边:
∏ m i = 1 ( p r 1 i − 1 i × ( p i − 1 ) ) × ∏ m i = 1 ( p r 2 i − 1 i × ( p i − 1 ) ) × ∏ m i = 1 p min ( r 1 i , r 2 i ) i ∏ m i = 1 ( p min ( r 1 i , r 2 i ) − 1 i × p i − 1 ) ∏ i = 1 m ( p i r 1 i − 1 × ( p i − 1 ) ) × ∏ i = 1 m ( p i r 2 i − 1 × ( p i − 1 ) ) × ∏ i = 1 m p i min ( r 1 i , r 2 i ) ∏ i = 1 m ( p i min ( r 1 i , r 2 i ) − 1 × p i − 1 )
那么拆掉乘积符号,右边分子分母先约去 ∏ m i = 1 ( p i − 1 ) ∏ i = 1 m ( p i − 1 ) ,然后左右两边同时除以 ∏ m i = 1 ( p i − 1 ) ∏ i = 1 m ( p i − 1 ) ,再做一个简单转化,那么要证明的式子就变成了:
m ∏ i = 1 p r 1 i + r 2 i − 1 i = m ∏ i = 1 p r 1 i + r 2 i − 2 i × m ∏ i = 1 p min ( r 1 i , r 2 i ) i p min ( r 1 i , r 2 i ) − 1 i = m ∏ i = 1 p r 1 i + r 2 i − 1 i ∏ i = 1 m p i r 1 i + r 2 i − 1 = ∏ i = 1 m p i r 1 i + r 2 i − 2 × ∏ i = 1 m p i min ( r 1 i , r 2 i ) p i min ( r 1 i , r 2 i ) − 1 = ∏ i = 1 m p i r 1 i + r 2 i − 1
证毕。
扩展性质 2:
法一:
首先众所周知,这个等式对于任意 n ∈ N + n ∈ N + 恒成立:n = ∑ n i = 1 1 n = ∑ i = 1 n 1 。
但是这玩意有什么用呢?
我们对这个式子做一个变形:n = ∑ n d = 1 ∑ n i = 1 [ gcd ( n , i ) = d ] n = ∑ d = 1 n ∑ i = 1 n [ gcd ( n , i ) = d ] 。
也就是说,我们枚举一个最大公约数 d d ,然后枚举 i ∈ [ 1 , n ] i ∈ [ 1 , n ] 。
因为 gcd ( n , i ) gcd ( n , i ) 的结果一定是唯一的,于是上式一定成立。
再观察。如果 gcd ( n , i ) = d gcd ( n , i ) = d ,那么一定有 d ∣ n d ∣ n 。
于是对这个式子再做一个变形:n = ∑ d ∣ n ∑ n i = 1 [ g c d ( n , i ) = d ] n = ∑ d ∣ n ∑ i = 1 n [ g c d ( n , i ) = d ] 。
根据最大公约数的这个性质:gcd ( a , b ) = d ⇔ gcd ( a d , b d ) = 1 gcd ( a , b ) = d ⇔ gcd ( a d , b d ) = 1 (注意前提:d ∣ a d ∣ a 且 d ∣ b d ∣ b ),再做一次转化:
n = ∑ d ∣ n n ∑ i = 1 ( [ gcd ( n d , i d ) = 1 ] × [ d ∣ i ] ) n = ∑ d ∣ n ∑ i = 1 n ( [ gcd ( n d , i d ) = 1 ] × [ d ∣ i ] )
然后看一下这个:∑ n i = 1 ( [ gcd ( n d , i d ) = 1 ] × [ d ∣ i ] ) ∑ i = 1 n ( [ gcd ( n d , i d ) = 1 ] × [ d ∣ i ] )
这个式子中的 i ∈ [ 1 , n d ] i ∈ [ 1 , n d ] 。
然后您会发现这实际上就是在判断 [ 1 , n d ] [ 1 , n d ] 中有几个数与 n d n d 互质。
这不就是 φ ( n d ) φ ( n d ) 吗?
于是等式变为 n = ∑ d ∣ n φ ( n d ) = ∑ d ∣ n φ ( d ) n = ∑ d ∣ n φ ( n d ) = ∑ d ∣ n φ ( d ) 。
证毕。
法二:
设函数 f ( n ) = ∑ d ∣ n φ ( d ) f ( n ) = ∑ d ∣ n φ ( d ) ,要证明的就是 f ( n ) = n f ( n ) = n 。
先证 f ( n ) f ( n ) 是个积性函数:
取 n , m n , m 且 gcd ( n , m ) = 1 gcd ( n , m ) = 1 ,有:
f ( n ) × f ( m ) = ∑ i ∣ n φ ( i ) ∑ j ∣ m φ ( j ) f ( n ) × f ( m ) = ∑ i ∣ n φ ( i ) ∑ j ∣ m φ ( j ) (定义暴力拆式子)
= ∑ i ∣ n ∑ j ∣ m φ ( i ) × φ ( j ) = ∑ i ∣ n ∑ j ∣ m φ ( i ) × φ ( j ) (交换求和号)
= ∑ i ∣ n ∑ j ∣ m φ ( i × j ) = ∑ i ∣ n ∑ j ∣ m φ ( i × j )
上面这步是因为 gcd ( n , m ) = 1 ⇒ gcd ( i , j ) = 1 gcd ( n , m ) = 1 ⇒ gcd ( i , j ) = 1 ,欧拉函数是积性函数所以可以放进去,下面这步也是一样的。
= ∑ i × j ∣ n × m φ ( i × j ) = f ( n m ) = ∑ i × j ∣ n × m φ ( i × j ) = f ( n m )
现在 f ( n ) f ( n ) 是积性函数证完了,然后将 n n 质因数分解为 ∏ m i = 1 p k i i ∏ i = 1 m p i k i ,于是我们有 f ( n ) = ∏ m i = 1 f ( p k i i ) f ( n ) = ∏ i = 1 m f ( p i k i ) ,现在要证明的就是 f ( p k i i ) = p k i i f ( p i k i ) = p i k i 。
继续拆式子:f ( p k i i ) = φ ( 1 ) + φ ( p ) + . . . + φ ( p k i i ) f ( p i k i ) = φ ( 1 ) + φ ( p ) + . . . + φ ( p i k i ) (定义拆式子)
= ( 1 − 0 ) + ( p − 1 ) + ( p 2 − p ) + . . . + ( p k i i − p k i − 1 i ) = ( 1 − 0 ) + ( p − 1 ) + ( p 2 − p ) + . . . + ( p i k i − p i k i − 1 ) (利用基本性质二 φ ( p k i i ) = p k i i − p k i − 1 i φ ( p i k i ) = p i k i − p i k i − 1 )
= p k i i = p i k i (消去同类项)
于是 f ( p k i i ) = p k i i f ( p i k i ) = p i k i ,证毕,那么也就证出了 f ( n ) = n f ( n ) = n 。
证毕。
这个性质运用时有个专门的名字叫欧拉反演。
扩展性质 3:
首先考虑 p ∤ n p ∤ n 的情况。
这个时候肯定有 gcd ( p , n ) = 1 gcd ( p , n ) = 1 ,那么因为欧拉函数是积性函数,φ ( n × p ) = φ ( n ) × φ ( p ) φ ( n × p ) = φ ( n ) × φ ( p ) 必然成立。
接下来考虑 p ∣ n p ∣ n 的情况。
设 x ∈ [ 1 , p n ] x ∈ [ 1 , p n ] ,因为 p ∣ n p ∣ n ,那么 gcd ( x , p n ) = 1 gcd ( x , p n ) = 1 的充要条件是 gcd ( x , n ) = 1 gcd ( x , n ) = 1 (显然)。
因此 φ ( n × p ) = ∑ n × p i = 1 [ gcd ( i , n ) = 1 ] φ ( n × p ) = ∑ i = 1 n × p [ gcd ( i , n ) = 1 ] 。
将 [ 1 , n p ] [ 1 , n p ] 内的数分为 p p 类,第 i i 类的数为 [ n × i + 1 , n × ( i + 1 ) ] [ n × i + 1 , n × ( i + 1 ) ] 。
因为 gcd ( a + b n , n ) = gcd ( a , n ) gcd ( a + b n , n ) = gcd ( a , n ) ,因此对于第 i i 类中的第 j j 个数 n × i + j n × i + j 而言,gcd ( n × i + j , n ) = gcd ( j , n ) gcd ( n × i + j , n ) = gcd ( j , n ) 。
这样,每一类中和 n n 互质的数的个数与第一类中和 n n 互质的数的个数相同。
而显然第一类中和 n n 互质有 φ ( n ) φ ( n ) 个,因此总共与 n n 互质的数有 φ ( n ) × p φ ( n ) × p 个。
因此 φ ( n × p ) = φ ( n ) × p φ ( n × p ) = φ ( n ) × p 。
证毕。
扩展性质 4:
先看两个引理:
引理 1:若 gcd ( i , n ) = 1 gcd ( i , n ) = 1 ,则 gcd ( n − i , n ) = 1 gcd ( n − i , n ) = 1 。
引理 2:对于 n ≥ 3 n ≥ 3 ,φ ( n ) φ ( n ) 为偶数。
引理证明如下:
引理 1:考虑反证法。
设 gcd ( n − i , n ) = k ≠ 1 gcd ( n − i , n ) = k ≠ 1 ,不妨令 n = a × k , n − i = b × k , a , b ∈ Z , a > b n = a × k , n − i = b × k , a , b ∈ Z , a > b ,那么 i = n − i = ( a − b ) × k i = n − i = ( a − b ) × k ,则有 gcd ( i , n ) = k ≠ 1 gcd ( i , n ) = k ≠ 1 ,与条件 gcd ( i , n ) = 1 gcd ( i , n ) = 1 不符,因此原假设不成立,则原命题成立。
引理 2:令 n = ∏ , m i = 1 p k i i n = ∏ i = 1 , m p i k i ,则 φ ( n ) = ∏ m i = 1 ( p i − 1 ) × p k i − 1 i φ ( n ) = ∏ i = 1 m ( p i − 1 ) × p i k i − 1 。
考虑单独提出 ( p i − 1 ) × p k i − 1 i ( p i − 1 ) × p i k i − 1 ,若 p i p i 为偶数则该式为偶数,若 p i p i 为奇数则 p i − 1 p i − 1 为偶数,则该式依然是偶数,所以该式无论怎么样都是偶数。
由于一个式子是偶数,那么这些式子乘起来也当然是偶数。
根据引理 1,在所有小于 n n 并且与 n n 互质的数中,若 i i 存在,则 n − i n − i 存在,而这两个数加起来为 n n 。
接下来分类讨论一波:
如果 n = 2 n = 2 ,手算就可以得到答案是 1,就是 φ ( 2 ) × 2 2 φ ( 2 ) × 2 2 。
如果 n > 2 n > 2 ,根据引理 2,我们可以得知这样的 ( i , n − i ) ( i , n − i ) 类的数对有 φ ( n ) 2 φ ( n ) 2 ,乘起来得到答案是 φ ( n ) × n 2 φ ( n ) × n 2 。
于是扩展性质 4 得证。证毕。
至此,所有性质就都证明完毕了,如果还有一些性质笔者没有提到,烦请在讨论区中提出,笔者将会采纳,在此表示感谢。
5. 求法
求 φ ( n ) φ ( n ) 有两种求法,依据分别是基本性质 4 和扩展性质 3。
根据 φ ( n ) = ∏ k i = 1 ( p r i − 1 i × ( p i − 1 ) ) φ ( n ) = ∏ i = 1 k ( p i r i − 1 × ( p i − 1 ) ) ,对 n n 做一个质因数分解,然后套公式就可以求了。
复杂度 O ( √ n ) O ( n ) 。
代码:
int ksm (int a, int b)
{
int ans = 1 ;
for (; b; b >>= 1 , a = a * a)
if (b & 1 ) ans = ans * a;
return ans;
}
int Get (int n)
{
int ans = 1 ;
for (int i = 2 ; i * i <= n; ++i)
{
int cnt = 0 ;
while (n % i == 0 ) {n /= i; ++cnt;}
if (cnt != 0 ) ans = ans * ksm (i, cnt - 1 ) * (i - 1 );
}
if (n != 1 ) ans = ans * (n - 1 );
return ans;
}
扩展性质 3 可以在 O ( n ) O ( n ) 的时间内求出 [ 1 , n ] [ 1 , n ] 内的所有欧拉函数值。
利用扩展性质 3 求欧拉函数需要用到线性筛。
先把上面这个式子搬过来:φ ( n × p ) = { φ ( n ) × φ ( p ) p ∤ n φ ( n ) × p p ∣ n φ ( n × p ) = { φ ( n ) × φ ( p ) p ∤ n φ ( n ) × p p ∣ n
考虑在筛质数的时候,假设当前已经筛出了 c n t c n t 个质数,那么对于当前数 i i ,在做 O ( n ) O ( n ) 的线性筛的时候,假设当前枚举到第 j j 个质数 p j p j ,那么如果 i mod p j = 0 i mod p j = 0 ,那么就有 φ ( i × p j ) = φ ( i ) × p j φ ( i × p j ) = φ ( i ) × p j ,否则就有 φ ( i × p j ) = φ ( i ) × ( p j − 1 ) φ ( i × p j ) = φ ( i ) × ( p j − 1 ) 。
因为 p j p j 是个质数,所以 φ ( p j ) = p j − 1 φ ( p j ) = p j − 1 。
根据线性筛筛质数的正确性可知,以上过程一定正确。
代码:
vector <int > v;
void Get (int n)
{
book[1 ] = 1 ; phi[1 ] = 1 ;
for (int i = 2 ; i <= n; ++i)
{
if (!book[i]) {v.push_back (i); phi[i] = i - 1 ;}
for (int j = 0 ; j < v.size (); ++j)
{
if (i * v[j] > n) break ;
book[i * v[j]] = 1 ;
if (i % v[j] == 0 ) {phi[i * v[j]] = v[j] * phi[i]; break ;}
phi[i * v[j]] = phi[i] * (v[j] - 1 );
}
}
}
6. 总结
欧拉函数的性质如下:
基本性质 1:若 p p 为质数,那么 φ ( p ) = p − 1 φ ( p ) = p − 1 。特别的,φ ( 1 ) = 1 φ ( 1 ) = 1 。
基本性质 2:设 n = p k n = p k 且 p p 为质数,那么:
φ ( n ) = n − n k = n − p k − 1 = p k − 1 × ( p − 1 ) = p k − 1 × φ ( p ) φ ( n ) = n − n k = n − p k − 1 = p k − 1 × ( p − 1 ) = p k − 1 × φ ( p )
其中 φ ( p k ) = p k − p k − 1 = p k − 1 × ( p − 1 ) φ ( p k ) = p k − p k − 1 = p k − 1 × ( p − 1 ) 用的会比较多。
基本性质 3:欧拉函数是积性函数。
基本性质 4:对于数 n n ,将其质因数分解为 ∏ k i = 1 p i r i ∏ i = 1 k p i r i ,那么:
φ ( n ) = k ∏ i = 1 φ ( p r i i ) = k ∏ i = 1 ( p r i − 1 i × ( p i − 1 ) ) = n × k ∏ i = 1 ( 1 − 1 p i ) φ ( n ) = ∏ i = 1 k φ ( p i r i ) = ∏ i = 1 k ( p i r i − 1 × ( p i − 1 ) ) = n × ∏ i = 1 k ( 1 − 1 p i )
扩展性质 1:设 n = a × b , gcd ( a , b ) = d ∈ N + n = a × b , gcd ( a , b ) = d ∈ N + ,那么 φ ( n ) = φ ( a ) × φ ( b ) × d φ ( d ) φ ( n ) = φ ( a ) × φ ( b ) × d φ ( d ) 。
扩展性质 2:∀ n ∈ N + , n = ∑ d | n φ ( d ) ∀ n ∈ N + , n = ∑ d | n φ ( d ) 。
扩展性质 3:设 n ∈ N + , p n ∈ N + , p 为质数,那么:
φ ( n × p ) = { φ ( n ) × φ ( p ) p ∤ n φ ( n ) × p p ∣ n φ ( n × p ) = { φ ( n ) × φ ( p ) p ∤ n φ ( n ) × p p ∣ n
扩展性质 4:对于一个数 n n (n ≥ 2 n ≥ 2 ),所有小于 n n 且与 n n 互质的数的和为 φ ( n ) × n 2 φ ( n ) × n 2 。
欧拉函数的求法如下:
利用基本性质 4:质因数分解后套公式即可。
利用扩展性质 3:在线性筛质数的时候多加一步算 φ ( n ) φ ( n ) 即可。
练习:
独立写出 8 个性质及其证明过程。
独立写出 2 种求欧拉函数的代码。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析