当前位置: 首页 > 面试题库 >

使用预先计算的素数筛选Eratosthenes

华锦
2023-03-14
问题内容

我已经可以存储所有32位质数,unsigned int并且 我想用它们来生成一些64位质数 。即使对逻辑和编译进行了优化,使用试验划分也太慢了。

我正在尝试修改Eratosthenes的筛网以使用预定义列表,如下所示:

  1. 在数组A中从2到4294967291
  2. 在数组B中从2 ^ 32到X inc减1
  3. 找到C,它是当前素数的第一个倍数。
  4. 从C标记开始并以当前素数跳至X。
  5. 转到1。

问题是使用模数查找素数的第3步,这种操作是我不使用轨迹除法的原因。

有没有更好的方法来实现步骤3或整个算法。

谢谢。


问题答案:

增加2,而不是1。这是您应始终使用的最小优化-仅适用于赔率。无需打扰。

在C ++中,vector<bool>用于sieve数组。它会自动打包。

用分段筛子预先计算您的核心素数。然后继续按适合您缓存的足够大的段进行工作,而无需在核心列表中添加新的素数。对于每个素数,都需要 p 维持long long int value其当前倍数(当然是从素数的平方开始)。步长值是值的 两倍p,或 p 在奇数填充的筛子数组中偏移,其中
i -th项代表number o + 2io 是不低于范围起点的最小奇数。无需按倍数的值排序,核心素数使用的上限单调增加。

sqrt(0xFFFFFFFFFF)=
1048576
。PrimePi(1048576)=
82025
素数是核心素数列表中所需的全部。那是花生。

long long ints的整数算术应该可以很好地找到模数,因此在您首次启动(或恢复工作)时应找到范围的最小倍数。



 类似资料:
  • 我有所有可以存储在32位< code>unsigned int中的质数,我想用它们生成一些64位质数。即使在逻辑和编译方面进行了优化,使用试除法还是太慢了。 我正在尝试修改“埃拉托斯特尼筛”以使用预定义列表,如下所示: 在阵列A中,从2到4294967291 在阵列B中,从2^32到X inc by 1 找到C,它是当前素数的第一个倍数 从C标记跳转到X。 转到1 问题是第3步,它使用模来找到素数

  • 问题内容: 更新 :已添加 我想对我的ElasticSearch集群执行唯一计数。该集群包含约5000万条记录。 我尝试了以下方法: 第一种方法 在本节中提到: 预计算哈希通常仅在非常大和/或高基数的字段上有用,因为它可以节省CPU和内存。 第二种方法 在本节中提到: 除非您将Elasticsearch配置为使用doc_values作为字段数据格式,否则使用聚合和构面对堆空间的要求 非常 高。 我

  • 为了澄清,这与Eratosthenes的问题Sieve-Finding Primes Python不同,因为我不想在两个数字之间生成素数,但我想检查一个数字是否是素数。 我做了下面的代码来确定一个数字是否是素数。然后我听说了埃拉托色尼算法的筛子,它显然更快,但我不知道如何在下面的代码中编写它? 你们能帮帮我吗?

  • 中的大多数操作都可以通过操作符链接(、、等)完成,但我发现筛选行的唯一方法是通过普通的括号索引 这是没有吸引力的,因为它要求我在能够过滤变量值之前将赋值给变量。还有更像下面这样的吗?

  • 问题内容: 如何使用选择器在CSS中选择元素的上述元素 在这里,我想使用class ,以便可以使用CSS选择器获取上述元素。 问题答案: 纯CSS不可能做到这一点…

  • 我的文档具有如下所示的嵌套字段: 嵌套字段的映射如下所示: 在切换到ElasticSearch2之前,我使用aggs查询了没有结果的文档。以下是查询的聚合部分: 现在我切换到了ElasticSerach2,它只计算所有文档。我已经尝试了不同的方法,比如计算所有文档和计算结果,这样我就可以减去结果,但是 总是0 如何正确筛选/计算嵌套字段?