在说欧拉函数前,先提一下一个数学关系:互质。
互质,是一种数学关系,它表示两个数除了1以外没有其他公因子。即对于两
个数a, b而言, 若gcd(a, b) = 1,则称a、b互质。
欧拉函数( φ \varphi φ)
定义
1 1 1~ N N N中与 N N N互质的数的个数被称为欧拉函数记为 φ ( N ) \varphi(N) φ(N)。
1.计算式
φ
(
N
)
=
N
×
p
1
−
1
p
1
×
p
2
−
1
p
2
×
⋯
p
m
−
1
p
m
\varphi(N) = N \times \frac{p_1 - 1}{p_1} \times \frac{p_2 - 1}{p_2} \times \cdots \frac{p_m - 1}{p_m}
φ(N)=N×p1p1−1×p2p2−1×⋯pmpm−1
该式可化简为
φ
(
N
)
=
N
×
∏
质
数
p
∣
N
(
1
−
1
p
)
\varphi(N) = N\times \prod_{质数p|N}{(1 - \frac{1}{p})}
φ(N)=N×质数p∣N∏(1−p1)
其中,
p
p
p为
N
N
N通过算术基本定理得出的质因子。
事实上,该式用计算机写的时候并不是特别优,所以我们求 φ ( N ) \varphi(N) φ(N)时并不是用该式来求的。
2.性质
1. ∀ n \forall{n} ∀n > 1,1~ n n n中与 n n n互质的数的和为 n × φ ( n ) ÷ n\times \varphi{(n)} \div n×φ(n)÷ 2
因为 g c d ( n , x ) = g c d ( n , n − x ) gcd(n , x)=gcd(n , n - x) gcd(n,x)=gcd(n,n−x),所以与 n n n不互质的数是成对出现的且若 x x x与 n n n不互质,则 n − x n - x n−x与 n n n也不互质。所以与 n n n不互质的数的平均数为 n / 2 n/2 n/2,所以与 n n n互质的数的平均数为 n / 2 n/2 n/2,进而得到上述性质。
2.若 a , b a,b a,b互质,则 φ ( a b ) = φ ( a ) φ ( b ) \varphi(ab) = \varphi(a)\varphi(b) φ(ab)=φ(a)φ(b)
该性质还可以表示为欧拉函数为积性函数。
3.若 f f f是积性函数,且在算术基本定理中 n = ∏ i = 1 m p i c i n = \prod_{i = 1} ^{m} p_i^{c_i} n=∏i=1mpici则 f ( n ) = ∏ i = 1 m f ( p i c i ) f(n)=\prod_{i = 1}^{m}f(p_i^{c_i}) f(n)=∏i=1mf(pici)。
这其实是所有积性函数的共有性质,实际上就是积性函数的定义的另一种表现。
4.设 p p p 为质数,若 p ∣ n p\mid n p∣n且 p 2 ∣ n p^2\mid n p2∣n,则 φ ( n ) = φ ( n / p ) × p \varphi (n) = \varphi(n / p) \times p φ(n)=φ(n/p)×p
显然,如果我们将 n n n分解质因数。那么,对于满足上述条件的 p p p而言, n n n与 n / p n/p n/p一定有相同的质因子,且仅 p p p的指数不同。因此, φ ( n ) \varphi(n) φ(n)与 φ ( n / p ) \varphi(n / p) φ(n/p)的商为 p p p。所以该性质成立。
5.设 p p p为质数,若 p ∣ n p\mid n p∣n 且 p 2 ∤ n p^2\nmid n p2∤n,则 φ ( n ) = φ ( n / p ) × ( p − 1 ) \varphi(n) = \varphi(n / p) \times (p - 1) φ(n)=φ(n/p)×(p−1)
因为 p ∣ n p\mid n p∣n且 p 2 ∤ n p^2\nmid n p2∤n所以 n n n与 n / p n / p n/p互质。因为欧拉函数为积性函数,所以 φ ( n ) = φ ( n / p ) × φ ( p ) \varphi(n) = \varphi(n/p) \times \varphi(p) φ(n)=φ(n/p)×φ(p),又因为 p p p是质数,易知 φ ( p ) = p − 1 \varphi(p) = p-1 φ(p)=p−1。所以该性质成立。
3.求解
当我们求 φ ( N ) \varphi(N) φ(N)时,如果用计算式求,实际上限制了求的次数。事实上,我们可以利用欧拉函数的几个性质来得出求解方法。
由欧拉函数性质4和性质5可以想到,如果我们就出小于 N N N的所有质数,我们就可以求出 φ ( x ) ( x ∈ [ 1 , N ) ) \varphi(x)(x \in [1 , N)) φ(x)(x∈[1,N))的值。因此,我们可以利用素数筛,每当找到一个素数,就可以利用欧拉函数的性质4和性质5来求出一系列的 φ ( N ) ( N = p × k ) \varphi(N)(N = p\times k) φ(N)(N=p×k),而某一个 N = p × k N = p\times k N=p×k又正好是欧拉筛计算时的过程量。
代码如下
int f[Size], q[Size] , phi[Size];
void make_q(int n)
{
int top = 0;
for(int i = 2 ; i <= n ; i++)
{
if(!f[i])
{
f[i] = i;
q[top++] = i;
}
for(int j = 0 ; q[j] <= f[i] && j < top && q[j] < n / i ; j++)
{
f[i * q[j]] = q[j];
if(i % q[j] == 0)//性质4
{
phi[i * q[j]] = phi[i] * q[j];
}
else//性质5
{
phi[i *q[j]] = phi[i] * phi[q[j]];
}
}
}
}