欧拉筛(线性筛)& 欧拉函数
来源:互联网 发布:猴子吃桃问题c语言 编辑:程序博客网 时间:2024/06/05 09:23
今天又复习了一下欧拉筛法,在这做个笔记。
欧拉筛(线性筛)
一般情况下,有一种筛法叫埃什么什么的。是
原理
这可能原理有点妙啊。
- 设
pr[i] 为i最小质因子,然后从2开始计算 - 如果
pr[i] 没有在前面得到,就说明i是质数,所以pr[i]=i,prime[++len]=i 。 - 对于i,枚举每一个不超过
pr[i] 的质数prime[j] ,所以pr[i∗prime[j]]=prime[j]
这样可以发现,每一个数只会被它最小的质因子筛去,所以保证了算法为
我们见一下代码:
代码
void find_prime(int n){ memset(isprime,0,sizeof(isprime)); sp = 0; for(int i = 2;i <= n;i++) { if(!isprime[i]) { prime[++sp] = i; isprime[i] = i; } for(int j = 1;j <= sp && i * prime[j] <= n;j++) { isprime[i*prime[j]] = prime[j]; if(prime[j] >= isprime[i]) break;//用isprime[i]来表示i的最小质因子,可能用mod比较慢 } }}
在break那一行,有的人会用
if(i % prime[j]==0) break;
不过也可以通过isprime[i]保存i最小的质因子来与prime[j]做比较。
但不管怎么写,我人认为最重要的就是含break的那个语句
欧拉函数
不过,仅仅筛素数就显得线性筛不是那么必要。
线性筛最科学的战场——求积性函数
作为蒟蒻,我以欧拉函数来举例:
代码
先粗浅地看一下代码
void find_prime(int n){ memset(isprime,0,sizeof(isprime)); sp = 0; for(int i = 2;i <= n;i++) { if(!isprime[i]) { prime[++sp] = i; isprime[i] = i; phi[i] = i-1;//① } for(int j = 1;j <= sp && i * prime[j] <= n;j++) { isprime[i*prime[j]] = prime[j]; if(prime[j] >= isprime[i]) { phi[i*prime[j]] = phi[i]*prime[j];//② break; } phi[i*prime[j]] = phi[i]*(prime[j]-1);//③ } }}
原理
- 每个数字只会被筛到一次
- 当正整数p为素数时,
phi[p]=p−1 - 欧拉函数既然是积性函数,就说明当a与b互质时,满足
phi(a∗b)=phi(a)∗phi(b) - 当p为素数时,
phi(pk)=(p−1)∗pk−1 - 我们保证了每次的
prime[j] 小于等于i的最小质因子,所以当prime[j]<isprime[i] 时,phi[i∗prime[i]]=phi[i]∗phi[j]=phi[i]∗(j−1) ,而在i%prime[j]==0时,直接乘上prim[j] 。
上述的五点:1表明每个数值被算一次。2解释了①。3、4、5解释了②和③。
结
还有,本文参考:http://www.cnblogs.com/zhuohan123/p/3233011.html
1 0
- 欧拉筛(线性筛)& 欧拉函数
- 欧拉筛——线性筛素数和欧拉函数
- 欧拉线性筛质数(线性)
- BZOJ-2190 仪仗队 数论+欧拉函数(线性筛)
- 欧拉函数的求法(线性筛法?)
- 欧拉函数的求法(线性筛)
- NKOJ 3800 分解质因数(欧拉函数+线性筛)
- 欧拉函数线性筛法详解
- 欧拉函数 线性筛法
- bzoj 2190 欧拉函数线性筛
- [笔记]: 欧拉函数线性筛法
- 线性筛素数and欧拉函数
- 线性筛法与欧拉函数
- 【欧拉函数+线性筛】bzoj2818: Gcd
- bzoj2190 仪仗队【欧拉函数+线性筛】
- 线性筛选欧拉函数
- 欧拉线性筛
- 线性求区间欧拉函数(顺便线性求区间内所有素数)(类似欧拉线性素数筛)
- Ubuntu使用apt-file解决库或者文件缺失依赖
- 关于电脑的发热问题解决方法
- Codeforces Round #228 (Div. 1) A. Fox and Box Accumulation 贪心
- 表单禁用多种操作示例
- 《深入理解 Java 虚拟机》- 笔记
- 欧拉筛(线性筛)& 欧拉函数
- No.2_1 FreeImage——旋转图像
- 字符串处理函数
- BST二叉排序树,AVL平衡二叉树,RBT红黑树,B-树,B+树,B*树
- (转)RGB颜色对照表
- Examples of Hough Transfer and FFT(MATLAB)
- 97. 二叉排序树
- netcat 应用
- Android记录官方文档系列(4):Intent