初识欧拉函数

本文详细介绍了欧拉函数的定义及性质,包括质数及其幂次的欧拉函数值的计算方法,以及如何通过线性筛法高效求解任意正整数的欧拉函数值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    小于n的正整数中与n互质的数的数目(φ(1)=1)
有几个性质:

* p的欧拉函数的值:当n为质数的时候值为n - 1

* p^k的欧拉函数为p^k - p^k-1=p^k(1 - 1/p)[p为质数,k为大于等于1的正整数]
        :因为p是质数,所以当一个数不包含质数p才可能与n互质,所以一共有p^k-1个数据1*p,2*p,3*p……p^k-1 * p

* 若n = p1 * p2 且p1 p2 互质,那么——n的欧拉函数的值就是p1的欧拉值*p2的欧拉值

由这三个点就可以得出加上+任意n都可以写成p1^k1*p2^k2*……pr^kr:

n的欧拉函数的通项是 = n * (1 - /p1)* (1 - 1/ p2) * …… (1 - 1/ pr)

* 除了n = 2的时候任何数的欧拉函数的值都是偶数
* 反过来n的欧拉函数的值等于A,那么给出任意A求其对应的n(如果对应的A没有n那就找A+1知道找到n)就会发现A对应的n的值是大于等于A的最小质数

* 小于n且与n互质的数的和是n的欧拉函数的值 * n / 2

ll Euler(ll n)
{
    ll res = n;
    for(ll i = 2;i*i <= n;i++)
    {
        if(n % i == 0)res = res / i * (i - 1);
        while(n % i == 0)n /= i;
    }
    if(n > 1)res = res / n * (n - 1);
    return res;
}

求n的欧拉函数的值,根据通项找到可以整除的数,一直除干净,最后剩下的如果是质数的话,还要扫尾一下。

单一的求有点慢,因为欧拉的值是固定的所以我们经常用到线性求区欧拉的值,利用到了素数筛

* 如果n = i * p ,i % p == 0 且p 为质数的话 n的欧拉值就是p * i的欧拉值

* 如果n = i * p ,i % p != 0 且p 为质数的话 n的欧拉值就是p 的欧拉值* i的欧拉值

这样就可以进行我们的线性筛法求欧拉值了

void getphi()
{
    phi[1] = 1;//欧拉值得初始化
    for(int i = 2;i <= n;i++)
    {
        if(!mark[i])
        {
            phi[i] = i - 1;//筛到了素数,进行初始化
            pri[++tot] = i;//素数表
        }
        for(int j = 1;j <= tot;j++)//遍历当前所有的素数
        {
            int x = pri[j];
            if(i * x > n)break;//不需要当前的i值来筛了
            mark[i * x] = 1;//任何一个合数都可以表示成一个数 * 一个质数
            if(i % x == 0)//更新i * x 得欧拉函数值
            {
                phi[i * x] = phi[i] * x;
                break;
            }
            else
            {
                phi[i * x] = phi[i] * phi[x];
            }
        }
    }
}
知道了上面那两个定理,这个也就很好求了~~



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值