把博客园图标替换成自己的图标
把博客园图标替换成自己的图标end

【学习笔记】线性筛欧拉函数

Bases

这里给出的筛法是以线性筛素数的方法为基础的。

利用了欧拉函数是积性函数的性质:对于任意互质的数\(a\),\(b\),有\(f(a*b)=f(a)*f(b)\)

筛法

类比于线性筛素数。

\(i\)以下的欧拉函数已经被筛出,我们利用\(i\)\(prim\)往后更新。

如果\(i\)是素数,那么\(\varphi(i)=i-1\)


如果\(i\%prim[j]!=0\) ,那么\((i,prim[j])==1\), 则有\(\varphi(i*prim[j])=\varphi(i)*\varphi(prim[j])=\varphi(i)*(prim[j]-1)\)


如果\(i\%prim[j]==0\),则\(\varphi(i*prim[j])=\varphi(i)*prim[j]\)(先甩结论)

有两个证法:

1.

\(i\%prim[j]==0\)不能直接算的原因是它两个不互质,那我们把它写成互质的样子。

\(i*prim[j]=A*prim[j]^{m-1}*prim[j]=A*prim[j]^m\)


有个结论:如果\(p\)是质数,那么\(\varphi(p^k)=p^k-p^{k-1}=p^{k-1}*(p-1)\)

比较显然,\(p^k\)是数的总数,而\(p^k\)只有\(p\)这一个质因子,所以它的因数都是\(p\)的倍数,即\(1*p,2*p,3*p,...,p^{k-1}*p\)\(p^k\)的包含自己在内的因数个数有\(p^{k-1}\)个。

用总数\(p^k\)减去因数个数\(p^{k-1}\)就是 \(\varphi (p^k)\)。(这里总数和因数个数都算了自己本身,一减就把自己减掉了,所以没有影响)

\(\varphi(p^k)=p^{k-1}*(p-1)\)

\(\varphi(p^{k-1})=p^{k-2}*(p-1)\)

联立以上二式可得:\(\varphi(p^k)=\varphi(p^{k-1})*p\)


以下将\(prim[j]\)简写成\(p\)

\(\varphi(i*p)=\varphi(A)*\varphi(p^{m})=\varphi(A)*\varphi(p^{m-1})*p\)

\(A*p^{m-1}=i\),则\(\varphi(A)*\varphi(p^{m-1})=\varphi(i)\)

那么\(\varphi(i*p)=\varphi(A)*\varphi(p^{m-1})*p=\varphi(i)*p\)

\(Q.E.D.\)

2.

欧拉函数有个通式:(先甩式子再证明)
\(\varphi(n)=n*(1-\frac{1}{p_1})*(1-\frac{1}{p_2})*...*(1-\frac{1}{p_n})\)\(p_i\)是质因数

那么

\(\varphi(i)=i*(1-\frac{1}{p_1})*(1-\frac{1}{p_2})*...*(1-\frac{1}{prim[j]})\)

\(\varphi(i*prim[j])\\=(i*prim[j])*(1-\frac{1}{p_1})*(1-\frac{1}{p_2})*...*(1-\frac{1}{prim[j]})\\=i*(1-\frac{1}{p_1})*(1-\frac{1}{p_2})*...*(1-\frac{1}{prim[j]})*prim[j]\\=\varphi(i)*prim[j]\)

然后来说一下那个什么通式怎么来的:

这里也给出两个证法:

1.容斥原理

\(n\)的其中一个质因子是\(p\)\([1,n]\)\(p\)的倍数有\(p,2p,3p,...\frac n p*p\)一共\(\frac n p\)个数,\([1,n]\)中不含因子\(p\)的数就一共有\(n-\frac n p\)

\(n\)的另外一个质因子是\(q\),同理可得\([1,n]\)中不含因子\(q\)的数就一共有\(n-\frac n q\)个,根据容斥原理,\([1,n]\)中两个质因子均不含的数的个数为\(n-\frac n p-\frac n q+\frac n {pq}=\frac {n(pq-q-p+1)} {pq}=\frac{n(p-1)(q-1)}{pq}=n*\frac{p-1}p*\frac{q-1}q=n*(1-\frac 1 p)*(1-\frac 1 q)\)

推广到\(n\)的每一个质因子(变形时用到了分组分解因式的方法),可得\([1,n]\)中所有\(n\)的质因子均不含的数的个数为\(n*\prod_{i=1}^k(1-\frac 1 {p_i})\),其中,\(p_i\)\(n\)的质因子。

\(\varphi(n)=n*\prod_{i=1}^k(1-\frac 1 {p_i})\)

2.利用积性函数的性质

\(n=0\)时,\(\varphi(n)=0\) 成立

\(n=1\)时,\(\varphi(n)=1\) 成立

\(n\)为质数时,\(\varphi(n)=n-1\) 成立

\(n\)为一个质数的正整数次幂,即\(n=p^k\)时,\(\varphi(p^k)=p^k-p^{k-1}=p^{k}*(1-\frac1 p)=n*(1-\frac1 p)\) 成立

\(n\)为任意正整数时,根据算术基本定理可得\(n=p_1^{k_1}p_2^{k_2}p_3^{k_3}...p_m^{k_m}\),其中\(p_i\)为质因数

根据积性函数的性质\(\varphi(n)\\=\varphi(p_1)\varphi(p_2)...\varphi(p_m)\\=p_1^{k_1}(1-\frac 1{p_1})p_2^{k_2}(1-\frac 1{p_2})p_3^{k_3}(1-\frac 1{p_3})...p_m^{k_m}(1-\frac 1{p_m})\\=n*(1-\frac 1{p_1})(1-\frac 1{p_2})...(1-\frac 1{p_m})\)

$Q.E.D . $

(怎么觉得证明通式比证明这个结论本身还要复杂

Code View

void Phi()
{
	for(int i=2;i<=n;i++)
	{
		if(!vis[i]) prim[++pn]=i,phi[i]=i-1;
		for(int j=1;j<=pn&&i*prim[j]<=n;j++)
		{
			vis[i*prim[j]]=1;
			if(i%prim[j]==0)
			{
				phi[i*prim[j]]=phi[i]*prim[j];
				break;
			}
			else phi[i*prim[j]]=phi[i]*(prim[j]-1);
		}
	}
} 
posted @ 2020-08-07 14:57  Starlight_Glimmer  阅读(1635)  评论(0编辑  收藏  举报
浏览器标题切换
浏览器标题切换end