浅谈欧拉函数

一.简介

  我们定义一种函数φ(x),它的值为比x小的数里与x互质的数的个数。

其计算公式是 (其中p1, p2……pn为x的所有质因数,x是不为0的整数)。

  定义φ(1) = 1

  这个公式可以这样理解,对于整数x的任何一个素因子pi,在1-n中,它的倍数的个数为x/pi,剩下的数就是x*(1-1/pi)个。至于为什么用的连乘而不是连加,这个跟容斥有关系,有的数可能同时是多个素因子的乘积,可能被多次计算,在此不做证明。

二.代码实现

求单个数的欧拉函数

typedef long long LL;
LL eular(LL n)
{
    LL ans = n;
    for(int i = 2;i*i<=n;++i)
    {
        if(n%i==0)
        {
            ans-=ans/i;
            while(n%i==0)
                n/=i;
        }
    }
    if(n>1) ans-=ans/n;
    return ans;
}

欧拉函数打表

//线性筛(同时得到欧拉函数和素数表)
const int maxn = 1e7;
bool check[maxn+10];
int phi[maxn+10];
int prime[maxn+10];
int tot;//素数个数
void phi_and_prime_table(int N)
{
    memset(check,false,sizeof(check));
    phi[1] =1;
    tot =0;
    for(int i =2;i<=N;++i)
    {
        if(!check[i])
        {
            prime[tot++] = i;
            phi[i] = i-1;
        }
        for(int j = 0;j<tot;++j)
        {
            if(i*prime[j]>N)
                break;
            check[i*prime[j]] = true;
            if(i%prime[j]==0)
            {
                phi[i*prime[j]] = phi[i]*prime[j];
                break;
            }
            else
                phi[i * prime[j]] = phi[i] * (prime[j]-1);
        }
    }
}

三.欧拉函数的性质

  1. 对于一个素数pφ(p ) = p -1
  2. 欧拉函数是积性函数,但不是完全积性函数,所以仅对两个互质的数pqφ(pq) =φ(p)*φ(q)
  3. N>1,不大于N且与N互素的所有正整数的和是φ(N)*N/2
  4. p为质数,n = pk,则φ(n) = pk  -  pk-1
  5. m =2 nm互质且n为奇数时,φ(2*n)  = φ(n)
  6. n>2时,φ(n)是偶数
  7. n的因数(包括1和他自己)的欧拉函数之和等于n

四.相关习题

posted @ 2020-01-28 22:01  浅花迷人  阅读(43)  评论(0编辑  收藏