数论——欧拉函数
定義
小于n的正整數中與n互質的數的數目(φ(1)=1)
通式
證明:
設p是N的質因子,1~N中p的倍數有p,2p,3p,…,(N/p)*p,共N/p個。
同理,若q也是N的質因子,則1~N中q的倍數有N/q個。
根據容斥原理,1~N中除去q的倍數與p的倍數后,數的個數為N - N/p - N/q + N/(pq) = N(1 - 1/p)(1 - 1/q)。
而要求1~N中與N互質的數的個數,只需將N的所有質因子的倍數全部除去即可。
利用容斥原理,因式分解后即可得到上式。
性質
(以下只列舉我們需要用到的一些性質)
我們用phi(N)表示歐拉函數。
- 當N為質數時,顯然phi(N)=N-1。
- 2.根據算數基本定理,N=p1C1*p2C2*…*pkCk?。設N的最小質因子為p,當p的指數為1時,phi(N)=(p-1)*phi(N/p)。
- 3. 當p的指數不為1時,同2可證得phi(N)=p*phi(N/p)。
2的證明:
根據歐拉函數通式,
phi(N)=N*(p1-1)/p1*(p2-1)/p2*…*(pk-1)/pk,
phi(N/p1)=N/p1*(p2-1)/p2*…*(pk-1)/pk,
其中p1即為N的最小質因子,比較兩式即可得證。
直接法
模板題鏈接:歐拉函數
代碼實現:
int Euler(int x) {int res=x;for(int i=2;i<=x/i;i++){if(x%i==0){res=res/i*(i-1);while(x%i==0)x/=i;}}if(x>1)res=res/x*(x-1);return res; }線性篩法
根據前面的歐拉線性篩質數的算法(可參考本人博客:數論——質數篩法),由于它在篩選的同時也求出了每個數的最小質因子,故而在其基礎上求出歐拉函數即可。
模板題鏈接:篩法求歐拉函數
代碼如下:
typedef long long ll; const int N = 1000010;int n; int prime[N],cnt,v[N]; int phi[N];ll Euler_prime(int n) {phi[1]=1;for(int i=2;i<=n;i++){if(!v[i]){prime[++cnt]=i;phi[i]=i-1;}for(int j=1;prime[j]<=n/i;j++){int p=prime[j];v[p*i]=1;if(i%prime[j]==0){phi[i*p]=p*phi[i];break;}phi[i*p]=(p-1)*phi[i];}}ll res=0;for(int i=1;i<=n;i++)res+=phi[i];return res; }?
轉載于:https://www.cnblogs.com/ninedream/p/11212793.html
總結
- 上一篇: 企业官网示例以及数据库表结构
- 下一篇: 字符串排序 墨迹了半天的自闭题目