线性筛法原理及素数表

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

线性筛法,即是筛选掉所有合数,留下质数
我们知道合数可以由一个质数数与另一个数相乘得到
而同时假设合数a=质数b×质数c×一个数d
令e=c × d,假设b ≥ e,e为合数,令f=d × b
a=f × c ,其中c
即比一个合数数大的质数和该合数的乘积可用一个更大的合数和比其小的质数相乘得到
这也是if(!( i % prime[j]))break;的含义,这也是线性筛法算质数表的关键所在
原理:
1. 任何一个合数都可以表示成一个质数和一个数的乘积
2. 假设A是一个合数,且A = x * y,这里x也是一个合数,那么有:
A = x * y; (假设y质数,x合数)
x = a * b; (假设a是质数,且a < x)
-> A = a * b * y = a * Z (Z = b * y)
即一个合数(x)与一个质数(y)的乘积可以表示成一个更大的合数(Z)与一个更小的质数(a)的乘积
这也是理解代码中if(i%primes[j] == 0)break;的关键
例如: 如果i = 8; 那么由于i%2 == 0; 因此对于i=8就只需要检查primes[1]即可,因为对于大于primes[1]的质数,像3,有:
8*3 = 2*4*3 = 12*2
也就是说24(8*3=24)并不需要在8时检查,在12时才检查
1#include<iostream>
2using namespace std;
3
4const int MAX=100;
5bool isPrime[MAX+1];
6int total;//计数
7int prime[MAX+1];
8
9//线性筛法寻找素数
10void makePrime()
11{
12memset(isPrime,true,sizeof(isPrime));
13memset(prime,0,sizeof(prime));
14for(int i=2;i<=MAX;i++)
15{
16if(isPrime[i]) prime[total++]=i;
17for(int j=0; j<total&&i*prime[j]<=MAX; j++)
18{
19isPrime[i*prime[j]]=false;
20//i此时不是素数,只是拓展用
21if(i%prime[j]==0)break; 22}
23}
24}
25
26int main()
27{
28makePrime();
29for(int i=0;i<total;i++)
30{
31cout<<prime[i]<<"";
32if((i+1)%10==0) cout<<endl; 33}
34return0;
35}。

相关文档
最新文档