【學習筆記】線性篩歐拉函數


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);
		}
	}
} 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM