- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在做的事情要求我生成所有不超过 10^12 的素数。
因为我以前从来不需要这么多素数,所以我通常只是在这个网页上实现算法here
当然,这里的问题是 10^12 大于整数的最大值,因此我无法创建该大小的数组。
我不熟悉人们用来有效生成这么多素数的方法,想知道是否有人可以阐明这种情况。
最佳答案
您需要使用分段筛。
分段筛的基本思想是选择小于 n 的平方根的筛选素数,选择适合内存的相当大的段大小,然后依次筛选每个段,从最小的开始.在第一段,计算段内每个筛素的最小倍数,然后按常规方式将筛素的倍数标记为复合;当所有的筛选素数都用完后,该段中剩余的未标记数为素数。然后,对于下一个片段,对于每个筛分素数,您已经知道当前片段中的第一个倍数(它是结束前一个片段中该素数筛分的倍数),因此您对每个筛分素数进行筛分,依此类推直到你完成。
考虑以 20 为单位从 100 筛选到 200 的示例; 5个筛选素数分别为3、5、7、11、13。第一段100到120位数组有10个槽位,槽位0对应101,槽位k对应100+2k+1,槽位9对应119。段中3的最小倍数为105,对应slot 2; slot 2+3=5 and 5+3=8 也是3的倍数,5的最小倍数在slot 2是105,slot 2+5=7也是5的倍数,7的最小倍数是105在槽2,槽2+7=9也是7的倍数,以此类推。
函数 primes 接受参数 lo、hi 和 delta; lo 和 hi 必须是偶数,其中 lo < hi,并且 lo 必须大于 hi 的平方根。段大小是增量的两倍。长度为 m 的数组 ps 包含小于 hi 平方根的筛选素数,由于忽略了偶数,因此删除了 2,这是通过正常的埃拉托色尼筛法计算的。数组 qs 包含当前段中相应筛选素数的最小倍数的筛选位数组的偏移量。每段后lo前进两倍delta,所以筛位数组的索引i对应的数为lo + 2 i + 1。
function primes(lo, hi, delta)
sieve := makeArray(0..delta-1)
ps := tail(primes(sqrt(hi)))
m := length(ps)
qs := makeArray(0..m-1)
for i from 0 to m-1
qs[i] := (-1/2 * (lo + ps[i] + 1)) % ps[i]
while lo < hi
for i from 0 to delta-1
sieve[i] := True
for i from 0 to m-1
for j from qs[i] to delta step ps[i]
sieve[j] := False
qs[i] := (qs[i] - delta) % ps[i]
for i from 0 to delta-1
t := lo + 2*i + 1
if sieve[i] and t < hi
output t
lo := lo + 2*delta
对于上面给出的示例,这称为素数 (100, 200, 10)。在上面给出的示例中,qs 最初是 [2,2,2,10,8],对应于 105、105、105、121 和 117 的最小倍数,并且在第二段重置为 [1,2,6, 0,11],对应最小的倍数123、125、133、121、143。
delta的值很关键;为了速度,您应该使增量尽可能大,只要它适合高速缓存。将您的语言库用于位数组,这样您只需为每个筛选位置取一个位。如果您需要一个简单的埃拉托色尼筛法来计算筛素数,这是我最喜欢的:
function primes(n)
sieve := makeArray(2..n, True)
for p from 2 to n step 1
if sieve(p)
output p
for i from p * p to n step p
sieve[i] := False
这些函数都是伪代码;您必须使用适当的整数数据类型转换为 Java。在伪代码表示输出的地方,您可以打印素数,或将素数收集在数组中,无论您想用它们做什么。
我在我的博客上做了很多关于质数的工作,包括论文 Programming with Prime Numbers其中包括最后一页上的分段筛子。
关于java - 筛选高达 10^12 的素数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17504460/
我正在研究这个领域以获得实时对象检测。 视频示例: http://www.youtube.com/watch?v=Bm5qUG-06V8 http://www.youtube.com/watch?v=
问题 我正在为 C 语言的项目寻找一种数据结构来存储列表列表。我需要能够访问仅给定 n 的第 n 个列表(这些术语将被乱序访问)。各个列表将包含 1 到 M 之间的整数(为了具体起见,假设 M = 2
我有一个List (Maybe a),我想过滤出Nothing的实例。我大概已经做到了,但是对所需的代码量却不满意: removeNothingFromList : List (Maybe a) ->
我对 Blazor 有基本的输入 当我输入我认为无效的字符(例如“/”或“:/\\""|?* ]"; Search = Regex.Replace(args.Value.ToSt
我有一个主应用程序,允许用户编辑所有数据(大约 20 个字段)。更新后,我将其添加到服务总线主题中,系统的其他区域也订阅了该主题。 其中一个订阅仅关心单个字段(电话号码)是否更新。我想知道处理这个问题
我是ElasticSearch的新手,需要帮助解决以下问题: 我有一组包含多个产品的文档。我想通过“Apple”过滤产品属性product_brand并获取与过滤器匹配的产品数量。但是,结果应按文档I
我想过滤查询集中特定范围内的项目。这就是我的模型的样子 class modelEmployee(models.Model): user = models.ForeignKey(User, on
尽管数组 a 的大小不断增加,但我无法找到 8 位素数。它适用于较小的数字: #include #include int main() { int n,a[100000],i,m,k;
我不希望能够使用代码隐藏来搜索我的 gridview 结果。 我有一个按钮和一个 GridView :
我想使用 sift/surf 进行模板匹配。图像可以有 1...n 个目标。使用 surf/sift 只能提取一个目标。一种想法是将图像分割成多个片段,然后寻找筛选/冲浪匹配。它有效,但显然由于速度和
这是使用 Xodus API 限制实体查询的方法: final EntityIterable allUsers = txn.getAll(storeName).skip(skip).take(limi
我有 2 个 excel 文件:IDList.csv 和 Database.csv。 IDList 包含我要从数据库中过滤掉的 300 个 ID 号的列表,其中包含 2000 个条目(在数据库中留下
过滤 Treeview 节点的最佳/有效方法是什么? 例如:我输入“abc”,只有包含“abc”的节点可见。然后我输入 “abcd”,我应该会看到唯一包含 “abcd” 文本的节点。依此类推,所以每次
我有两个关于报告的 tablix,以及一个用于向 tablix 提供数据的数据集。我在报告中有一个多选参数,我需要根据该参数中的值过滤结果。 有什么区别,如果有,什么是更好的解决方案: 直接在数据集或
我对 flex 搜索/ NEST还是很陌生,需要一些帮助才能查询/过滤我的数据。 我有一个产品 list 。而且这些产品可以具有任意数量的选项,并具有与之相关的值。而且我需要能够按选项名称及其值来过滤
我正在使用过滤条件从原始表创建一个表,其中我的过滤值来自 SELECTEDVALUE 表格没有根据 SELECTEDVALUE 进行过滤,如果我用一个真实的值替换它就可以了。 代码(不起作用) Tra
我正在设置一个 MSBuild 项目来运行一些 NUnit 测试,使用 MSBuild Community Tasks Project 。 通过这些设置,我将能够运行 NUnit 测试:
我正在使用过滤条件从原始表创建一个表,其中我的过滤值来自 SELECTEDVALUE 表格没有根据 SELECTEDVALUE 进行过滤,如果我用一个真实的值替换它就可以了。 代码(不起作用) Tra
例如,我们有一个列表,我们想用特定的谓词将其分成两部分。 首先,我们可以使用filter和filterNot。 val trueList = list.filter(predicate) val fa
我尝试为 [Start] 使用某种范围: var calendar = outlookApplication.GetNamespace("MAPI").GetDefaultFolder(OlDefau
我是一名优秀的程序员,十分优秀!