定义
φ ( n ) \varphi(n) φ(n)(读作fai)定义为[1, n]中与n互质的数的个数
显然,当 n n n 是素数时, φ ( n ) = n − 1 \varphi(n) = n-1 φ(n)=n−1
欧拉函数的求法
关于 φ ( n ) \varphi(n) φ(n) ,有几种不同的求法,视情况使用。
首先呢,我们需要知道一个性质。
两个数
a
,
b
a, b
a,b 互质时,
φ
(
a
b
)
=
φ
(
a
)
∗
φ
(
b
)
\varphi(ab)=\varphi(a)*\varphi(b)
φ(ab)=φ(a)∗φ(b)
这是欧拉函数的积性性质,具体证明可以参考网上撒(因为我不会,我们对欧拉函数的求法,基本上都会基于此性质。
① 基于质因数分解的求法
考虑
p
,
q
p,q
p,q都是素数,
n
=
p
∗
q
n=p*q
n=p∗q的情况。
由容斥原理:
φ
(
n
)
=
n
−
n
p
−
n
q
+
n
p
q
=
n
(
1
−
1
p
)
(
1
−
1
q
)
=
(
p
−
1
)
∗
(
q
−
1
)
=
φ
(
p
)
∗
φ
(
q
)
\varphi(n)=n - \dfrac{n}{p} - \dfrac{n}{q} + \dfrac{n}{pq} = n(1-\dfrac{1}{p})(1-\dfrac{1}{q}) = (p-1)*(q-1)=\varphi(p)*\varphi(q)
φ(n)=n−pn−qn+pqn=n(1−p1)(1−q1)=(p−1)∗(q−1)=φ(p)∗φ(q)
拓展到多个素因子的情况
n
=
p
1
k
1
p
2
k
2
.
.
.
.
p
m
k
m
n = p_1^{k_1}p_2^{k_2}....p_m^{k_m}
n=p1k1p2k2....pmkm
那么
φ
(
n
)
=
∏
i
=
1
m
φ
(
p
i
)
=
n
(
1
−
1
p
1
)
.
.
.
(
1
−
1
p
m
)
\varphi(n) = \prod \limits_{i=1}^{m}\varphi(p_i) \\ = n(1-\dfrac{1}{p_1})...(1-\dfrac{1}{p_m})
φ(n)=i=1∏mφ(pi)=n(1−p11)...(1−pm1)
( 其实把二式拆开,我们会发现满足容斥原理 )
那么我们就得到了求
φ
(
n
)
\varphi(n)
φ(n) 的 第一种方法,就是求出
n
n
n 的 素因子(俗称质因数分解=。=
复杂度
O
(
n
)
O(\sqrt{n})
O(n)
代码如下:
int phi(int x) {
int ret = x;
for (int i = 2; i * i <= x; ++i)
if (x % i == 0) {
while (x % i == 0) x /= i;
ret = ret / i * (i - 1);
}
if (x > 1) ret = ret / x * (x - 1);
return ret;
}
② 线性求法
继续考虑
n
=
p
1
k
1
p
2
k
2
.
.
.
.
p
m
k
m
n = p_1^{k_1}p_2^{k_2}....p_m^{k_m}
n=p1k1p2k2....pmkm
Ⅰ k 1 = 1 k_1 = 1 k1=1
那么
n
/
p
1
n / p_1
n/p1 与
p
1
p_1
p1互质,由积性函数可得:
φ
(
n
)
=
φ
(
n
/
p
1
)
∗
φ
(
p
1
)
=
φ
(
n
/
p
1
)
∗
(
p
1
−
1
)
\varphi(n) = \varphi(n/p_1) ~* ~\varphi(p_1) = \varphi(n/p1)~*~(p1-1)
φ(n)=φ(n/p1) ∗ φ(p1)=φ(n/p1) ∗ (p1−1)
Ⅱ k 1 > = 2 k_1 >= 2 k1>=2
那么
n
/
p
1
n / p_1
n/p1 与
n
n
n 有共同的素因子,也就是说,与
n
n
n 互质的数,同时也与
n
/
p
1
n/p1
n/p1 互质。
利用这个性质,我们考虑用
φ
(
n
/
p
1
)
\varphi(n/p_1)
φ(n/p1) 来递推。
由
g
c
d
(
a
,
b
)
=
g
c
d
(
a
+
k
b
,
b
)
gcd(a,~b)=gcd(a+kb,~b)
gcd(a, b)=gcd(a+kb, b)
因此 φ ( n ) = φ ( n / p 1 ) ∗ p 1 \varphi(n) = \varphi(n/p_1) * p_1 φ(n)=φ(n/p1)∗p1
因此我们先用线性筛求出 n n n 的最小素因子,然后递推即可。
代码如下
for(i = 2; i <= m; i++){
if(!x[i]) x[i] = p[++cnt] = i;
for(j = 1; j <= cnt; j++){
t = p[j] * i;
if(t > m) break;
x[t] = p[j];
if(i % p[j] == 0) break;
}
}
phi[1] = 1;
for(i = 2; i <= m; i++){
if(x[i / x[i]] == x[i]) phi[i] = phi[i / x[i]] * x[i];
else phi[i] = phi[x / x[i]] * (x[i] - 1);
}
欧拉函数的应用
① 将求和问题转化为求个数问题
eg. 求
s
=
∑
i
=
1
n
∑
j
=
1
n
g
c
d
(
i
,
j
)
s = \sum \limits_{i=1}^{n} \sum \limits_{j=1}^{n} gcd(i,j)
s=i=1∑nj=1∑ngcd(i,j)
考虑枚举
d
=
g
c
d
(
i
,
j
)
d = gcd(i,j)
d=gcd(i,j)
那么
s
=
∑
d
=
1
n
d
∗
∑
i
=
1
n
∑
j
=
1
n
[
g
c
d
(
i
,
j
)
=
=
d
]
=
∑
d
=
1
n
d
∗
∑
i
=
1
n
∑
j
=
1
n
[
g
c
d
(
i
/
d
,
j
/
d
)
=
=
1
]
=
∑
d
=
1
n
d
∗
(
2
∗
∑
i
=
1
n
∑
j
=
1
i
[
g
c
d
(
i
/
d
,
j
/
d
)
=
=
1
]
−
1
)
=
∑
d
=
1
n
d
∗
(
2
∗
∑
i
=
1
n
φ
(
i
/
d
)
−
1
)
=
∑
d
=
1
n
d
∗
(
2
∗
∑
i
=
1
n
/
d
φ
(
i
)
−
1
)
s = \sum \limits_{d=1}^{n} d * \sum \limits_{i=1}^{n}\sum \limits_{j=1}^{n}[gcd(i,j)==d] \\ =\sum \limits_{d=1}^{n} d * \sum \limits_{i=1}^{n}\sum \limits_{j=1}^{n}[gcd(i/d,j/d)==1] \\ =\sum \limits_{d=1}^{n} d * (2*\sum \limits_{i=1}^{n}\sum \limits_{j=1}^{i}[gcd(i/d,j/d)==1] - 1) \\ =\sum \limits_{d=1}^{n} d * (2*\sum \limits_{i=1}^{n}\varphi(i/d) - 1) \\ = \sum \limits_{d=1}^{n} d * (2*\sum \limits_{i=1}^{n/d}\varphi(i) - 1)
s=d=1∑nd∗i=1∑nj=1∑n[gcd(i,j)==d]=d=1∑nd∗i=1∑nj=1∑n[gcd(i/d,j/d)==1]=d=1∑nd∗(2∗i=1∑nj=1∑i[gcd(i/d,j/d)==1]−1)=d=1∑nd∗(2∗i=1∑nφ(i/d)−1)=d=1∑nd∗(2∗i=1∑n/dφ(i)−1)
预处理个前缀和即可。
这种想法非常常见!!!!!很重要!!!
② 欧拉定理及拓展
欧拉定理:如果 a , n a,n a,n互质,那么 a φ ( n ) ≡ 1 ( m o d n ) a^{\varphi(n)} \equiv 1~~~ (mod~n) aφ(n)≡1 (mod n)
证明
构造简化剩余系证明就可以了。
拓展欧拉定理:
b > p h i ( n ) b > phi(n) b>phi(n) 时, a b ≡ a b m o d φ ( n ) + φ ( n ) ( m o d n ) a^b \equiv a^{b~mod~\varphi(n) + \varphi(n)}~~~~(mod ~n) ab≡ab mod φ(n)+φ(n) (mod n)
证明
证明
a
φ
(
n
)
≡
a
2
φ
(
n
)
(
m
o
d
n
)
即
可
a^{\varphi(n)} \equiv a^{2\varphi(n)}~~~(mod~n) 即可
aφ(n)≡a2φ(n) (mod n)即可
证明:设
n
=
n
1
n
2
n=n_1n_2
n=n1n2,其中
n
1
=
(
a
∞
,
n
)
n1=(a^\infin, n)
n1=(a∞,n)
则有
(
a
,
n
2
)
=
(
n
1
,
n
2
)
=
1
(a, n_2)=(n_1, n_2)=1
(a,n2)=(n1,n2)=1
注意到
φ
(
n
)
≥
l
o
g
2
n
\varphi(n)≥log2n
φ(n)≥log2n,因此
n
1
∣
a
φ
(
n
)
n_1|a^{\varphi(n)}
n1∣aφ(n),
a
φ
(
n
)
≡
a
2
φ
(
n
)
≡
0
(
m
o
d
n
1
)
.
.
.
(
1
)
a^{\varphi(n)}≡a^{2\varphi(n)}≡0 (mod ~n_1)...(1)
aφ(n)≡a2φ(n)≡0(mod n1)...(1)
又由
(
n
1
,
n
2
)
=
1
(n_1, n_2)=1
(n1,n2)=1得
φ
(
n
)
=
φ
(
n
1
)
φ
(
n
2
)
\varphi(n)=\varphi(n_1)\varphi(n_2)
φ(n)=φ(n1)φ(n2),
由欧拉定理
a
φ
(
n
)
≡
a
2
φ
(
n
)
≡
1
(
m
o
d
n
2
)
.
.
.
(
2
)
a^{\varphi(n)}≡a^{2\varphi(n)}≡1 (mod~n_2)...(2)
aφ(n)≡a2φ(n)≡1(mod n2)...(2)
中国剩余定理合并12两式得证。
推论:
b
>
p
h
i
(
n
)
b > phi(n)
b>phi(n) 时,
a
b
≡
a
b
m
o
d
φ
(
n
)
+
φ
(
n
)
(
m
o
d
n
)
a^b \equiv a^{b~mod~\varphi(n) + \varphi(n)}~~~~(mod ~n)
ab≡ab mod φ(n)+φ(n) (mod n)
得到欧拉定理及拓展,我们就可以利用欧拉定理来降幂。
eg.求
7
222
m
o
d
10
7^{222}~mod~10
7222 mod 10
分析:(7, 10)=1, 故
7
φ
(
10
)
=
7
5
≡
1
(
m
o
d
10
)
7^{\varphi(10)}=7^5≡1 (mod 10)
7φ(10)=75≡1(mod10)
所以
7
222
≡
7
222
m
o
d
5
=
7
2
=
49
≡
9
(
m
o
d
10
)
7^{222}≡7^{222~mod~5}=7^2=49≡9 (mod 10)
7222≡7222 mod 5=72=49≡9(mod10)
即
7
222
m
o
d
10
=
9
7^{222}~ mod ~10 = 9
7222 mod 10=9
一些例题
[SDOI2012] Longge的问题 (利用第一条应用
[SDOI2008]沙拉公主的困惑 (利用gcd的性质
bzoj 3884 上帝与集合的正确用法(利用欧拉定理降幂