如何利用埃拉托色尼筛法减少空间以生成10^16以内的质数
How to reduce space to generate primes upto 10^16 using in Sieve of Eratosthenes?
我已经在c++中实现了eatosthenes的Sieve,但是当输入大于10^10时代码会崩溃。编译器显示信号11(SIGSEV)。这是因为全局数组bool a[5000000000000000];
.为了检查奇数到10^16,我将数组大小设为(10^16)/2 = 5 * 10^15。如何减少空间?这个问题有一个答案如何在埃拉托色尼筛子中降低空间复杂度来生成a和b之间的素数?我尝试了,但是我的程序崩溃了。谁能提供实现细节来修复它?
#include <bits/stdc++.h>
using namespace std;
long long unsigned n,sqN;
bool a[5000000000000000];
long long int sieve_of_Eratosthenes();
int main()
{
cout<<"Enter upper bound to generate prime upto:"<<endl;
cin>>n;
long long int count = sieve_of_Eratosthenes();
cout<<"Total = "<<count<<endl;
return 0;
}
long long int sieve_of_Eratosthenes()
{
long long unsigned i,j,count = 0;
sqN = (long long unsigned) sqrt(n);
for(i=3; i<=sqN; i+=2)
{
if(a[i/2]==true)
{
continue;
}
for(j = i*i; j<=n; j+=(2*i))
{
a[j/2] = true;
}
}
if(n>=2)
{
count++;
cout<<2<<endl;
}
for(i=3; i<=n; i+=2)
{
if(a[i/2]==false)
{
cout<<i<<endl;
count++;
}
}
return count;
}
除了超级计算机之外,你不能在任何计算机上分配这么多的内存空间。如果你只想在给定的范围内生成质数{比如说,(a,b),其中a <= b <= 10^16},你可以简单地使用Erathosthenes的Sieve来存储质数到sqrt(10^16),然后应用分段筛。
使用分段筛的好处是:
- 降低时间复杂度 不需要浪费宝贵的内存。你可以很容易地用更少的空间为小范围生成质数
即使每个奇数使用一个比特,也需要6.25e14 = 625 tb来存储它。你可以将一些大的磁盘阵列映射到内存,或者使用超级计算机的RAM……但除非你有这样的硬件,我认为你不能使用埃拉托色尼的常规筛子来计算这么大的数字。
相关文章:
- 内存错误低于在C++年实现埃拉托色尼筛分时的预期
- 列出埃拉托色尼的筛子
- 埃拉托色尼的筛子在一段上
- 筛子的埃拉托色尼错误实现
- 为什么我的埃拉托色尼代码筛子无限循环.我已经用几个数字进行了测试
- 如何使用埃拉托斯特内斯筛算法改进素数程序
- 优化埃拉托色尼筛
- 需要帮助在 c++ 中优化埃拉托色尼筛
- 埃拉托色尼筛,用于大数 c++
- 埃拉托色尼筛C++
- 使用二维阵列用C++求解埃拉托色尼筛
- 埃拉托申斯孢子虫Prime1 C++的分段筛
- 分割如何提高埃拉托斯尼筛的运行时间
- 并行化埃拉托色尼筛 用于查找素数的算法
- 埃拉托色尼执行筛
- 当m和n在10^10范围内相当大时,使用埃拉托色尼筛法打印m和n之间的素数
- 埃拉托斯梯尼筛-质因子
- 如何利用埃拉托色尼筛法减少空间以生成10^16以内的质数
- 链表 - C++埃拉托色尼筛发现 3 个素数太多
- 埃拉托色尼筛 删除列表元素