Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 求素数的快速算法?_Algorithm_Performance_Primes_Sieve Of Eratosthenes - Fatal编程技术网

Algorithm 求素数的快速算法?

Algorithm 求素数的快速算法?,algorithm,performance,primes,sieve-of-eratosthenes,Algorithm,Performance,Primes,Sieve Of Eratosthenes,首先,我在这个论坛上查了很多东西,但我还没有找到足够快的东西。 我尝试创建一个函数,返回指定范围内的素数。 例如,我使用Eratosthenes的筛子(用C#)实现了这个函数。我也尝试了Atkin的筛,但Eratosthenes筛运行得更快(在我的实现中): publicstaticvoidsetprimessive(int范围) { 素数=新列表(); 添加(2); 半整数=(范围-1)>>1; BitArray Nums=新的BitArray(一半,false); intsqrt=(int)

首先,我在这个论坛上查了很多东西,但我还没有找到足够快的东西。 我尝试创建一个函数,返回指定范围内的素数。 例如,我使用Eratosthenes的筛子(用C#)实现了这个函数。我也尝试了Atkin的筛,但Eratosthenes筛运行得更快(在我的实现中):

publicstaticvoidsetprimessive(int范围)
{
素数=新列表();
添加(2);
半整数=(范围-1)>>1;
BitArray Nums=新的BitArray(一半,false);
intsqrt=(int)Math.Sqrt(Range);
对于(int i=3,j;i>1)-1;j1)-1]);
}
对于(int i=0;iPrimes.Add((uint)(i在搜索有关此主题的算法(针对project Euler)时,我不记得找到了更快的算法。如果速度真的是个问题,您是否考虑过只存储Primes以便只需查找它

编辑:快速谷歌搜索发现,确认最快的方法将只是页面的结果,并根据需要查找

再编辑一次-你可能会发现更多的信息,基本上是这个主题的复制品。上面的帖子说,阿特金的筛子比ERA的更快,因为它可以动态生成评论。

  • 为了提高速度,先进行预计算,然后从磁盘加载。速度非常快。我很久以前就用Java实现了

  • 不要存储为数组,存储为奇数的位序列。内存效率更高

  • 如果你的速度问题是你想让这个特定的计算运行得更快(你需要证明为什么你不能预计算并从磁盘加载它),你需要编写一个更好的Atkin's siever。它更快。但只是稍微快一点

  • 您尚未指明这些素数的最终用途。我们可能完全遗漏了一些内容,因为您没有告诉我们应用程序。请告诉我们应用程序的草图,答案将更好地针对您的上下文

  • 你到底为什么认为更快的东西存在?你还没有证明你的直觉是正确的。这是一个非常困难的问题。(那就是找到更快的东西)


  • 使用可以做得更好,但要快速正确地实现它是相当困难的。维基百科伪代码的简单翻译可能不够好。

    到目前为止,我经验中最快的算法是对2、3和5进行轮因式分解的Erathostenes筛,其中剩余数字中的素数是A在我3岁的笔记本电脑的一个核心上,用Java计算10亿次的素数需要23秒

    使用轮因子分解时,Atkin的筛子大约慢两倍,而使用普通
    位集时,它大约快30%


    另请参见。

    我在I 350M笔记本上用C编写了一个算法,可以在0.65秒内找到2-90 000 000范围内的素数……你必须使用位运算和“代码”用于重新计算数组的索引到所需的具体位的索引。例如,如果需要数字2的折叠,具体位将为…10101000…因此,如果从左侧读取,则会得到索引4,6,8…这就是

    在什么范围内寻找素数?介于0和max int之间?范围有多宽?让我们说点什么比如十亿/2有50万个素数小于10^9,所以预计算它们会得到一个200MB的表。实际上,只存储筛子会更小(10^9位是125MB,你不需要存储偶数位,所以你可以将其全部放入64MB以下)。顺便说一句,我刚刚运行了
    setprimessive(1e9)
    在我的计算机上,它每秒计算100万个素数。我怀疑许多算法每秒计算的速度可能超过100万个!你可以尝试该算法的多线程版本:不,它们不快,甚至我的代码也更快。我真的看到一些东西说它非常快(为什么我不相信它…)我明天会查的,我得走了。无论如何谢谢。(这不是另一个话题的重复,答案很慢)这是一篇很棒的文章,+1有一些算法比这个简单的算法要快得多,看我的回答是的,我试着用atkins的筛子…我的数组也包含偶数,但我没有碰它们…它比eroathenes的筛子慢1.5倍。(我发现的大多数代码是我的eroa的两倍).当然-我甚至使用了素数属性,比如说我知道如何进行优化…但速度还是比较慢(我的数组中有未启用的字节…这不重要)。为什么不给你看一下这段代码呢?这篇文章的一位作者在测试素数时给出了一个非常快速的C实现,这真是令人厌烦,我完全同意jlv…只需存储并查找它。事实上,应该有一个免费的全局Web服务,它可以全局缓存,提供答案…或者更好,java应该在查找中将所有素数存储到max int;在Docker的世界中,应该有一个映像,其中包含一个围绕素数(包括查找)提供一系列服务的应用程序。必须测试它,然后用您选择的任何语言寻找性能最好的方法,这简直是一件令人厌烦的事情。
    public static void SetPrimesSieve(int Range)
        {
            Primes = new List<uint>();
            Primes.Add(2);
            int Half = (Range - 1) >> 1;
            BitArray Nums = new BitArray(Half, false);
            int Sqrt = (int)Math.Sqrt(Range);
            for (int i = 3, j; i <= Sqrt; )
            {
                for (j = ((i * i) >> 1) - 1; j < Half; j += i)
                    Nums[j] = true;
                do
                    i += 2;
                while (i <= Sqrt && Nums[(i >> 1) - 1]);
            }
            for (int i = 0; i < Half; ++i)
               if (!Nums[i])
                    Primes.Add((uint)(i << 1) + 3);
        }