欧拉函数
- 1. 定义
- 2.欧拉函数值
- 3.欧拉函数的常用性质与证明 (共7条)
- (1) 积性性质
- (2) 当n为奇数时
- (3) φ ( n ) = φ ( n P 1 ) × P 1 \varphi(n) = \varphi(\frac{n}{P_1}) \times P_1 φ(n)=φ(P1n)×P1 (p 能整除 n p \frac{n}{p} pn)
- (4) φ ( n ) = φ ( n p ) × ( p − 1 ) \varphi(n) = \varphi(\frac{n}{p}) \times (p - 1) φ(n)=φ(pn)×(p−1) ( p p p与 n p \frac{n}{p} pn互质 且 p p p是质数)
- (5) n = ∑ d ∣ n φ ( d ) n = \sum_{d|n} \varphi(d) n=∑d∣nφ(d)
- (6) 小于 n n n且与 n n n互质的数的和等于 n × φ ( n ) 2 \frac{n \times \varphi(n)}{2} 2n×φ(n)
- 4.欧拉函数的代码实现
1. 定义
φ \varphi φ(n) 表示小于等于 n n n的正整数中与 n n n互质的数的数目,例如 φ ( 8 ) = 4 \varphi(8) = 4 φ(8)=4因为 1 , 3 , 5 , 7 1,3,5,7 1,3,5,7与 8 8 8互质
特殊的令 φ ( 1 ) = 1 \varphi(1) = 1 φ(1)=1
2.欧拉函数值
(1)n 为 质数
此时只有 n n n 与 n n n 不互质其余正整数均与其互质(注意 g c d ( 1 , n ) = 1 gcd(1,n) = 1 gcd(1,n)=1也与其互质)
所以 φ ( n ) = n − 1 ( n 为质数 ) \varphi(n) = n - 1 (n 为质数) φ(n)=n−1(n为质数)
(2)n 为 合数
若 n n n 时质数 p p p的 k k k此幂,
φ ( n ) = φ ( p k ) = p k − p k − 1 = ( p − 1 ) × p k − 1 \varphi(n) = \varphi(p^k) = p^k-p^{k-1} = (p - 1) \times p ^{k - 1} φ(n)=φ(pk)=pk−pk−1=(p−1)×pk−1
这个公式其实也很好理解,只要不是 p p p的倍数的数都和 n n n互质,所以所有数 p k p^k pk减去所有 p p p的倍数( 1 × p , 2 × p , … , p k − 1 × p 1 \times p,2 \times p,\ldots,p^{k-1} \times p 1×p,2×p,…,pk−1×p,总共 p k − 1 p^{k-1} pk−1)得到一共有 p k − p k − 1 = ( p − 1 ) × p k − 1 p^k-p^{k-1} = (p - 1) \times p ^{k - 1} pk−pk−1=(p−1)×pk−1个数,也就是 φ ( n ) = ( p − 1 ) × p k − 1 \varphi(n) = (p - 1) \times p ^{k - 1} φ(n)=(p−1)×pk−1
然后推广一下
令 n = p 1 k 1 × p 2 k 2 × ⋯ × p r k r 则 φ ( n ) = φ ( p 1 k 1 ) × φ ( p 2 k 2 ) × ⋯ × φ ( p r k r ) 令n = p_1^{k_1} \times p_2^{k_2} \times \cdots \times p_r^{k_r} \\则 \varphi(n) = \varphi(p_1^{k_1}) \times \varphi(p_2^{k_2}) \times \cdots \times \varphi(p_r^{k_r}) 令n=p1k1×p2k2×⋯×prkr则φ(n)=φ(p1k1)×φ(p2k2)×⋯×φ(prkr)
欧拉函数的积性大家可以自己证明一下,方法同 n = p k n = p^k n=pk一样,容斥原理用总体减局部在加上减重的,然后对算式化简
(提示:可以先思考一下 φ ( p 1 k 1 × p 2 k 2 ) = φ ( p 1 k 1 ) × φ ( p 2 k 2 ) \varphi(p_1^{k_1} \times p_2^{k_2}) = \varphi(p_1^{k_1}) \times \varphi(p_2^{k_2}) φ(p1k1×p2k2)=φ(p1k1)×φ(p2k2)如何用上述方法证明)
继续化简公式 将
φ
(
n
)
=
φ
(
p
k
)
=
p
k
−
p
k
−
1
=
(
p
−
1
)
×
p
k
−
1
\varphi(n) = \varphi(p^k) = p^k-p^{k-1} = (p - 1) \times p ^{k - 1}
φ(n)=φ(pk)=pk−pk−1=(p−1)×pk−1
所以
φ
(
n
)
=
∏
i
=
1
r
p
i
k
i
−
1
×
(
p
i
−
1
)
=
n
×
∏
i
=
1
r
p
i
−
1
p
i
\varphi(n) = \prod_{i=1}^{r}p_i^{k_i - 1} \times (p_i - 1) = n \times \prod_{i=1}^{r}\frac{p_i-1}{p_i}
φ(n)=i=1∏rpiki−1×(pi−1)=n×i=1∏rpipi−1
这个直接转换一下就好了(
n
=
p
1
k
1
×
p
2
k
2
×
⋯
×
p
r
k
r
n = p_1^{k_1} \times p_2^{k_2} \times \cdots \times p_r^{k_r}
n=p1k1×p2k2×⋯×prkr带入)
所以我们就有了一个较为简便的求解欧拉函数的公式
3.欧拉函数的常用性质与证明 (共7条)
以下部分是后面的基础,很简单,但是一定先要搞明白
(1) 积性性质
当 m , n 互质时 φ ( n × m ) = φ ( n ) × φ ( m ) 当m,n互质时 \varphi(n \times m) = \varphi(n) \times \varphi(m) 当m,n互质时φ(n×m)=φ(n)×φ(m)
(2) 当n为奇数时
φ
(
2
∗
n
)
=
φ
(
n
)
\varphi(2 * n) = \varphi(n)
φ(2∗n)=φ(n)
证明很简单:
n 为奇数
gcd
(
2
,
n
)
=
1
\gcd(2,n) = 1
gcd(2,n)=1 所以由(1)可知
φ
(
2
×
n
)
=
φ
(
2
)
×
φ
(
n
)
=
1
×
φ
(
n
)
=
φ
(
n
)
\varphi(2 \times n) = \varphi(2) \times \varphi(n) = 1 \times \varphi(n) = \varphi(n)
φ(2×n)=φ(2)×φ(n)=1×φ(n)=φ(n)
前两个都很好理解,接下来是重点
(3) φ ( n ) = φ ( n P 1 ) × P 1 \varphi(n) = \varphi(\frac{n}{P_1}) \times P_1 φ(n)=φ(P1n)×P1 (p 能整除 n p \frac{n}{p} pn)
证明:
因为
P
1
P_1
P1能整除
n
P
1
\frac{n}{P_1}
P1n,所以
n
n
n是
P
1
2
P_1^2
P12的倍数
带入
φ
(
n
)
=
∏
i
=
1
r
p
i
k
i
−
1
×
(
p
i
−
1
)
=
n
×
∏
i
=
1
r
p
i
−
1
p
i
\varphi(n) = \prod_{i=1}^{r}p_i^{k_i - 1} \times (p_i - 1) = n \times \prod_{i=1}^{r}\frac{p_i-1}{p_i}
φ(n)=∏i=1rpiki−1×(pi−1)=n×∏i=1rpipi−1
令
m
=
n
P
1
m = \frac{n}{P_1}
m=P1n
所以
φ
(
m
)
\varphi(m)
φ(m) 到
φ
(
n
)
\varphi(n)
φ(n) 相当于给他乘上一些p因子且p因子是他本身就有的因子(可能为多个,因为
P
1
P_1
P1可以是合数)
所以
φ
(
m
)
=
∏
i
=
1
r
p
i
k
i
−
1
×
(
p
i
−
1
)
=
m
×
∏
i
=
1
r
p
i
−
1
p
i
φ
(
n
)
=
∏
i
=
1
r
p
i
k
i
(
+
1
)
−
1
×
(
p
i
−
1
)
=
m
×
∏
i
=
1
r
p
i
−
1
p
i
(
其中
k
i
(
+
1
)
−
1
的地方
p
i
同时是
P
1
的因子
)
\varphi(m) = \prod_{i=1}^{r}p_i^{k_i - 1} \times (p_i - 1) = m \times \prod_{i=1}^{r}\frac{p_i-1}{p_i} \\ \varphi(n) = \prod_{i=1}^{r}p_i^{k_i (+1) - 1} \times (p_i - 1) = m \times \prod_{i=1}^{r}\frac{p_i-1}{p_i} (其中k_i(+1)-1的地方p_i同时是P_1的因子)
φ(m)=i=1∏rpiki−1×(pi−1)=m×i=1∏rpipi−1φ(n)=i=1∏rpiki(+1)−1×(pi−1)=m×i=1∏rpipi−1(其中ki(+1)−1的地方pi同时是P1的因子)
中某些
k
i
−
1
k_i - 1
ki−1变成了
k
i
k_i
ki所以再把它提出来
φ
(
n
)
=
P
1
×
∏
i
=
1
r
p
i
k
i
−
1
×
(
p
i
−
1
)
=
P
1
×
m
×
∏
i
=
1
r
p
i
−
1
p
i
=
P
1
×
φ
(
m
)
\varphi(n) = P_1 \times \prod_{i=1}^{r}p_i^{k_i - 1} \times (p_i - 1) = P_1 \times m \times \prod_{i=1}^{r}\frac{p_i-1}{p_i} = P_1 \times \varphi(m)
φ(n)=P1×i=1∏rpiki−1×(pi−1)=P1×m×i=1∏rpipi−1=P1×φ(m)
注意上述
P
1
P_1
P1和
p
p
p是两个不同的含义
P
1
P_1
P1是一个数而
p
p
p表示m的质因子集合(当然也是n的)
(4) φ ( n ) = φ ( n p ) × ( p − 1 ) \varphi(n) = \varphi(\frac{n}{p}) \times (p - 1) φ(n)=φ(pn)×(p−1) ( p p p与 n p \frac{n}{p} pn互质 且 p p p是质数)
证明:
利用(1)积性性质 可得
φ
(
n
)
=
φ
(
n
p
×
p
)
=
φ
(
n
p
)
×
φ
(
p
)
\varphi(n) = \varphi(\frac{n}{p} \times p) = \varphi(\frac{n}{p}) \times \varphi(p)
φ(n)=φ(pn×p)=φ(pn)×φ(p)
又因为
p
p
p是质数,所以
φ
(
p
)
=
p
−
1
\varphi(p) = p - 1
φ(p)=p−1
所以
φ
(
n
)
=
φ
(
n
p
)
×
φ
(
p
)
=
(
p
−
1
)
×
φ
(
n
p
)
\varphi(n) = \varphi(\frac{n}{p}) \times \varphi(p) = (p - 1) \times \varphi(\frac{n}{p})
φ(n)=φ(pn)×φ(p)=(p−1)×φ(pn)
以上部分是线性筛求欧拉函数的基础 重点
以下部分是一些美妙的性质
(5) n = ∑ d ∣ n φ ( d ) n = \sum_{d|n} \varphi(d) n=∑d∣nφ(d)
证明:
令
f
(
n
)
=
∑
d
∣
n
φ
(
d
)
f(n) = \sum_{d|n}{\varphi(d)}
f(n)=∑d∣nφ(d)
若
n
,
m
n,m
n,m互质
f
(
n
m
)
=
∑
d
∣
n
m
φ
(
d
)
f(nm) = \sum_{d|nm}{\varphi(d)}
f(nm)=d∣nm∑φ(d)
注意到
n
,
m
n,m
n,m互质,所以
n
,
m
n,m
n,m的质因子没有相同的
所以我们相当于在
n
,
m
n,m
n,m的质因子中各取一些组合在一起成了
d
d
d
又因为(1)积性性质
φ
(
n
×
m
)
=
φ
(
n
)
×
φ
(
m
)
(
n
,
m
互质
)
\varphi(n \times m) = \varphi(n) \times \varphi(m) (n,m互质)
φ(n×m)=φ(n)×φ(m)(n,m互质)
所以
f
(
n
m
)
=
∑
d
∣
n
φ
(
d
1
×
d
2
)
(
其中
d
1
是
n
的因数,
d
2
是
m
的因数且
d
1
×
d
2
=
d
)
所以
f
(
n
m
)
=
(
∑
d
1
∣
n
φ
(
d
1
)
)
×
(
∑
d
2
∣
m
φ
(
d
2
)
)
=
f
(
n
)
×
f
(
m
)
f(nm) = \sum_{d|n}\varphi(d_1 \times d2) (其中d_1是n的因数,d_2是m的因数 且 d_1 \times d_2 = d)\\ 所以 f(nm)= (\sum_{d_1|n}{\varphi(d_1)}) \times (\sum_{d_2|m}{\varphi(d_2)}) = f(n) \times f(m)
f(nm)=d∣n∑φ(d1×d2)(其中d1是n的因数,d2是m的因数且d1×d2=d)所以f(nm)=(d1∣n∑φ(d1))×(d2∣m∑φ(d2))=f(n)×f(m)
所以
f
(
n
)
f(n)
f(n)也是积性函数
和前面2.欧拉函数的值的部分一样,继续利用质因数分解证明
先解决其中的一个小问题 当
p
p
p 是质数时
f
(
p
k
)
f(p^k)
f(pk),得
f
(
p
k
)
=
∑
d
∣
p
k
φ
(
d
)
=
φ
(
1
)
+
φ
(
p
)
+
φ
(
p
2
)
+
…
+
φ
(
p
k
)
f(p^k) = \sum_{d|p^k}{\varphi(d)} = \varphi(1) + \varphi(p) + \varphi(p^2) + \ldots + \varphi(p^k)
f(pk)=d∣pk∑φ(d)=φ(1)+φ(p)+φ(p2)+…+φ(pk)
再利用前面2.欧拉函数的值中已经证明的
φ
(
n
)
=
(
p
−
1
)
×
p
k
−
1
\varphi(n) = (p - 1) \times p ^{k - 1}
φ(n)=(p−1)×pk−1
所以
f
(
p
k
)
=
1
+
(
p
−
1
)
×
(
p
0
+
p
1
+
p
2
+
…
+
p
k
−
1
)
f(p^k) = 1+(p - 1) \times (p^0 + p^1 + p^2 + \ldots + p^{k - 1})
f(pk)=1+(p−1)×(p0+p1+p2+…+pk−1)
明显的等比数列
所以
f
(
p
k
)
=
1
+
(
p
−
1
)
×
(
1
−
p
k
)
(
1
−
p
)
=
1
+
(
p
k
−
1
)
=
p
k
f(p^k) = 1 + (p - 1) \times \frac{(1 - p^k)}{(1 - p)} = 1 + (p^k - 1) = p^k
f(pk)=1+(p−1)×(1−p)(1−pk)=1+(pk−1)=pk
所以
令
n
=
p
1
k
1
×
p
2
k
2
×
⋯
×
p
r
k
r
n = p_1^{k_1} \times p_2^{k_2} \times \cdots \times p_r^{k_r}
n=p1k1×p2k2×⋯×prkr,的
f
(
n
)
=
f
(
p
1
k
1
×
p
2
k
2
×
⋯
×
p
r
k
r
)
=
f
(
p
1
k
1
)
×
f
(
p
2
k
2
)
×
…
×
f
(
p
r
k
r
)
=
p
1
k
1
×
p
2
k
2
×
⋯
×
p
r
k
r
=
n
f(n) = f(p_1^{k_1} \times p_2^{k_2} \times \cdots \times p_r^{k_r}) = f(p_1^{k_1}) \times f(p_2^{k_2}) \times \ldots \times f(p_r^{k_r}) = p_1^{k_1} \times p_2^{k_2} \times \cdots \times p_r^{k_r} = n
f(n)=f(p1k1×p2k2×⋯×prkr)=f(p1k1)×f(p2k2)×…×f(prkr)=p1k1×p2k2×⋯×prkr=n
得证
(6) 小于 n n n且与 n n n互质的数的和等于 n × φ ( n ) 2 \frac{n \times \varphi(n)}{2} 2n×φ(n)
假设
a
1
,
a
2
,
…
,
a
m
a_1,a_2,\ldots,a_m
a1,a2,…,am与
n
n
n互质,
m
=
φ
(
n
)
m = \varphi(n)
m=φ(n),可以得到
n
−
a
1
,
n
−
a
2
,
…
,
n
−
a
m
n - a_1,n - a_2,\ldots,n - a_m
n−a1,n−a2,…,n−am也与
n
n
n互质,且恰好就是
a
1
,
a
2
,
…
,
a
m
a_1,a_2,\ldots,a_m
a1,a2,…,am
这里其实可以反证
若
n
−
x
与
n
不互质
则可以设
n
−
x
=
k
1
g
,
n
=
k
2
g
(
其中
g
=
g
c
d
(
n
−
x
,
n
)
,
k
1
与
k
2
互质
)
把
n
=
k
2
g
带入
n
−
x
=
k
1
g
,得
k
2
g
−
x
=
k
1
g
x
=
(
k
2
−
k
1
)
g
所以
g
c
d
(
x
,
n
)
=
g
c
d
(
(
k
2
−
k
1
)
g
,
k
2
g
)
=
g
不成立
若n - x与n不互质\\ 则可以设 n - x = k_1g,n = k_2g (其中g = gcd(n - x,n),k_1与k_2互质) \\ 把n = k_2g带入n - x = k_1g,得\\ k_2g - x = k_1g \\ x = (k_2 - k_1)g \\ 所以 gcd(x,n) = gcd((k_2 - k_1)g,k_2g) = g不成立
若n−x与n不互质则可以设n−x=k1g,n=k2g(其中g=gcd(n−x,n),k1与k2互质)把n=k2g带入n−x=k1g,得k2g−x=k1gx=(k2−k1)g所以gcd(x,n)=gcd((k2−k1)g,k2g)=g不成立
因为
{
a
1
,
a
2
,
…
,
a
m
}
,
{
n
−
a
1
,
n
−
a
2
,
…
,
n
−
a
m
}
\{a_1,a_2,\ldots,a_m\},\{n - a_1,n - a_2,\ldots,n - a_m\}
{a1,a2,…,am},{n−a1,n−a2,…,n−am}中所有数都与n互质且与n互质的数只有
m
m
m个所以这两个集合必然相同,把这两个集合加起来
令
s
=
a
1
+
a
2
+
…
+
a
m
,则
2
s
=
∑
i
=
1
m
a
i
+
∑
i
=
1
m
n
−
a
i
=
∑
i
=
1
m
a
i
+
(
n
−
a
i
)
=
∑
i
=
1
m
n
=
n
×
m
s
=
n
×
m
2
令 s = a_1 + a_2 + \ldots + a_m,则\\ 2s = \sum_{i=1}^{m}{a_i} + \sum_{i=1}^{m}{n - a_i}= \sum_{i = 1}^{m}{a_i + (n - a_i)} = \sum_{i = 1}^{m}{n} = n \times m\\ s = \frac{n \times m}{2}
令s=a1+a2+…+am,则2s=i=1∑mai+i=1∑mn−ai=i=1∑mai+(n−ai)=i=1∑mn=n×ms=2n×m
得证
4.欧拉函数的代码实现
1.不常见的 O ( n l o g 2 n ) O(n log^2n) O(nlog2n)版
利用
欧拉函数的性质5:
n
=
∑
d
∣
n
φ
(
d
)
n = \sum_{d|n} \varphi(d)
n=∑d∣nφ(d)
移向:
φ
(
n
)
=
n
−
∑
d
∣
n
,
d
≠
n
φ
(
d
)
\varphi(n) = n - \sum_{d|n,d \neq n} \varphi(d)
φ(n)=n−∑d∣n,d=nφ(d)
const int MAXN = 1e5;
int phi[MAXN + 5];
void GetPhi(int N) {
for(int i = 1;i <= N;i++) {
phi[i] = i;
/*
相当于标记数组
如果 phi[i] == i 则其为质数
*/
}
for(int i = 1;i <= N;i ++) {
for(int j = 2 * i;j <= N;j += i) { // j = k * i
phi[j] -= phi[i];
}
}
}
2.朴素版本(类似埃筛) O ( n l o g 2 n ) O(n log^2n) O(nlog2n)
利用
φ
(
n
)
=
∏
i
=
1
r
p
i
k
i
−
1
×
(
p
i
−
1
)
=
n
×
∏
i
=
1
r
p
i
−
1
p
i
\varphi(n) = \prod_{i=1}^{r}p_i^{k_i - 1} \times (p_i - 1) = n \times \prod_{i=1}^{r}\frac{p_i-1}{p_i}
φ(n)=∏i=1rpiki−1×(pi−1)=n×∏i=1rpipi−1先初始话phi[i] = i
相当于
×
n
\times n
×n然后主动枚举
p
i
p_i
pi乘上
p
i
−
1
p
i
\frac{p_i - 1}{p_i}
pipi−1
//筛出 1 ~ N的欧拉函数
const int MAXN = 1e5;
int phi[MAXN + 5];
void GetPhi(int N) {
phi[1] = 1;
for(int i = 2;i <= N;i++) {
phi[i] = i;
/*
相当于标记数组
如果 phi[i] == i 则其为质数
*/
}
for(int i = 2;i <= N;i ++) {
if (phi[i] == i) {
// 这里从i开始会把 phi[i] 设为 i - 1
for(int j = i;j <= N;j += i) { // j = k * i
phi[j] = phi[j] / i * (i - 1);
// 先除是防止乘法时溢出
}
}
}
}
3.线性筛 O ( n ) O(n) O(n)
利用
欧拉函数的性质3:
φ
(
n
)
=
φ
(
n
P
1
)
×
P
1
\varphi(n) = \varphi(\frac{n}{P_1}) \times P_1
φ(n)=φ(P1n)×P1 (p 能整除
n
p
\frac{n}{p}
pn)
欧拉函数的性质4:
φ
(
n
)
=
φ
(
n
p
)
×
(
p
−
1
)
\varphi(n) = \varphi(\frac{n}{p}) \times (p - 1)
φ(n)=φ(pn)×(p−1) (
p
p
p与
n
p
\frac{n}{p}
pn互质 且
p
p
p是质数)
const int MAXN = 1e5;
int phi[MAXN + 5],pri[MAXN + 5],cnt;
bool not_prim[MAXN + 5];
void GetPhi(int N) {
phi[1] = 1;
for(int i = 2;i <= N;i ++){
if (!not_prim[i]) {
pri[++cnt] = i;
phi[i] = i - 1; // 素数的欧拉函数=素数本身 - 1
}
for(int j = 1;j <= cnt && i * pri[j] <= N;j ++){
not_prim[i * pri[j]] = true;
if (i % pri[j] == 0) { // i * pri[j']中最小的质因子一定为pri[j]而不是pri[j']所以break掉
phi[i * pri[j]] = phi[i] * pri[j]; // 欧拉函数的性质3
break;
}
phi[i * pri[j]] = phi[i] * (pri[j] - 1); // 欧拉函数的性质4
}
}
}
超详细的欧拉函数讲解
详细证明欧拉函数的性质
实现三种欧拉函数的求值
最后 撰写不易,做人,一定要善良; 点赞,好人,有好福
关注我,收藏 点赞 评论文章 更多精品文章将尽快出炉