【数学/数论】欧拉函数 - Phi


引言

自 Mr.果 讲了 CF1900D 之后,决定复习 n 月之前学习的知识:欧拉函数。


欧拉函数,即 φ(x)

φ(x)=i=1x[gcd(x,i)=1]

它表示小于等于 x 的数中,与 x 互质的数的个数。

特别的,

  1. φ(1)=1

  2. φ(p)=p1p 为质数);


  1. φ(x) 为积性函数。

{φ(xy)=φ(x)×φ(y) if gcd(x,y)=1φ(2x)=φ(x) if xmod2=1

用途: 线性筛法求范围内所有 φ(x)

  1. 欧拉反演
    一个正整数 n 可以表示为:

n=dnφ(d)

证明

如果 gcd(k,n)=d,那么

gcd(kd,nd)=1, (k<n)

如果我们设 f(x) 表示 gcd(k,n)=x 的数的个数,那么
n=i=1nf(i)

根据上面的证明,我们发现,

f(x)=φ(nx),从而
n=dnφ(nd)。注意到约数 d 和 nd 具有对称性,所以上式化为 n=dnφ(d)

(Ctrl+v%)


or

1线

基本用途:对于要使用多个 φ(x) 的值时,如果一个一个 O(n) 的求,效率将会很慢,而该算法适用于求一定值域范围内的所有欧拉函数值。

Time: O(n) **Memory: **O(n)

使用性质:欧拉函数是积性函数。

小声BB:所有积性函数都可以用线性筛来求

ll pri[M], tot, phi[M];
bool isp[M];
// pri -> 储存素数(线性筛的基本框架)
// tot -> 素数个数
// isp -> 是否是素数
// phi -> 欧拉函数值
void pre(int Max){// Max -> 上界
    for(int i = 1; i <= Max; i ++) isp[i] = 1;
    isp[1] = 0;
    phi[1] = 1;//phi(1) = 1
    for(int i = 2; i <= Max; i ++){
        if(isp[i]){
            pri[++ tot] = i;
            phi[i] = i - 1;//除了1以外,所有小于等于质数的数都与质数互质
        }
        for(int j = 1;j <= tot && i * pri[j] <= Max;j ++){
            isp[i * pri[j]] = 0;
            if(i % pri[j]) phi[i * pri[j]] = phi[i] * phi[pri[j]];//积性函数的性质
            else{
                phi[i * pri[j]] = phi[i] * pri[j];
                break;
            }
        }
    }
}

2gcd

额,我也不会证,看看 dalao 的博客吧

Link

posted @   固态H2O  阅读(307)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示