线性筛法求质数(素数)表及其原理
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
而同时假设合数a=质数b×质数c×一个数d
令e=c×d,假设b≥e,e为合数,令f=d×b
a=f×c ,其中c<e;
即比一个合数数大的质数和该合数的乘积可用一个更大的合数和比其小的质数相乘得到
这也是if(!(i% prime[j]))break;的含义,这也是线性筛法算质数表的关键所在
线性筛法求质数(素数)表及其原理
代码(c++):
#include<iostream>
using namespace std;
const long n=200000;
lo源自文库g prime[n]={0},num_prime=0;
intmain()
{
inta[n]={1,1},i,j;
for(i=2;i<n;i++)
{
if(!a[i])
prime[num_prime++]=i;
for(j=0;j<num_prime&&i*prime[j]<n;j++)
{
a[i*prime[j]]=1;
if(!(i%prime[j]))
break;
}
}
return 0;
}
线性筛法,即是筛选掉所有合数,留下质数
我们知道合数可以由一个质数数与另一个数相乘得到
令e=c×d,假设b≥e,e为合数,令f=d×b
a=f×c ,其中c<e;
即比一个合数数大的质数和该合数的乘积可用一个更大的合数和比其小的质数相乘得到
这也是if(!(i% prime[j]))break;的含义,这也是线性筛法算质数表的关键所在
线性筛法求质数(素数)表及其原理
代码(c++):
#include<iostream>
using namespace std;
const long n=200000;
lo源自文库g prime[n]={0},num_prime=0;
intmain()
{
inta[n]={1,1},i,j;
for(i=2;i<n;i++)
{
if(!a[i])
prime[num_prime++]=i;
for(j=0;j<num_prime&&i*prime[j]<n;j++)
{
a[i*prime[j]]=1;
if(!(i%prime[j]))
break;
}
}
return 0;
}
线性筛法,即是筛选掉所有合数,留下质数
我们知道合数可以由一个质数数与另一个数相乘得到