{算法}乱谈线性筛法
来源:互联网 发布:淘宝上卖美女图片 编辑:程序博客网 时间:2024/05/18 02:05
Concept
指在线性时间
伪目录
1. 求质数表
2. 筛出欧拉函数φ
Ideas
As we all know,
其中
我们还可以通过乘法定理得知,
当然,这是后话了
For prime Numbers table
最简单的,我们使用线性筛法筛质数表
先来看看普通的筛法
fillchar(x,sizeof(x),true);//假设所有数都是质数(Tips x[1]=false)for i:=2 to n doif x[i] then //x[i]表示i是否为质数 for j:=2 to n div i do x[i*j]:=false; //筛掉i*j(非质数)
显然复杂度为
我们发现,有的数字被筛了多次,如24
当然最好的情况是每个数字只被筛1次
看Code之间,先回忆一句话
使每个数字只被筛1次
也许我们需要换个思路(线性筛法)
那线性筛法又是如何做到使每个数字只被筛1次的呢?
这就是我们所需要证明的
Code
fillchar(bz,sizeof(bz),true);for i:=2 to n do//枚举数ibegin if(bz[i])then//i为素数 begin inc(tot); s[tot]:=i;//素数数组 end; for j:=1 to tot do begin bz[i*s[j]]:=false;//筛去i*s[j] if(i mod s[j]=0)then break;//什么鬼?怎么就Break了? end;end;
相信都对if(i mod s[j]=0)then break;
一脸懵逼吧~
这也正是线性筛法的神奇所在
好了不说废话
用上
∵ 为使令循环break掉的就是p1 (最小的素数)
∴ 不能让x被pl(l>1)筛掉
设x=p1∗a=pl∗b
pl∗b=∏ni=1piai∗b
=(u∗p2∗p3∗...∗pm−1∗pm)∗p1
=a∗p1
显然a<b
至于某些人问会不会筛掉质数……
我推荐给你一个小学奥数班!
筛出欧拉函数φ
读作φ(fai)
φ(n)为小于n并与n互质的数的个数,是积性函数
即
另
性质
如果x为素数,那么φ(x)=x−1
小于x 的数不都与x 互质吗?如果x为素数,那么φ(xk)=xk−xkx=xk−1(x−1)
显然只有x 的倍数才不互质xk φ(x)=∏kj=1φ(pjaj) φ(x) 为积性函数
于是乎~
设
由性质2得
Code
恕暂不提供Pascal语言
int prime[M/3],phi[M]; bool flag[M]; void get_prime() { int i,j,k; memset(flag,false,sizeof(flag)); k=0; for(i=2;i<M;i++){ if(!flag[i]){ prime[k++]=i; phi[i]=i-1; } for(j=0;j<k&&i*prime[j]<M;j++){ flag[i*prime[j]]=true; if(i%prime[j]==0){ phi[i*prime[j]]=phi[i]*prime[j]; break; } else phi[i*prime[j]]=phi[i]*(prime[j]-1); } } }
Reference
线性筛法求素数的原理与实现 百度文库
约数详细分析By ColdChair
线性筛法相关By jokerwyt
线性筛法求素数By XianHaoMing
- {算法}乱谈线性筛法
- 乱序算法
- 乱序字符串算法
- 乱谈
- 线性筛之一般算法
- 算法 线性排序-区间法
- 简单的乱序算法
- 乱序数组的算法
- 洗牌算法:数组乱序
- 集合乱序算法shuffle
- 【算法题】洗牌算法(乱序)
- 【分治法】线性时间选择算法
- 哈希表的线性探查法搜索算法
- 线性表的简单操作 置乱 测序
- 面试乱谈
- java乱码乱谈
- 乱谈权限管理
- 设计乱谈
- 分配问题(费用流 or KM算法)
- 基于C++的简单的FSM实现
- Java 多线程编程之六:线程之间的通信(附源代码)
- 作业补做4
- bzoj2769 YY的快速排序
- {算法}乱谈线性筛法
- 课程作业
- eventbus使用简例
- 第二个接口(TransactionDefinition)
- 游泳池造价问题
- 继承
- android内容提供者
- hdu 1078 FatMouse and Cheese(记忆化搜索)
- Java 多线程编程之五:一个理解 wait() 与 notify() 的例子