以下的除法,如果不是特殊说明,都是整数运算中的整除。
1 关于欧拉函数\(\varphi\)
\(\varphi(x)\)是欧拉函数,表示的是\([1,x]\)中和\(x\)互质的数的个数。
\[
\varphi(x)=x\times \Pi_{p\in prime,p|x}(1-\frac 1p)
\]
以上的证明:(用归纳证明)
设\(p,q\in prime,p|x,q|x\),那么在\([1,x]\)中是\(p\)和\(q\)的倍数的个数分别为\(\frac xp\)和\(\frac xq\)。
那么存在于\([1,x]\)中是\(p\)或者\(q\)的倍数的个数为\(\frac xp+\frac xq-\frac x{pq}\)。(这一步用到了容斥原理)
那么\(\varphi(x)\)也就是和\(p,q\)同时不互质的数的个数为\(x-\frac xp-\frac xq+\frac x{pq}\)。
整一下上式得到\(x\times (1-\frac xp-\frac xq+\frac x{pq})=x\times (1-\frac 1p)\times(1-\frac 1q)\)。
归纳一下就可以得到\(\varphi\)的计算式了。
对于上式推导式,可以用暴力求,时间复杂度为\(O(\sqrt n)\)。
int phi(int x) { int res = x; for (int i = 2; i * i <= x; i++) { if (x % i == 0) { res = res / i * (i - 1); while (x % i == 0) x /= i; } } if (x > 1) res = res / x * (x - 1); }
2 关于欧拉函数\(\varphi\)的性质
2.1 性质1
\(\forall x\in prime\),\(\varphi(x)=x-1\)。
证明:
直接将\(x\in prime\)代入计算式就可以了。
2.2 性质2
积性函数:对于\(gcd(x1,x2)=1\),\(\varphi(x1\times x2)=\varphi(x1)\times \varphi(x2)\)。
证明:
\[
\varphi(x1\times x2)=x1\times x2\times \Pi_{p\in prime,p|x1\times x2}(1-\frac 1p)
\]
因为\(x1\)和\(x2\)互质,所以对于在\(\Pi_{p\in prime,p|x1\times x2}(1-\frac 1p)\)中的所有的质因数都是独立的。
所以\(\varphi (x1\times x2)=x1\times \Pi_{p\in prime|x1}(1-\frac 1p)\times x2\times \Pi_{p\in prime|x2}(1-\frac 1p)=\varphi(x1)\times \varphi(x2)\)
2.3 性质3
以下的性质和欧拉函数的欧拉筛求法有关。
对于\(p\in prime,p|x,p^2|x\),那么$\varphi(x)=\varphi(\frac xp)\times p $。
证明:
首先这个不能用积性函数的方法证明。
1.\(\varphi(x)=x\times \Pi_{p\in prime,p|x}(1- \frac 1p)\)
2.\(\varphi(\frac xp)=\frac xp\times \Pi_{p\in prime,p|\frac xp}(1-\frac 1p)\)
因为\(p^2|x\),所以两式的右半边都是相等的。(\(p\)的指数\(>1\),所以就算\(/p\)之后还是有\(p\)这个质因子的)
所以两式相处可以得到\(\frac {\varphi(x)}{\varphi(\frac xp)}=p\),得证。
对于\(p\in prime,p|x,p^2\not|x^2\),那么\(\varphi(x)=\varphi(\frac xp)\times (p-1)\)。
证明:
这个可以用积性函数的性质证明。
这个条件就说明了\(x\)和\(\frac xp\)是互质的,那么\(\varphi(x)=\varphi(\frac xp)\times \varphi(p)\)。
因为\(p\in prime\),所以\(\varphi(x)=\varphi(\frac xp)\times (p-1)\)。
利用以上的两个积性函数的性质,我们就可以用欧筛将欧拉函数在\(O(n)\)的时间筛出来。
void getPrime(int n) { for (int i = 2; i <= n; i++) { if (!ntPrime[i]) prime[++primeCnt] = i, phi[i] = i - 1; for (int j = 1; j <= primeCnt && i * prime[j] <= n; j++) { ntPrime[i * prime[j]] = 1; if (i % prime[j] == 0) { phi[i * prime[j]] = phi[i] * prime[j]; break; } else phi[i * prime[j]] = phi[i] * (prime[j] - 1); } } }
2.4 性质4
\(\forall n>1\),\([1,n]\)中和\(n\)互质的数的和是\(\frac {n\times \varphi(n)}2\)。
证明:
因为\(gcd(n,x)=gcd(n,n-x)\),所以和\(n\)不互质的数,\(x\)和\(n-x\)是成对出现,均值为\(\frac n2\)。
出现的次数一共是\(\varphi(n)\)次,那么总和就是\(\frac {n\times \varphi(n)}2\)。