线性筛法 与 线性求欧拉函数 的计算模板
来源:互联网 发布:绿色优化手机软件 编辑:程序博客网 时间:2024/05/16 06:41
简介
懂得如何快速计算质数是十分重要的
在筛法的基础上,我们可以使用更为高级的线性筛法!
顾名思义,就是时间复杂度是线性的,即
O(N) ,N 为所求的质数范围而对编程有所接触的人,应该都知道欧拉函数 即
φ(N) 听起来高大上,其实就表示 小于等于 N 的数中与 N 互质的数的数目
这在竞赛中用处很大,变式也很多—— ~不明觉厉~
那么如何在 线性时间 内求出
1—N 中的 质数表 和 欧拉函数表 呢?下面给出两个算法的模板——
线性筛法
这个算法的本质就是在筛法的基础上,加上一个不再重复筛的退出语句
模板如下:
for(int i=2;i<=N;i++){ if(!bz[i]) f[++f[0]]=i; for(int j=1;j<=f[0] && i*f[j]<=N;j++) { bz[i*f[j]]=true; if(i%f[j]==0) break;//极大优化! }}
- 注释:标志数组为
bz[N] , 质数表为f[N] 。
线性求欧拉函数
这个算法的本质就是在筛法的基础上,根据欧拉函数的积性性质来处理
模板如下:
for(int i=2;i<=N;i++){ if(!bz[i]) phi[f[++f[0]]=i]=i-1; for(int j=1;j<=f[0] && i*f[j]<=N;j++) { bz[i*f[j]]=true; if(i%f[j]==0)//同样的极大优化! { phi[i*f[j]]=phi[i]*f[j]; break; }else phi[i*f[j]]=phi[i]*(f[j]-1);//欧拉函数的积性性质 }}
- 注释:标志数组为
bz[N] , 质数表为f[N] , 欧拉函数表为phi[N] 。
总结
这两个算法有两个优点:
短小精悍
复杂度线性,
O(N) 处理
所以在以后的学习中,应熟练掌握这两种算法!
1 0
- 线性筛法 与 线性求欧拉函数 的计算模板
- 线性筛法+求欧拉函数
- 模板整理:数论---线性筛素数,线性筛欧拉函数
- 线性筛μ的模板
- 线性筛法与欧拉函数
- 线性筛法与积性函数
- 线性素数筛法模板
- 欧拉函数 素数线性筛法模板
- 素数线性筛模板与证明
- 线性筛素数模板
- 线性筛模板
- 线性筛模板
- 线性筛模板
- 线性素数筛模板
- 【模板】线性筛素数
- [模板]线性筛素数
- 【模板】线性筛素数
- luogu3383 线性筛模板
- 去除代码中的注释(二) 实现 上
- AJAX跨域解决方案—创建script标签
- Oracle数据库之过滤和排序
- 从CI到CD,使用Docker技术实现每日十次发布,来自麻袋理财首席架构师王天青的分享
- Google Gson 简介
- 线性筛法 与 线性求欧拉函数 的计算模板
- ubuntu系统下matplotlib中文乱码问题
- Eclipse中使用复制粘贴功能非常卡的解决办法
- MyEclipse中.classpath.project.mymetadata
- 王朝 电子词典163-1烟台大学
- 设计模式
- Google Guice 依赖注入方式--2
- 关于Vue生命周期的一些理解记录
- 微信热补丁解决方案Tinker初探(一)