zoukankan      html  css  js  c++  java
  • 狄利克雷卷积和莫比乌斯反演学习笔记

    我太菜了,口嗨的题也嗨不了,赶紧学一发。

    记一波笔记,免得忘力。

    什么是狄利克雷卷积?

    卷积是函数与函数之间的运算。

    两个数论函数的狄利克雷卷积是一个新函数

    两个数论函数的狄利克雷卷积一般写成 (f*g),读作 (f)(g)

    狄利克雷卷积的定义式如下:(不懂建议手动模拟^^)

    [f*g(n)=sumlimits_{d|n}f(d)g(frac{n}{d}) ]

    狄利克雷卷积满足交换律,结合律,分配律,柿子懒得打了,自己理解。

    积性函数

    (f) 是数论函数,若对任意互质的正整数 (a,b),都有 (f(ab)=f(a)f(b)),则称 (f) 是积性函数。

    若对任意的正整数 (a,b),都有 (f(ab)=f(a)f(b)),则称 (f) 是完全积性函数。

    我寻思着这玩意不是应该高中whk考试里边都有吗。。。

    得先介绍几个函数,作为前置芝士。

    完全积性函数

    单位函数:(epsilon(x) = [x = 1])

    这个有什么用?这是单位元,任何函数卷单位元都等于它本身(不懂手膜^^)。

    恒等函数:(I(x) = 1)

    单位函数:(mathrm{id}(x) = x)

    非完全积性函数

    重点来力!

    (mu(x)) 莫比乌斯函数

    定义:

    [mu(x) = egin{cases} 1 & , x = 1 \ (-1) ^ k & , x = prodlimits_{i = 1} ^ k p_i \ 0 & , Otherwise end{cases} ]

    性质:(sumlimits_{d|n} mu(d) = [n = 1])

    有一个关系:

    [μ∗1=ϵ ]

    它可以用来满足莫比乌斯反演的推理过程,看到后面就知道了。

    莫比乌斯反演

    现有关系:

    [F(n)=sumlimits_{d|n}f(d) ]

    [F=f*1 ]

    则有:

    [f(n)=F*mu=sumlimits_{d|n}mu(frac{n}{d})f(d)=sumlimits_{d|n}mu(d)f(frac{n}{d}) ]

    是不是用到了上面的那个 (3) 式?但如何理解上面这个柿子?我一开始脑残了,其实它就是换了一下约数的枚举顺序,所以在这里 (d)(frac {n}{d})

    是等效的。

    如何筛 $mu $?方法和线性筛大同小异。

    直接给代码,应该比较好懂。

    void mobius() {
    	v[1] = 1;
    	miu[1] = 1;
    	for (int i = 2; i < N; i++) {
    		if(!v[i]) {
    			v[i] = i;
    			p[++cnt] = i;
    			miu[i] = -1;
    		}
    		for (int j = 1; j <= cnt; j++) {
    			if(p[j] * i > N) break;
    			miu[p[j] * i] = i % p[j] == 0 ? 0 : -miu[i];
    			v[i * p[j]] = 1;
    			if(i % p[j] == 0) break;
    		}
    	}
    }
    

    技巧:

    [[gcd(i,j)=1]=sum_{d|gcd(i,j)}mu(d) ]

    证明:

    (mu * 1=epsilon)

    (sum_{d|n}mu(d)=[n=1])

    (n) 替换成 (gcd(i,j)) 即可。

    (d|gcd(x,y)) (leftrightarrow) (d|x)(d|y),可以枚举倍数来求。

    常见反演:

    [f(d)=sum_{i=1}^{n}sum_{j=1}^{m}[gcd(i,j)=d]。 ]

    则有:

    [egin{align} F(x)&=sum_{x|d}f(d)\ &=sum_{x|d}sum_{i=1}^{n}sum_{j=1}^{m}[gcd(i,j)=d]\ &=sum_{x|d}sum_{i=1}^{n}sum_{j=1}^{m}[x|i,x|j]\ &=lfloor frac{n}{x} floor lfloor frac{m}{x} floor end{align} ]

    于是 (F) 是个可以 (O(1)) 计算的玩意了。

    再反演一下,利用分块就可以做题力^^。

    (varphi)(mu) 的关系:

    [egin{align} &Id=varphi *1\ &Id*mu =varphi\ &varphi(n)=sum_{d|n}mu(d)frac{n}{d}\ &frac{varphi(n)}{n}=sum_{d|n}frac{mu(d)}{d} end{align} ]

    如果 (d(n))(n) 的约数个数,则有关于 (d(n)) 的一个挺好用的结论:

    [d(nm)=sum_{i|n}sum_{j|m}[gcd(i,j)==1] ]

    证明:

    (nm=prod p_i^{x_i})(n=prod p_i^{y_i}),则有 (m=prod p_i^{x_i-y_i})

    [i = p_1^{a_1}cdot p_2^{a_2}cdot p_3^{a_3}cdots p_k^{a_k},j = p_1^{b_1}cdot p_2^{b_2}cdot p_3^{b_3}cdots p_k^{b_k} ]

    先看第一项。要使 (gcd(i,j)==1),则要么 (a_1)(0),要么 (b_1)(0)。若 (a_1=0),则 (b_1)(x_1-y_1+1) 种取值,若 (b_1=0),则 (a_1)(y_1+1) 种取值,(a_1=b_1=0) 的情况重复了,所以一共有 (x_1+1) 种取值。但其实这对于任意的 (i) 也是如此。

    所以满足条件的 (i, j) 对数为 (prod(x_i + 1))。这与约数定理给出的形式一致,就得证了。

    Orz sengxian 写的是真清楚。

    话说写东西怎么这么麻烦啊艹,不写了,累死了。

  • 相关阅读:
    面试题来积累自己
    基于php基础语言编写的小程序之计算器
    配置apache的虚拟机+软件下载
    执行表空间使用率SQL突然变慢问题分析
    DM-建库选项-字符串比较大小写敏感-测试
    OGG再次遇到虚拟列无法处理,导致进程abend二
    OGG应用进程abend报错无法insert虚拟列
    Oracle Asm Failgroup测试学习
    OGG复制进程报错,存在update set 主键列 is null
    测试:OGG初始化同步表,源端抽取进程scn<源端事务的start_scn时,这个变化是否会同步到目标库中?
  • 原文地址:https://www.cnblogs.com/11haonb/p/11746958.html
Copyright © 2011-2022 走看看