0
点赞
收藏
分享

微信扫一扫

数论2:欧拉函数,

吴wuwu 2022-03-11 阅读 150
算法数论

欧拉函数

  欧拉函数f(n):1-n中与n互质的数的个数。互质指两个整数只有1这一个公约数,或者说最大公约数为1,gcd(a,b)=1。eg.f(6) = 2.
  根据唯一分解定理:N=p1a1p2a2…pnan
  可以得到欧拉函数f(N) = N*(1-1/p1)(1-1/p2)…(1-1/pn)
欧拉函数的证明可以利用容斥定理。

int Eula(int t)
{
    int  ans = t;
    for(int i = 2;i <= t / i;i++)
    {
        if(t % i == 0)
        {
             ans = ans / i * (i - 1);
            while(t % i == 0)  t /= i;
        }
    }
    if(t > 1) ans = ans / t * (t - 1);
    return ans;
}

线性筛优化求欧拉函数
利用线性筛法可以优化欧拉函数求解

  phi[1] = 1; //定义
  for(int i = 2;i <= n;i++)
  {
      if(!st[i])
      {
         primes[++cnt] = i;
         phi[i] = i - 1; //根据定义,质数的欧拉函数
      }
      for(int j = 1;primes[j] <= n/ i;j++)
      {
          st[primes[j] * i] = true;
          if(i % primes[j] == 0) 
          {
              phi[primes[j] * i] = phi[i] * primes[j]; //1.公式推导
              break;
          }
          phi[primes[j] * i] = phi[i] * (primes[j] - 1); //2.公式推导
      }
  }

  给出(1)的推导。因为primes[j]是i的约数,根据唯一分解定理primes[j]*i与i拥有相同的约数。再根据欧拉函数的定义可以推出。
  给出(2)的推导。因为primes[j]不是i的约数,那么primes[j]是primes[j]*i的最小公约数。根据定理:自然数N的最小约数一定是质数,这是唯一分解定理的基础。根据欧拉函数的定义,展开phi[primes[j]*i]与phi[i],进行对比并化简即可。

举报

相关推荐

0 条评论