严谨地,
φ
(
n
)
=
∑
i
=
1
n
δ
g
c
d
(
i
,
n
)
1
\varphi(n)=\sum_{i=1}^n \delta_{gcd(i,n)1}
φ(n)=∑i=1nδgcd(i,n)1(
δ
\delta
δ为克罗内克函数)。
求解
n=1
当n=1时,
φ
(
n
)
=
1
\varphi(n)=1
φ(n)=1。因为1与其本身互质。
n=p
如果n=p,即某个质数,则显然
φ
(
n
)
=
n
−
1
\varphi(n)=n-1
φ(n)=n−1。
n=
p
k
p^k
pk
如果n没有重复质因子,会是怎样呢?
不妨设
n
=
p
k
n=p^k
n=pk,其中p为n的唯一质因子。
那么显然,数x与n互质的充要条件是x与p互质。
正难则反。
φ
(
n
)
\varphi(n)
φ(n)= n以内与n互质的数的个数=n-n以内与n不互质的数的个数。
那么,n以内与n不互质的数的个数是多少呢?
显然,a与n不互质的充要条件为p|a。因此,n以内与n不互质的数的个数=n以内p的倍数的个数。
φ
(
n
)
=
n
−
n
p
=
n
−
p
k
−
1
\varphi(n)=n-\frac np=n-p^{k-1}
φ(n)=n−pn=n−pk−1
otherwise
当然,上述情况仅是特殊情况。很多时候,n是有重复质因子的。
不妨设n=a*b,其中gcd(a,b)=1。实际上,
φ
(
n
)
=
φ
(
a
)
∗
φ
(
b
)
\varphi(n)=\varphi(a)*\varphi(b)
φ(n)=φ(a)∗φ(b),即
φ
\varphi
φ为积性函数。
考虑证明一波。
对于gcd(n,m)=1,我们来求一求
φ
(
n
m
)
\varphi(nm)
φ(nm)的值。
先把1~nm的所有数画出来:
1
2
…
…
r
…
…
m
m
+
1
m
+
2
…
…
m
+
r
…
…
2
m
…
…
(
i
−
1
)
m
+
1
(
i
−
1
)
m
+
2
…
…
(
i
−
1
)
m
+
r
…
…
i
m
…
…
(
n
−
1
)
m
+
1
(
n
−
1
)
m
+
2
…
…
(
n
−
1
)
m
+
r
…
…
n
m
\begin{matrix} 1 & 2 & …… & r & …… & m \\ m+1 & m+2 & …… & m+r & …… & 2m \\ &&…… \\ (i-1)m+1 & (i-1)m+2 & …… & (i-1)m+r & …… & im \\ &&…… \\ (n-1)m+1 & (n-1)m+2 & …… & (n-1)m+r & …… & nm \\ \end{matrix}
1m+1(i−1)m+1(n−1)m+12m+2(i−1)m+2(n−1)m+2………………………………rm+r(i−1)m+r(n−1)m+r……………………m2mimnm
然后,我们又知道gcd(x,n)=gcd(x mod n,n);因此,数列r,m+r,…,(n-1)m+r中与n互质的数的个数 = 数列0,1,…n-1中与n互质的数的个数。
换句话说,每一列中,与n互质的数的个数均为
φ
(
n
)
\varphi(n)
φ(n)。
综上,
φ
(
n
m
)
=
φ
(
n
)
φ
(
m
)
\varphi(nm)=\varphi(n)\varphi(m)
φ(nm)=φ(n)φ(m)。
计算
分解质因数
根据上述分析,对于
n
=
p
1
e
1
∗
p
2
e
2
∗
.
.
.
∗
p
k
e
k
n=p_1^{e_1}*p_2^{e_2}*...*p_k^{e_k}
n=p1e1∗p2e2∗...∗pkek(pi为n的第i个质因子),均有:
φ
(
n
)
=
φ
(
p
1
e
1
)
∗
φ
(
p
2
e
2
)
∗
.
.
.
∗
φ
(
p
k
e
k
)
=
(
p
1
e
1
−
p
1
e
1
−
1
)
∗
(
p
2
e
2
−
p
2
e
2
−
1
)
∗
.
.
.
∗
(
p
k
e
k
−
p
k
e
k
−
1
)
=
p
1
e
1
(
1
−
1
p
1
)
∗
p
2
e
2
(
1
−
1
p
2
)
∗
.
.
.
∗
p
k
e
k
(
1
−
1
p
k
)
=
n
∗
(
1
−
1
p
1
)
∗
(
1
−
1
p
2
)
∗
.
.
.
∗
(
1
−
1
p
k
)
\begin{aligned} \varphi(n) & = \varphi(p_1^{e_1})*\varphi(p_2^{e_2})*...*\varphi(p_k^{e_k}) \\ & = (p_1^{e_1}-p_1^{e_1-1})*(p_2^{e_2}-p_2^{e_2-1})*...*(p_k^{e_k}-p_k^{e_k-1})\\ & = p_1^{e_1}(1-\frac 1{p_1})*p_2^{e_2}(1-\frac 1{p_2})*...*p_k^{e_k}(1-\frac 1{p_k})\\ & = n*(1-\frac 1{p_1})*(1-\frac 1{p_2})*...*(1-\frac 1{p_k})\\ \end{aligned}
φ(n)=φ(p1e1)∗φ(p2e2)∗...∗φ(pkek)=(p1e1−p1e1−1)∗(p2e2−p2e2−1)∗...∗(pkek−pkek−1)=p1e1(1−p11)∗p2e2(1−p21)∗...∗pkek(1−pk1)=n∗(1−p11)∗(1−p21)∗...∗(1−pk1)
因此,我们只需分解一波质因数,套用这个公式即可。
如果调用次数不多、n又不大,我们可以直接
O
(
n
)
O(\sqrt n)
O(n)的时间找pi。
如果调用次数多、n不大,我们就可以先筛一遍质数,然后直接从所有
≤
n
≤\sqrt n
≤n的质数中找pi并且不断令n除以pi,并且如果最终n>1,则n本身即为一个质数。
分析一波时间复杂度。
对于区间
[
1
,
n
]
[1,\sqrt n]
[1,n],根据素数定理,这里面包含了大约
n
ln
n
\frac{\sqrt n}{\ln \sqrt n}
lnnn个质数。
因此,设调用次数为t,则时间复杂度为:
O
(
t
∗
n
ln
n
)
O(t*\frac{\sqrt n}{\ln \sqrt n})
O(t∗lnnn)。
Pollard_Rho
当n比较大、
O
(
n
ln
n
)
O(\frac{\sqrt n}{\ln \sqrt n})
O(lnnn)的复杂度难以接受时,可以考虑套上Pollard_Rho算法来分解质因数。
记
n
∈
N
+
,
p
∈
p
r
i
m
e
n\in N^+,p\in prime
n∈N+,p∈prime,有:
φ
(
n
p
)
=
{
φ
(
n
)
∗
φ
(
p
)
,
if
p
∤
n
φ
(
n
)
∗
p
,
if
p
∣
n
\varphi(np) = \begin{cases} \varphi(n)*\varphi(p), & \text{if $p\nmid n$} \\ \varphi(n)*p, & \text{if $p\mid n$} \end{cases}
φ(np)={φ(n)∗φ(p),φ(n)∗p,if p∤nif p∣n
第一个很好证。既然
p
∈
p
r
i
m
e
∧
p
∤
n
p\in prime\ \land \ p\nmid n
p∈prime∧p∤n,那么p与n肯定互质。
对于区间[n+1,2n],其中与n互质的数的个数也为
φ
(
n
)
\varphi(n)
φ(n)。因为:
g
c
d
(
n
+
1
,
n
)
=
g
c
d
(
1
,
n
)
,
g
c
d
(
n
+
2
,
n
)
=
g
c
d
(
2
,
n
)
,
.
.
.
,
g
c
d
(
2
n
,
n
)
=
g
c
d
(
n
,
n
)
gcd(n+1,n)=gcd(1,n),gcd(n+2,n)=gcd(2,n),...,gcd(2n,n)=gcd(n,n)
gcd(n+1,n)=gcd(1,n),gcd(n+2,n)=gcd(2,n),...,gcd(2n,n)=gcd(n,n)
那么以此类推,对于第i个区间[(i-1)n+1,in],其中与n互质的数的个数也为
φ
(
n
)
\varphi(n)
φ(n)。
而[1,np]中有p个这样的区间,每个里面与n互质的数的个数均为
φ
(
n
)
\varphi(n)
φ(n),因此,
φ
(
n
p
)
=
φ
(
n
)
∗
p
\varphi(np)=\varphi(n)*p
φ(np)=φ(n)∗p。
然后,我们在线筛的时候,是会枚举一个i,再枚举一个素数x。我们会标记i*x为合数。
此时,若
x
∤
i
x\nmid i
x∤i,我们令
φ
(
i
x
)
=
φ
(
i
)
∗
φ
(
x
)
=
φ
(
i
)
∗
(
x
−
1
)
\varphi(ix)=\varphi(i)*\varphi(x)=\varphi(i)*(x-1)
φ(ix)=φ(i)∗φ(x)=φ(i)∗(x−1)。
若
x
∣
i
x\mid i
x∣i,我们要break,跳出枚举x的循环;那么在break之前,先让
φ
(
i
x
)
=
φ
(
i
)
∗
x
\varphi(ix)=\varphi(i)*x
φ(ix)=φ(i)∗x。
至此,我们可以在
O
(
n
)
O(n)
O(n)的时间内处理出
φ
(
1
)
,
φ
(
2
)
,
.
.
.
,
φ
(
n
)
\varphi(1),\varphi(2),...,\varphi(n)
φ(1),φ(2),...,φ(n)的值了。