【问题标题】:How to reduce space to generate primes upto 10^16 using in Sieve of Eratosthenes?如何使用埃拉托色尼筛法减少空间以生成高达 10^16 的素数?
【发布时间】:2016-08-29 17:38:57
【问题描述】:

我已经在 C++ 中实现了 Eratosthenes 的 Sieve,但是输入大于 10^10 时代码会崩溃。编译器显示信号 11(SIGSEV)。这是因为全局数组 bool a[5000000000000000];。要检查高达 10^16 的奇数,我将数组大小设为 (10^16)/2 = 5 * 10^15。如何减少空间? 这个问题有一个答案How do i reduce the space complexity in Sieve of Eratosthenes to generate prime between a and 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;

}

【问题讨论】:

  • vector&lt;bool&gt; 可以以这样一种方式实现,即您可以获得令人难以置信的大小,但会以性能为代价来打包和解包位。配置文件以查看它是否适合您。
  • 我想看看能在堆栈或任何地方分配这么多内存的计算机。
  • 伙计们,他把它作为一个全局的,所以除非你正在处理一个真正的 strange 实现,否则它永远不会在堆栈上。
  • 我想到了在 c++ 中使用std:bitset。它肯定会减少空间。试试看怎么样?
  • Google 告诉我存储 bool 数组需要 5 PB。唔。更好地减少问题规模..

标签: c++ sieve-of-eratosthenes


【解决方案1】:

您不能在任何不是超级计算机的计算机上分配这么多内存空间。如果您只想在给定范围内生成素数 {say,(a,b) where a sqrt(10^16 ) 然后申请 Segmented Sieve

使用分段筛的好处是:

  • 降低时间复杂度
  • 无需浪费宝贵的内存。您可以用更少的空间轻松生成小范围的素数

【讨论】:

  • 即使在超级计算机上,您也可能无法分配那么多内存。如今,大多数超级计算机都是集群,每个节点都有自己的内存。有可能创建一块那么大的虚拟内存,但据我所知,这并不常见。
【解决方案2】:

即使您对每个奇数使用单个位,也需要 6.25e14 = 625 TB 来存储它。你可以通过将一些大的磁盘阵列映射到内存来做到这一点,或者使用超级计算机的 RAM……但除非你有这样的硬件,否则我认为你不能使用常规的 Eratosthenes 筛子来处理这么大的数字。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-21
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 2011-12-16
    • 2017-11-14
    相关资源
    最近更新 更多