学习笔记--数论--莫比乌斯反演初认识

  • 前言

    本文只是用比较通俗的例子让大家了解一下什么是莫比乌斯反演,其中说明

    (明明都是瞎猜)可能有纰漏。本人也是个蒟蒻,未能给出珂学证明,还望多多指教。

  • 理论基础

  1. “|”符号表示整除,

    a|b 表示b被a整除,也就是b有a这个因数,b=ka (k∈N)。

  2. “∑ ”求和符号
  • 是什么

请先看这个例子:

假设有两个函数F(n),f(d),且d∈{x| x|n(即n被d整除)}

并有以下关系:F(n)等于所有f(d)之和。

比如:6能被1,2,3,6整除,所以F(6)=f(1)+f(2)+f(3)+f(6)

用一个公示表示就是:

由此可得到:

F(1)=f(1)

F(2)=f(1)+f(2)

F(3)=f(1)+ f(3)

F(4)=f(1)+f(2)+f(4)

F(5)=f(1)+f(5)

F(6)=f(1)+f(2)+f(3)+f(6)

F(7)=f(1)+f(7)

稍微变形得到:

f(1)=F(1)

f(2)=F(2)-f(1)=F(2)-F(1)

f(3)=F(3)-F(1)

f(4)=F(4)-f(2)-f(1)=F(4)-F(2)

f(5)=F(5)-F(1)

f(6)=F(6)-F(3)-F(2)+F(1)

f(7)=F(7)-F(1)

f(8)=F(8)-F(4)

emmmmm这样如果我们知道各个F(n)的值我们肯定能算出各个f(d)的值,只要打表推就可以了,但仔细观察一下,有没有什么规律呢?

好像每一个f(n)都由它所有的因子d∈{x| x|n(即n被d整除)}的F(d)乘上一个0或1或-1的系数再相加得到,我们就把这个系数也看成是d的一个函数μ(d),称作莫比乌斯函数

那莫比乌斯函数的值我们怎么知道呢?有没有一个通项公式?

我们就从最特殊的f(6)着手:

f(6)=F(6)-F(3)-F(2)+F(1)

我们不妨这样看:

f(6)=1×F(6/1)+(-1)×F(6/2)+(-1)×F(6/3)+1×F(6/6)

此时好像有点端倪了,我们可以将F()中每个分母看作d,且把1看做特殊情况:μ(1)=1,易看出μ(2)=-1,μ(3)=-1,μ(6)=1.

这时相信不少大佬已看出μ(d)的值与d本身互异质因子个数有关。

2只有一个质因子2,3只有一个质因子3,而6有两个质因子2和3。

假设一正整数d的互异质因子个数为k,则μ(d)=(-1)^k。

特殊的μ(1)=1.

那有些μ(d)却等于0怎么解释呢???

比如:f(8)= F(8)-F(4),

根据上文的推测,我们知道,f(8)=μ(1)×F(8/1)+μ(2)×F(8/2)+μ(4)×F(8/4)+μ(8)×F(8/8)

再看看上文我们已有的结论,正整数d的互异质因子个数这就要求d必须能为k个互异且互质的数的乘积。但是4=2×2不满足互异,8=2×4不满足互质。

所以我们就猜想除1外不能由几个互质且互异的正整数相乘得到的数d的莫比乌斯函数值为0,例:μ(4)=0,μ(8)=0。

下面总结一下:

- μ(d)函数是莫比乌斯函数,如果d=1,μ(d)=1

- 如果d为互异质数p1,p2…pk的乘积(若d本身是个质数就看是它本身一个的乘积),则μ(d)=(?1)^k

- 否则,μ(d)=0 

然而,我们现在只是会求莫比乌斯函数值,什么是莫比乌斯反演呢?

其实就是下面两个定理:

 - 式1(约数关系):若
 

 - 式二(倍数关系):若

式1在开头已经说过,式2也类似,还请大家拿出草稿纸多演算一下,才能领悟。

  • 相关(不会证的)性质

好吧我是从百科上截来的,不过我还找到了其他几个(全都不会证

  • 对于大于1的正整数n

  • 对于任意正整数n

φ()就是欧拉函数,若不清楚的可以看我的这篇博客:

我又打广告了

  • 应用

线性方法求莫比乌斯函数值表

和欧式筛法很像,建议先了解欧式筛法原理,其他详见代码注释

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
const int maxn=19260817;
int n;
int prime[maxn];//记录素数
int mob[maxn];//记录莫比乌斯函数值
bool vis[maxn];
int cnt=0;//记录素数个数
void make_mob(int m)
{
    memset(vis,0,sizeof(vis));
    mob[1]=1;//特殊
    for(int i=2;i<=m;i++)
    {
        if(!vis[i]){
            prime[++cnt]=i;
            mob[i]=-1;//素数的μ()为-1,
            //只有其本身一个互异互质因子
        }
        for(int j=1;j<=cnt&&i*prime[j]<=m;j++)
        {
            vis[i*prime[j]]=1;//筛素数,不必多讲
            if(i%prime[j]==0){
                mob[i*prime[j]]=0;break;
            //设x=i*prime[j]很明显它的两个因子i与prime[j]不互质
            //break;大家可以先去看看欧式筛素数原理理解这句话
            }
            mob[i*prime[j]]=-mob[i];
        //不难理解,i*prime[j]比i多了一个因子
        }
    }
}
int main()
{
    cin>>n;
    make_mob(n);
    for(register int i=1;i<=n;i++)
    {
        cout<<mob[i]<<‘ ‘;
        if(i%10==0)putchar(‘\n‘);
    }
    return 0;
} 

原文地址:https://www.cnblogs.com/Rye-Catcher/p/8467085.html

时间: 2024-07-29 23:29:15

学习笔记--数论--莫比乌斯反演初认识的相关文章

《iOS应用逆向工程》学习笔记(五)初尝越狱插件OpenSSH

首先在越狱机子上装上OpenSSH插件,然后查看设备的IP地址,这里假设为192.168.xxx.xxx. 然后用Mac上的Terminal通过Open SSH连接到设备上(初次登录密码是alpine,必须立即修改,否则任何人都可以连接到你的机子上搞破坏). 连接命令为:ssh [email protected]设备IP地址 修改密码命令为:passwd 例如: $ ssh [email protected] The authenticity of host '192.168.xxx.xxx (

bootstrap学习笔记一: bootstrap初认识,hello bootstrap(下)

这一篇主要是补上源码,开始之前请先回顾:bootstrap学习笔记一: bootstrap初认识,hello bootstrap(上) 首先,我们的页面要求, lang,charset等就不用说了,老html属性, viewport是h5的属性,目的是 width=device-width 铺满设备宽度, initial-scale=1正常比较 <!DOCTYPE html> <html lang="zh-CN"> <head> <meta c

Hadoop学习笔记(9) ——源码初窥

Hadoop学习笔记(9) ——源码初窥 之前我们把Hadoop算是入了门,下载的源码,写了HelloWorld,简要分析了其编程要点,然后也编了个较复杂的示例.接下来其实就有两条路可走了,一条是继续深入研究其编程及部署等,让其功能使用的淋漓尽致.二是停下来,先看看其源码,研究下如何实现的.在这里我就选择第二条路. 研究源码,那我们就来先看一下整个目录里有点啥: 这个是刚下完代码后,目录列表中的内容. 目录/文件 说明 bin 下面存放着可执行的sh命名,所有操作都在这里 conf 配置文件所在

【bzoj4176】Lucas的数论 莫比乌斯反演+杜教筛

题目描述 去年的Lucas非常喜欢数论题,但是一年以后的Lucas却不那么喜欢了. 在整理以前的试题时,发现了这样一道题目“求Sigma(f(i)),其中1<=i<=N”,其中 表示i的约数个数.他现在长大了,题目也变难了. 求如下表达式的值: 其中f(ij)表示ij的约数个数. 他发现答案有点大,只需要输出模1000000007的值. 输入 第一行一个整数n. 输出 一行一个整数ans,表示答案模1000000007的值. 样例输入 2 样例输出 8 题解 莫比乌斯反演+杜教筛 首先有个神奇

【bzoj3601】一个人的数论 莫比乌斯反演+高斯消元

题目描述 题解 莫比乌斯反演+高斯消元 (前方高能:所有题目中给出的幂次d,公式里为了防止混淆,均使用了k代替) #include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef long long ll; const ll mod = 1000000007; ll a[110][110] , p[1010] , v[1010]; ll pow(ll x , ll

CCNA 学习笔记(二)--CISCO设备初接触

CCNA 学习笔记(二)--初识CISCO设备 上一章我们认识到网络方面的基础知识了,现在我们正式接触CISCO设备. 1.首先我们先了解一台CISCO设备里的主要组件: ROM(只读存储器):主要保存着开机自检软件.保存路由器启动引导程序. RAM(随机存储器):断电会把数据丢失.可以存储配置文件.>>>相当于PC的内存 NVRAM(非易失存储器):断电不会丢失.用来保存用户配置文件.IP.startup-config.主机名.路由协议等等. FLASH(闪存):主要是保存完整的   

[SPOJ VLATTICE]Visible Lattice Points 数论 莫比乌斯反演

7001. Visible Lattice Points Problem code: VLATTICE Consider a N*N*N lattice. One corner is at (0,0,0) and the opposite one is at (N,N,N). How many lattice points are visible from corner at (0,0,0) ? A point X is visible from point Y iff no other lat

学习笔记::数论

整理一下茹老师的笔记: 1.线性筛法:对于每个数a,都筛去pa,p为a的最小质因数 2.欧拉定理:a^φ(b)=1(mod b) a和b互质 (符号打不出来) 证明:1.消去率(这个就不证了) 就是 a*c=b*c (mod p) c和p互质可推出 a=b (mod p) 2.证明:x=φ(b)中所有数   y=a^φ(b)*x (mod b) 因为消去率, 又因为 x=y (因为a和b互质)每个数和b互质,那么x=y 把x,y中每个数相乘,有Πx=Πy (mod b) a^φ(b)*Πx=Πx

[bzoj3601] 一个人的数论 [莫比乌斯反演+高斯消元]

题面 传送门 思路 这题妙啊 先把式子摆出来 $f_n(d)=\sum_{i=1}^n[gcd(i,n)==1]i^d$ 这个$gcd$看着碍眼,我们把它反演掉 $f_n(d)=\sum_{i=1}^n\sum_{j|i,j|n}\mu(j)i^d=\sum_{j|n}\mu(j)\sum_{i=1}^{\frac{n}{j}}(ij)^d=\sum_{j|n}\mu(j)j^d\sum_{i=1}^{\frac{n}{j}}i^d$ 那么最后面这个东西就是个自然数幂求和了 在这篇关于斯特林数的