欧拉函数(每日感谢:pj神)

欧拉函数

介绍

欧拉函数,即\(\varphi(n)\),表示的是小于等于\(n\)\(n\)互质的数的个数,比如\(\varphi(2)=1\)。当\(N\)是质数的时候,显然有\(\varphi(N)=N-1\)

利用算术基本性质我们可以将正整数\(n\)分解为\(N=\prod\limits_{i=1}^{n} p_i^{k_i}\)其中\(p_i\)为质数,那么$\varphi(N)=N\prod\limits _{i=1}^n \dfrac{p_i-1}{p_i} $

证明

引理1:

​ 设\(x=p^k\)(\(p\)为质数),那么\(\varphi(x)=p^{k-1}\times (p-1)\)

证明:设\(y(y\bmod p\not=0),gcd(x,y)=1\),我们可以将\(x\)分成长度为\(p\)\(p^{k-1}\)段,每一段都有\(p-1\)个数与\(x\)互质,

​ 因此与\(x\)互质的数的个数为\(p^{k-1}\times (p-1)\)

欧拉函数证明:

\[\because N=\prod_{i=1}^n p_i^{k_i} \\ \begin{aligned} \therefore \varphi(x)&=\prod_{i=1}^n \varphi(p_i^{k_i}) \\ &=\prod_{i=1}^n (p_i-1)\times p_i^{k_i-1} \\ &=\prod_{i=1}^n(\dfrac{p_i-1}{p_i})p^{k_i} \\ &=\prod_{i=1}^n (1-\dfrac{1}{p_i})p^{k_i} \\ &=x\prod_{i=1}^n (1-\dfrac{1}{p_i}) \end{aligned} \]

\(N=p^k\)(\(p\)为质数),则\(\varphi(N)=p^k-p^{k-1}=(p-1)p^{k-1}\)(根据定义)

代码

质因数分解求

适合求单点\(O(\sqrt n)\)

ll phi(ll n)
{
ll ans=n;
for(ll i=2;i*i<=n;i++)
if(!(n%i))
{
 ans=ans/i*(i-1);
 while(!(n%i))
     n/=i;
}
if(n>1) ans=ans/n*(n-1);//防止有没筛完的
return ans;
}

线性筛欧拉函数

适合求\(1\sim n(O(n))\)

\(p\)\(n\)最小质因子,\(N'=\dfrac {N}{p}\)那么线性筛的过程中\(n\) 通过\(N'\times p\)筛掉。

观察线性筛的过程,我们还需要处理两个部分,下面对\(N'\bmod p\) 分情况讨论。

(1)如果\(N'\bmod p=0\),那么 \(N’\)包含了\(N\)的所有质因子。

\[\begin{aligned} \varphi(N)&=N\times \prod_{i=1}^n \dfrac{p_i-1}{p_i} \\ &=p\times N'\times \prod_{i=1}^{n}\dfrac{p_i-1}{p_i} \\ &=p\times \varphi(N') \end{aligned} \]

(2)如果\(N'\bmod p\not=0\),这时\(N'\)\(p\)是互质的根据欧拉函数性质,我们有:

\[\begin{aligned} \varphi(N)&=\varphi(p)\times \varphi(N') \\ &=(p-1)\times \varphi(N') \end{aligned} \]

int phi[n];

void Phi(int n)
{
phi[1] = 1;
for (int i = 2; i <= n; i++)
  if (!phi[i])//外层枚举n的质因子
      for (int j = i; j <= n; j += i)
      {
          if (!phi[j])//如果没被筛过就初始化为本身(相当于欧拉函数质因子分解求法)
              phi[j] = j;
          phi[j] = phi[j] / i * (i - 1);//内层求每个数的欧拉函数(分开求得,比如15是先筛3再筛5)
      }
}

返回首页

你可能感兴趣的:(欧拉函数(每日感谢:pj神))