读贾志鹏《线性筛法与积性函数》笔记

1.欧拉筛法在线性时间内求素数以及欧拉函数

代码:

 1 procedure get;
 2  var i,j,k:longint;
 3  begin
 4  tot:=0;
 5  fillchar(check,sizeof(check),false);
 6  for i:=2 to n do
 7   begin
 8   if not(check[i]) then
 9    begin
10     inc(tot);
11     p[tot]:=i;
12     fai[i]:=i-1;
13    end;
14   for j:=1 to tot do
15    begin
16     k:=i*p[j];
17     if k>n then break;
18     check[k]:=true;
19     if i mod p[j]=0 then
20      begin
21       fai[k]:=fai[i]*p[j];
22       break;
23      end
24     else
25       fai[k]:=fai[i]*(p[j]-1);
26    end;
27  end;
28 end;

其主要优越性在于:每个合数只被筛了一次,而且是被它的最小素因子筛掉的。

证明如下:

设合数n最小的质因数为p,它的另一个大于p的质因数为p′ ,令
n = pm = p′ m′ 。观察上面的程序片段,可以发现j循环到质因数p
时合数n第一次被标记(若循环到p 之前已经跳出循环,说明n 有
更小的质因数),若也被p′标记,则是在这之前(因为m′ < m)
,考虑i循环到m′ ,注意到n = pm = p′ m′ 且p, p′为不同的质数,因
此p|m′,所以当j循环到质数p后结束,不会循环到p′,这就说明不
会被p′ 筛去。

2.sigma(φ(d),d I n)=n

这也是可以证明的,这里略去(不会上传图片),其实这个结论正是noi2002 robot 1题中的关键思路

3.当n > 1时, 1 ... n中与n互质的整数和为n*φ (n) div 2

这个可以这样考虑,假如x与n互质,那么n-x也一定与n互质,所以φ(n)肯定是个偶数,将这φ(n)

两两配对,即得结论

4.若f (n) 为积性函数,则函数g n = sigma(f(d),d|n)也是积性函数,反之亦然。

莫比乌斯反演的基本形式就是:

g(n) = sigma(d|n, f(d))
f(n) = sigma(d|n, μ(n/d) * g(d))

还有另外一个形式是:

g(n) = sigma(d|n, f(d))
f(n) = sigma(n|d, μ(n) * g(n/d))

5.莫比乌斯函数

无平方数因数,且
有大于的平方数因子

6.

莫比乌斯函数是一个积性函数

其他状况

狄利克雷卷积的方法表示,则是 ,其中是狄利克雷卷积的单位元,这是默比乌斯反转公式的原理。

这是可以证明的:

当n》1时,考虑n的标准分解式有k项

根据莫比乌斯函数的取值,考虑分类求左边的值,则

左边=0+1+((1-1)的k次方)-1=0

我解释一下:

(1).0是当d含有了大于1的平方数因子时,总和为0

(2).1是当d=1时,和为1

(3).这个比较巧妙,剩下的应该是莫比乌斯函数取值中的第二种情况了

实际上,(1-1)的k次方是一个组合的过程

假设我们对n的k个素因子进行选择,一共要选择k次

如果选,那么代表的它的莫比乌斯函数要变成原来的相反数,所以有个-1

如果不选,那么让它乘上个-1,保持不变

也就是说,当你把这个式子展开以后,每一项都有它的实际意义

比如(-1)*(1)*(-1)*(-1)=-1代表n有4个素因子,我进行了4次选择,选了第1,3,4个素因子,没选第二个,所以莫比乌斯函数值为-1

这样拆开的每一项除了1都代表着一个因子的莫比乌斯函数值,所以最后要减1

而我们又可以很明显的看出(1-1)的k次方=0

实际上,在robot一题中我已静经讲过这种方法的原理了

所以,命题得证

Q.E.D

7.线性时间求解莫比乌斯函数

代码:

 1 procedure get;
 2  var i,j,k:longint;
 3      check:array[0..maxn] of boolean;
 4  begin
 5  fillchar(check,sizeof(check),false);
 6  tot:=0;mu[1]:=1;
 7  for i:=2 to maxn do
 8   begin
 9    if not(check[i]) then begin inc(tot);p[tot]:=i;mu[i]:=-1;end;
10    for j:=1 to tot do
11     begin
12      k:=i*p[j];
13      if k>maxn then break;
14      check[k]:=true;
15      if i mod p[j]<>0 then mu[k]:=-mu[i]
16      else begin mu[k]:=0;break;end;
17     end;
18    end;
19  end;                               

实际上,莫比乌斯反演的应用有很多,证明过程也很精彩,但由于不能上传图片,我就不发上来了

读贾志鹏《线性筛法与积性函数》笔记,布布扣,bubuko.com

时间: 2024-10-13 12:37:11

读贾志鹏《线性筛法与积性函数》笔记的相关文章

读贾志鹏线性筛有感

先拜大牛.感谢贾志鹏严谨的思维.以及简单清晰的论文描述. 一定要结合论文看.我只是提出我觉得关键的部分.论文在网上随处可见.贾志鹏线性筛. 开头两种线性筛的比较. 一种是传统的线性筛.时间复杂度为N*log(log(N)). 另外一种是优化了合数的筛法.文中称作Euler线性筛. 其优化的地方. 举个例子:合数6. 是2的倍数也是3的倍数. 当你用传统的筛法的时候在遍历2的倍数的时候会遍历到6.遍历3的倍数的时候同样也会遍历到6. 而另外一种只会筛出6为2的倍数.3就不会筛6了. 另外个人认为筛

数论 - 线性筛法与积性函数

首先以求1000000以内的素数为例来探讨筛法 Eratosthenes筛法(埃拉托斯特尼筛法) 时间复杂度:O(N*loglogN) 空间复杂度:O(N) 代码: #include <map> #include <set> #include <list> #include <cmath> #include <deque> #include <queue> #include <stack> #include <bit

线性筛与积性函数

线性筛 最初,线性筛只是用来筛质数罢了... void sieve(int n) { static int v[N], p[N], pr; // v[i] 表示 i 的最小质因子 // p[N] 和 pr 用来存质数表 for (int i = 2; i <= n; ++i) { if (v[i] == 0) v[i] = i, p[++pr] = i; // 没被筛,是质数 for (int j = 1; j <= pr && i*p[j] <= n; ++j) { v

积性函数筛法

积性函数筛法 很多常用的数论函数都是积性函数,而在题目中,我们常常需要线性(甚至更高)的筛法. 对于积性函数,我们可以在筛素数的基础上稍加修改,即可完成线性筛. 首先,注意到积性函数的特点: \[ f(xy)=f(x)\times f(y) \] 而可以线性筛的积性函数,需要知道以下两个式子的快速求法: \[ f(p)=?\quad f(p^k)=?\\p\in prime \] 其中, \(f(p)\) 大多是直接定义,\(f(p^k)\) 大多是递归定义. 我们来回忆一下素数筛的过程: in

常用积性函数的线性筛法整理

简单整理推导加代码,留复习用. 线性筛素数 最简单也最基础,直接看代码就好了\(--\) code: void Euler_Phi_Prime(int n) { is_prime[1] = true; for (int i = 2; i <= n; i++) { if (!is_prime[i]) prime[++cnt] = i; for (int j = 1; j <= cnt && i * prime[j] <= n; j++) { is_prime[i * pri

线性筛及其扩展-积性函数

线性筛 埃氏筛 对于每个数x,枚举其倍数,将kx筛去. 在埃氏筛过程中,每个数都会被筛掉多次,且对于每个数x,枚举其倍数的次数为\(\frac{n}{x}\) 故埃氏筛的时间复杂度为\(\sum_{i=1}^{n}\)\(\frac{n}{i}\)=n\(\sum_{i=1}^{n}\)\(\frac{1}{i}\)=\(n ln(n)\) 欧拉筛 在埃氏筛中,每个数会被筛掉多次,想要进一步下降复杂度,我们要求每个数只会被筛一次. 要想将多种筛去x的方法固定(唯一).我们就要采用一种方法-"最小

积性函数,线性筛入门 HDU - 2879

HDU - 2879HeHe 题意:He[N]为[0,N−1]范围内有多少个数满足式子x2≡x (mod N),求HeHe[N]=He[1]×……×He[N] 我是通过打表发现的he[x]=2k,k为x是质因子个数,不过这是可以通过积性函数证明的. 关于积性函数的定义: 对于正整数n的一个算术函数 f(n),若f(1)=1,且当a,b互质时,f(ab)=f(a)f(b),在数论上就称它为积性函数.若对于某积性函数 f(n) ,就算a, b不互质,也有f(ab)=f(a)f(b),则称它为完全积性

积性函数求和:筛法DP、洲阁筛

如果定义在正整数集上的函数 $f(n)$ 满足对于任意一对互素正整数 $n, m$ 都有 $f(n)f(m)=f(nm)$, 那么 $f$ 就叫做积性函数. 积性函数又可以表示为,假设 $n$ 的素因子分解式为 $n=\prod_{i=1}^mp_i^{c_i}$, 那么 $f(n)=\prod_{i=1}^mg(p_i, c_i)$. 本文讨论的函数满足:$g(p, c)$ 能够快速求单点值,且 $g(x, 1)$ 是关于 $x$ 的低次多项式. 积性函数求和,就是要求出 $\sum_{n=1

bzoj 2693: jzptab 线性筛积性函数

2693: jzptab Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 444  Solved: 174[Submit][Status][Discuss] Description Input 一个正整数T表示数据组数 接下来T行 每行两个正整数 表示N.M Output T行 每行一个整数 表示第i组数据的结果 Sample Input 1 4 5 Sample Output 122 HINT T <= 10000 N, M<=10000000