莫比乌斯函数及反演学习笔记

这篇具有很好参考价值的文章主要介绍了莫比乌斯函数及反演学习笔记。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前置知识

\(1.\) 艾佛森括号:
\([P]=\begin{cases}1 & \mathtt{(if\ P\ is \ true)}\\0 & \mathtt{(otherwise)}\end{cases}\)
\(2.\) \(a\mid b\) 表示 \(a\)\(b\) 的因子
\(3.\) 整除分块:\(\displaystyle\sum_{i=1}^n\lfloor\dfrac{N}{i}\rfloor\)
\(4.\) \(p\) 没有特殊说明时表示质数
\(5.\) \(\mathbb{P}\) 表示质数集,\(\mathbb{Z}\) 表示整数集。
\(6.\) 常见的函数:

  • 常函数:\(1(x)=1\)
  • 单位元函数:\(\epsilon(x)=[x=1]\)
  • 恒等函数:\(Id_k(x)=x^k\)
  • 因子函数:\(d(x)=\displaystyle\sum_{i\mid x}1\)
  • 因子和函数:\(\sigma(x)_k=\displaystyle\sum_{i\mid x}i^k\)
  • 欧拉函数:\(\varphi(x)=\displaystyle\sum_{i=1}^x[\gcd(i,x)=1]\)

函数

数论函数

数论函数指一类定义域是正整数,值域是一个数集的函数。有:

  • \((f+g)(x)=f(x)+g(x)\)
  • \((x*f)(n)=x*f(n)\)

积性函数

当数论函数 \(f\) 对于 \(\gcd(n,m)=1\) 有:

\[f(nm)=f(n)f(m) \]

则数论函数 \(f\) 为积性函数。
例如:\(d(x),\varphi(x)\)

完全积性函数

当积性函数 \(f\) 对于 \(\gcd(n,m)\not=1\) 仍有:

\[f(nm)=f(n)f(m) \]

则积性函数 \(f\) 为完全积性函数。
例如:\(\epsilon(x),id_k(x)\)

积性函数的实现

那么,积性函数像下面的 \(\varphi,\mu\) 都是非常有用的东西,当然还有更多的积性函数,那么我们该如何去线性求出积性函数呢。
我们需要通过想欧拉筛筛质数的方式来快速筛出积性函数。
比如我们现在要筛积性函数 \(f\),那么我们就需要快速的得到它的 \(f(1),f(p),f(p^t)\)
我们需要先对每一个 \(i\) 进行唯一分解 \(\displaystyle\prod_{i=1}^kp_i^{t_i}\)

  • \(p<p_1,\gcd(p,i)=1\) 时,则 \(f(ip)=f(i)\times f(p)\)
  • \(p=p_1\) 时,我们先记 \(low_i\) 表示 \(p_1^{t_1}\),则 \(f(ip)=f\left(\dfrac{i}{low_i}\right)f(low_i\times p)\)

这样我们就可以不重不漏的筛出函数 \(f\) 了。

void init(ll n){
    isp[1]=low[1]=1;
    f[1]=对1直接定义;
    for(ll i=2;i<=n;i++){
        if(!isp[i]) low[i]=p[++cnt]=i,f[i]=对质数直接定义;
        for(ll j=1;j<=cnt&&i*p[j]<=n;j++){
            isp[i*p[j]]=1;
            if(i%p[j]==0){
                low[i*p[j]]=low[i]*p[j];
                if(low[i]==i)
                    f[i*p[j]]=对质数的若干次幂进行定义(一般由f[i]递推);
                else
                    f[i*p[j]]=f[i/low[i]]*f[low[i]*p[j]];
                break;
            }
            low[i*p[j]]=p[j];
            f[i*p[j]]=f[i]*f[p[j]];
        }
    }
}

狄利克雷卷积 (dirichlet)

定义两个函数 \(f(n)\)\(g(n)\) 的狄利克雷卷积 \((f*g)(n)\) 其中 \(*\) 为卷积符号:

\[t(n)=\displaystyle\sum_{i|n}f(i)g(\dfrac{n}{i})\Leftrightarrow \displaystyle\sum_{ij}f(i)g(j) \]

同时狄利克雷卷积满足以下一些性质:

  • \(f*g=g*f\)
  • \((f*g)*h=f*(g*h)\)
  • \(f*h+g*h=(f+g)*h\)
  • \((xf)*g=x(f*g)\)
  • \(\epsilon*f=f\)
  • 对于每一个 \(f(1)\not=1\) 的函数 \(f\) 都有逆元 \(g\),使得 \(f*g=\epsilon\)

那么对于一个 \(f(1)\not=1\) 的函数 \(f\) 的逆元 \(g\) 该如何计算呢
我们只需要通过狄利克雷卷积的定义简单推导一下得到:

\[g(n)=\dfrac{1}{f(1)}\left([n=1]-\displaystyle\sum_{i\mid n,i\not=1}f(i)g(\frac{n}{i})\right) \]

这样就有:\(\displaystyle\sum_{i\mid n}f(i)g(\dfrac{n}{i})=f(1)g(n)+\displaystyle\sum_{i\mid n,i\not=1}=[n=1]=\epsilon\)

欧拉函数 (Euler)

定义

欧拉函数用 \(\varphi\) 表示,定义:

\[\varphi(n)=\displaystyle\prod_{i=1}^n[\gcd(i,n)=1] \]

解释:\(\varphi(n)\) 表示 \(1\sim n\) 中与 \(n\) 互质的数的个数。

公式

先设 \(n=\displaystyle\prod_{i=1}^kp_i^{t_i}\),则有:

\[\varphi(n)=n\displaystyle\prod_{i=1}^k\left(1-\dfrac{1}{p_i}\right) \]

证明:
我们先假设 \(n\in\mathbb{N^+}\) 只存在质因子 \(p,q\)
考虑容斥,与 \(n\) 互质的数就是所有数减去 \(p,2p,\cdots,\lfloor\dfrac{n}{p}\rfloor,q,2q,\cdots,\lfloor\dfrac{n}{q}\rfloor\)
同时根据容斥原理,需要补回 \(pq,2pq,\cdots,\lfloor\dfrac{n}{pq}\rfloor\)
\(\varphi(n)=n-\dfrac{n}{p}-\dfrac{n}{q}+\dfrac{n}{pq}=n\left(1-\dfrac{1}{p}\right)\left(1-\dfrac{1}{q}\right)\)
那么同理,当 \(n=\displaystyle\prod_{i=1}^{k}p_i^{t_i}\) 时,有:

\[\varphi(n)=n\left(1-\dfrac{1}{p_1}\right)\left(1-\dfrac{1}{p_2}\right)\cdots\left(1-\dfrac{n}{p_k}\right)=n\displaystyle\prod_{i=1}^k\left(1-\dfrac{1}{p_i}\right) \]

积性函数

函数 \(\varphi\) 满足 \(\varphi(nm)=\varphi(n)\varphi(m)\ \ \ (\gcd(n,m)=1)\)
\(\varphi\) 为积性函数。

证明:
\(n=\displaystyle\prod_{i=1}^kp_i^{a_i},m=\displaystyle\prod_{i=1}^tq_i^{b_i}\ \ \ (\gcd(n,m)=1)\)

\[\begin{aligned}\varphi(nm)= & nm\displaystyle\prod_{i=1}^k\left(1-\dfrac{1}{p_i}\right)\displaystyle\prod_{j=1}^t\left(1-\dfrac{1}{q_j}\right)\\= & n\displaystyle\prod_{i=1}^k\left(1-\dfrac{1}{p_i}\right)m\displaystyle\prod_{j=1}^t\left(1-\dfrac{1}{q_j}\right)\\ = & \varphi(n)\varphi(m)\end{aligned} \]

性质

\[\displaystyle\sum_{d\mid n}\varphi(d)=n\Leftrightarrow \varphi*1=Id \]

证明:
\(f(n)=\displaystyle\sum_{d\mid n}\varphi(d)\)。则由于:
\(f(n)f(m)=\displaystyle\sum_{i\mid n}\varphi(i)\displaystyle\sum_{j\mid n}\varphi(j)=\displaystyle\sum_{d\mid nm}\varphi(d)=f(nm)\)
可以得到 \(f(n)\) 为积性函数。
\(n=\displaystyle\prod_{i=1}^kp_i^{t_i}\)
而对于 \(f(p^c)=\displaystyle\sum_{i=1}^c\varphi(p^i)=\displaystyle\sum_{i=1}^cp^i-p^{i-1}=p^c\)
\(\therefore f(n)=\displaystyle\prod_{i=1}^kf(p_i^{t_i})=\displaystyle\prod_{i=1}^kp_i^{t_i}=n\)

实现

我们可以通过线性筛筛质数的时候是顺便就把欧拉函数筛出来。

void Euler(int n){
    phi[1]=1;
    for (int i=2;i<=n;i++){
        if (!isp[i])primes.push_back(i),phi[i]=i-1;
        for(auto p:primes){
            if(p*i>n)break;
            isp[p*i]=1;
            if (!(i%p)){
                phi[p*i]=phi[i]*p;
                break;
            }else phi[p*i]=phi[p]*phi[i];
        }
    }
}

莫比乌斯函数 (Möbius)

定义

莫比乌斯函数用 \(\mu\) 表示,定义:

\[\mu(x)=\begin{cases}1 & x=1\\0 & \exists p\in\mathbb{Z},p^2\mid x\\(-1)^k & \displaystyle\prod_{i=1}^kp_i(1\le i,j\le j,p_i\not=p_j)\end{cases} \]

解释一下对 \(\mu(x)\) 的定义:

  • \(x=1\) 时,\(\mu(x)=1\)
  • \(x\) 含有任何的质因子的幂次 \(\ge 2\)\(\mu(x)=0\)
  • \(x=\displaystyle\prod_{i=1}^kp_i\),且所有 \(p_i\) 的互不相同时,\(\mu(x)=(-1)^k\)

性质

只知道莫比乌斯函数的定义还远远不够,我们还需要了解一下他的性质:

  • \(n\in\mathbb{N^+},\displaystyle\sum_{d\mid n}\mu(d)=[n=1],\mu*1=\epsilon\)

证明:

\(n=1\) 时,\(\displaystyle\sum_{d|n}=\mu(1)=1=[n=1]\)

\(n>1\) 时,我们记 \(n=\displaystyle\prod_{i=1}^kp_i^{t_i}\)
\(\exists t_i,t_i>1\) 时,\(\mu(n)=0\)
\(\forall t_i,t_i=1\) 时,对于 \(\mu(d)=(-1)^r\) 这样的存在 \(C_k^r\) 个。
\(\therefore \displaystyle\sum_{d\mid n}\mu(d)=C_k^0+C_k^1+C_k^2+\cdots+(-1)^kC_k^k=\displaystyle\sum_{i=0}^k(-1)^iC_k^i\)
由二项式定理:\((x+y)^n=\displaystyle\sum_{i=0}^nC_n^ix^iy^{n-i}\)
\(\therefore \displaystyle\sum_{d\mid n}\mu(d)=\displaystyle\sum_{i=0}^k(-1)^iC_k^i=(-1+1)^n=0\)

  • \(\displaystyle\sum_{d\mid n}\dfrac{\mu(d)}{d}=\dfrac{\varphi(n)}{n}\)

证明:
\(\begin{aligned}\displaystyle\sum_{d\mid n}\dfrac{\mu(d)}{d}=&\displaystyle\sum_{d\mid n}\dfrac{\mu(d)\frac{n}{d}}{n}\\=& \dfrac{\displaystyle\sum_{d\mid n}\mu(d)Id\left(\frac{n}{d}\right)}{n}\\= & \dfrac{\mu(n)*Id(n)}{n}\end{aligned}\)
根据 \(\varphi*1=Id\Leftrightarrow\varphi*1*\mu=\mu*Id\Leftrightarrow\varphi*\epsilon=\mu*Id\)
\(\displaystyle\sum_{d\mid n}\dfrac{\mu(d)}{d}=\dfrac{\mu(n)*Id(n)}{n}=\dfrac{\varphi(n)}{n}\)

实现

和欧拉函数一样,也可以在筛质数的时候顺便得到。

void getMu(int n){
    mu[1]=1;
	isp[0]=isp[1]=1;
    for(int i=2;i<=n;++i){
        if(!isp[i])mu[p[++cnt]=i]=-1;
        for(int j=1;j<=cnt&&p[j]*i<=n;++j){
            isp[i*p[j]]=1;
            if(!(i%p[j]))break;
            else mu[p[j]*i]=-mu[i];
        }
    }
}

莫比乌斯反演

当存在有两个函数 \(f\)\(g\) 满足:\(f(n)=\displaystyle\sum_{d|n}g(d)\)\(f=g*1\)
则一定有:

\[g(n)=\displaystyle\sum_{d|n}f(n)\mu(\dfrac{n}{d}),即 g=f*\mu \]

证明:

\[f=g*1\Leftrightarrow f*\mu=g*1*\mu \Leftrightarrow f*\mu=g \]

倍数形式:

\[g(n)=\displaystyle\sum_{n\mid d}f(d)\Leftrightarrow f(n)=\displaystyle\sum_{n\mid d}\mu(\dfrac{d}{n})g(d) \]

例题

\(1.\) P2522 Problem B
\(\displaystyle\sum_{i=a}^b\displaystyle\sum_{j=c}^d[\gcd(i,j)=k]\)

\(f(k)=\displaystyle\sum_{i=1}^n\displaystyle\sum_{j=1}^m[\gcd(i,j)=k],g(n)=\displaystyle\sum_{n\mid k}f(k)\)
则通过莫比乌斯反演的倍数形式可以得到: \(f(x)=\displaystyle\sum_{x\mid k}\mu(\lfloor\dfrac{k}{x}\rfloor)g(k)\)
我们在考虑对于函数 \(g\) 的处理:
\(\begin{aligned}g(x)=&\displaystyle\sum_{x\mid k}\displaystyle\sum_{i=1}^n\displaystyle\sum_{j=1}^m[\gcd(i,j)=k]\\=&\displaystyle\sum_{i=1}^n\displaystyle\sum_{j=1}^m[x\mid \gcd(i,j)]\\=&\displaystyle\sum_{i=1}^{\lfloor\frac{n}{x}\rfloor}\displaystyle\sum_{j=1}^{\lfloor\frac{m}{x}\rfloor}[1\mid \gcd(i,j)]\\=&\lfloor\dfrac{n}{x}\rfloor\lfloor\dfrac{m}{x}\rfloor\end{aligned}\)
我们在将函数 \(g\) 带回函数 \(f\),同时枚举 \(\lfloor\dfrac{k}{x}\rfloor\) 记为 \(t\)
\(f(x)=\displaystyle\sum_{t=1}^{\min(n,m)}\mu(t)\lfloor\dfrac{n}{tx}\rfloor\lfloor\dfrac{m}{tx}\rfloor\)
那么对于最后的答案我们只需要一个简单的容斥:
\(ans=\displaystyle\sum_{i=1}^b\displaystyle\sum_{j=1}^d[\gcd(i,j)=k]-\displaystyle\sum_{i=1}^{a-1}\displaystyle\sum_{j=1}^d[\gcd(i,j)=k]-\displaystyle\sum_{i=1}^b\displaystyle\sum_{j=1}^{c-1}[\gcd(i,j)=k]+\displaystyle\sum_{i=1}^{a-1}\displaystyle\sum_{j=1}^{c-1}[\gcd(i,j)=k]\)
通过上的函数 \(f,g\) 带入即可,通过整除分块可以得到时间复杂度 \(O(\sqrt{n})\)文章来源地址https://www.toymoban.com/news/detail-710609.html

到了这里,关于莫比乌斯函数及反演学习笔记的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 陶哲轩工作流之人工智能数学验证+定理发明工具LEAN4 [线性代数篇2前置知识]不同求和范围不同函数项结果相等的条件

    有空点赞我的视频哦:陶哲轩工作流之人工智能数学验证+定理发明工具LEAN4 [线性代数篇2前置知识]不同求和范围不同函数项结果相等的条件_哔哩哔哩_bilibili -- 反向推理 refine\\\' sum_bij _ _ _ _ _ -- {s : Finset α} {t : Finset γ} {f : α → β} {g : γ → β} -- (i : ∀ a ∈ s, γ) -- (hi : ∀ a ha,

    2024年01月17日
    浏览(53)
  • 论文笔记: 循环神经网络进行速度模型反演 (未完)

    摘要 : 分享对论文的理解, 原文见 Gabriel Fabien-Ouellet and Rahul Sarkar, Seismic velocity estimation: A deep recurrent neural-network approach. Geophysics (2020) U21–U29. 作者应该是领域专家, 对地球科学的理解胜于深度学习. 为方便讨论, 等式编号保持与原文一致. common-midpoint gathers (共中心点道集): 在地

    2024年02月10日
    浏览(45)
  • JUC前置知识

    JUC概述 在开发语言中,线程部分是重点,JUC是关于线程的。JUC是java.util.concurrent工具包的简称。这是一个处理线程的工具包,JDK1.5开始出现的。 线程和进程 线程和进程的概念 进程(process): 是计算机的程序关于某数据集合上的一次允许活动,是操作系统进行资源分配和任务调

    2024年02月08日
    浏览(45)
  • 7.前置知识3:LoadBalance

    https://medium.com/google-cloud/understand-cloud-load-balancer-like-a-senior-engineer-d4f55f3111fc 负载均衡本来是个硬件设备。其实一开始确实是的,然而现在已经不同了。 尤其是云厂商提供的负载均衡方案几乎全部是靠软件。现在的负载均衡不仅是网络流量复杂均衡,几乎所有的平衡多个计算资

    2024年02月20日
    浏览(49)
  • (一) AIGC了解+前置知识

    大论文双盲意见还没回来,每天度日如年,慌的一批,唯恐延毕,得找点事情干~ 小论文major revision,本来打算一鼓作气把小论文完全改好的,但是搞了三个月的文字工作,好久没有吸收新知识了 所以…每天边学新东西,边改小论文~ 最近AIGC比较火,就从它开始吧 AIGC大致了解

    2024年02月13日
    浏览(35)
  • C#代码审计实战+前置知识

    菜鸟教程:https://www.runoob.com/csharp/csharp-intro.html C# 基于 C 和 C++ 编程语言,是一个简单的、现代的、通用的、面向对象的编程语言,它是由微软(Microsoft)开发的,由 Ecma 和 ISO 核准认可的。 C# 是由 Anders Hejlsberg 和他的团队在 .Net 框架开发期间开发的。 C# 是专为公共语言基础

    2024年02月05日
    浏览(44)
  • 前置知识——Linux网络虚拟化

    信息是如何通过网络传输被另一个程序接收到的? 我们讨论的虚拟化网络是狭义的,它指容器间网络。 好了,下面我们就从 Linux 下网络通信的协议栈模型,以及程序如何干涉在协议栈中流动的信息来开始了解吧。 如果抛开虚拟化,只谈网络的话,那我认为首先应该了解的知

    2023年04月12日
    浏览(54)
  • 第一章设计模式前置知识

    软件设计模式(Software Design Pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。它描述了在软件设计过程中的一些不断重复发生的问题,以及该问题的解决方案。也就是说,它是解决特定问题的一系列套路,是前辈们的代码

    2024年02月01日
    浏览(45)
  • (三)Flask前置知识栈——装饰器

    在后续的讲解中,对大家对装饰器的掌握程度要求较高,所以此文来深入讲解一下,有看过《Python全栈系列教程》专栏的小伙伴可能会说,装饰器已经出过文章讲的很详细了。饶是如此,深究过装饰器的小伙伴们就权当复习一遍,同时,本篇文章会有所拓展哦~ 在继续之前,

    2024年02月15日
    浏览(41)
  • 【数据结构一】初始Java集合框架(前置知识)

           Java语言在设计之初有一个非常重要的理念便是:write once,run anywhere!所以Java中的数据结构是已经被设计者封装好的了,我们只需要实例化出想使用的对象,便可以操作相应的数据结构了,本篇文章中我会向大家简单 介绍一下什么是数据结构 ,以及 对Java中常用的数

    2024年02月04日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包