- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
如何在考虑时间复杂度的情况下找到从 1 到 20 亿(使用任何编程语言且不使用任何外部库)相差 6 的连续质数对的数量,例如 (23,29)?
尝试过埃拉托色尼筛法,但获得连续素数是一项挑战
使用了生成器但是时间复杂度很高
代码是:
def gen_numbers(n):
for ele in range(1,n+1):
for i in range(2,ele//2):
if ele%i==0:
break
else:
yield ele
prev=0
count=0
for i in gen_numbers(2000000000):
if i-prev==6:
count+=1
prev = i
最佳答案
有趣的问题!我最近一直在研究 Eratosthenes 素数生成器的筛法。 @Hans Olsson 说
You should use segmented sieve to avoid memory issue: en.wikipedia.org/wiki/Sieve_of_Eratosthenes#Segmented_sieve
我同意,并且碰巧有一个我破解来解决这个问题的。提前为长度和非Pythonic-ness道歉。示例输出:
$ ./primes_diff6.py 100
7 prime pairs found with a difference of 6.
( 23 , 29 ) ( 31 , 37 ) ( 47 , 53 ) ( 53 , 59 ) ( 61 , 67 ) ( 73 , 79 ) ( 83 , 89 )
25 primes found.
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79,
83, 89, 97]
$ ./primes_diff6.py 1e5
1940 prime pairs found with a difference of 6.
9592 primes found.
代码:
#!/usr/bin/python -Wall
# program to find all primes smaller than n, using segmented sieve
# see https://github.com/kimwalisch/primesieve/wiki/Segmented-sieve-of-Eratosthenes
import sys
def segmentedSieve(limit):
sqrt = int(limit ** 0.5)
segment_size = sqrt
prev = 0
count = 0
# we sieve primes >= 3
i = 3
n = 3
sieve = []
is_prime = [True] * (sqrt + 1)
primes = []
multiples = []
out_primes = []
diff6 = []
for low in xrange(0, limit+1, segment_size):
sieve = [True] * segment_size
# current segment = [low, high]
high = min(low + segment_size -1, limit)
# add sieving primes needed for the current segment
# using a simple sieve of Eratosthenese, starting where we left off
while i * i <= high:
if is_prime[i]:
primes.append(i)
multiples.append(i * i - low)
two_i = i + i
for j in xrange(i * i, sqrt, two_i):
is_prime[j] = False
i += 2
# sieve the current segment
for x in xrange(len(primes)):
k = primes[x] * 2
j = multiples[x]
while j < segment_size: # NB: "for j in range()" doesn't work here.
sieve[j] = False
j += k
multiples[x] = j - segment_size
# collect results from this segment
while n <= high:
if sieve[n - low]:
out_primes.append(n)
if n - 6 == prev:
count += 1
diff6.append(n)
prev = n
n += 2
print count, "prime pairs found with a difference of 6."
if limit < 1000:
for x in diff6:
print "(", x-6, ",", x, ")",
print
return out_primes
# Driver Code
if len(sys.argv) < 2:
n = 500
else:
n = int(float(sys.argv[1]))
primes = [2] + segmentedSieve(n)
print len(primes), "primes found."
if n < 1000:
print primes
如果您针对大小 2e9(20 亿)运行它并减去大小 1e9(10 亿)的结果,这可能会按原样工作。
编辑
性能信息,由@ValentinB 请求。
$ time ./primes_diff6.py 2e9
11407651 prime pairs found with a difference of 6.
98222287 primes found.
real 3m1.089s
user 2m56.328s
sys 0m4.656s
... 在我的新笔记本电脑上,1.6 GHz i5-8265U,8G RAM,WSL 上的 Ubuntu,Win10
我找到了一个 mod 30 主轮 here在 Willy Good 的评论中,在 1e9 时比此代码快约 3 倍,在 2e9 时快约 2.2 倍。没有分段,胆量是一个 Python 生成器。我想知道是否可以对其进行分段或更改以使用位数组来帮助其内存占用,而不会以其他方式破坏其性能。
结束编辑
关于python - 相差 6 的连续质数对的数量,例如 (23,29) 从 1 到 20 亿,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57586958/
我使用此代码来测量我的 C 程序的计算时间: clock_t start = clock() ; do_some_work() ; clock_t end = clock() ; double ela
我正在尝试找到一个 SQL 查询,该查询将计算至少相差 30 分钟的不同开始时间的数量。 我有一些员工在一周内至少三个不同的时间开始工作时获得积分,其中开始时间与其他开始时间至少相差 30 分钟。 例
我正在尝试显示一个时间表,并且我想在一周内的每组比赛之后创建一个休息时间。例如,我想要一个 在第一周的前五场比赛之后。然后在第二周的五场比赛之后再次进行。我现在所拥有的包括前六场比赛,然后是之后的每五
float a=67107842,b=512; float c=a/b; printf("%lf\n",c); 为什么 c 是 131070.000000 而不是正确的值 131070.0039062
我有一个谓词 predicate = [NSPredicate predicateWithFormat:@"character.id IN %@", indexs]; 它生成以下 SQL: CoreD
我正在编写一个在 UI 中有一个 DatePicker 和一个 TimePicker 的应用程序。我需要获取用户设置的日期和时间并存储在服务器中。 例如用户选择“2015 年 11 月 13 日 13
我有一个带有 OffsetDateTime 的 JPA 实体类像这样的字段: @Entity class MyEntity(clock: Clock) { // ... val cre
这个问题已经有答案了: What does size of the memcmp return value mean? (2 个回答) 已关闭 3 年前。 所以我必须使用 C 重新创建 memcmp(
两个查询。第一个比第二个长 200 倍。为什么?PostgreSQL 10.1。 Metro 和 Sel - 同一张 table 上的 View 。 EXPLAIN ANALYZE SELECT *
我在 Google Play 中有一个应用,并在其上进行 Firebase 分析。我正在尝试跟踪广告来源。我不明白正确的下载次数在哪里,因为 Google Play Console 显示 150 个安
我正在使用 Python 进行核密度估计,并使用高斯混合模型对多维数据样本的可能性进行排序。每条数据都是一个角度,我不确定如何处理机器学习角度数据的周期性。 首先,我通过添加 360 来移除所有负角,
最近我遇到了一件非常奇怪的事情——一种方法在性能分析器下非常慢,没有明显的原因。它包含很少的 long 操作,但被调用得相当频繁 - 它的总体使用量约为总程序时间的 30-40%,而其他部分似乎“更重
请有人向我解释这种情况。 我有以下代码: Click the button to display the date and time as a string, using the ISO standa
如何在考虑时间复杂度的情况下找到从 1 到 20 亿(使用任何编程语言且不使用任何外部库)相差 6 的连续质数对的数量,例如 (23,29)? 尝试过埃拉托色尼筛法,但获得连续素数是一项挑战 使用了生
我正在尝试找到一种方法来过滤两个日期/时间字段的差异小于 90 分钟的记录。 例子: orders.created_at = 2015-08-09 20:30:20 table2.created_at
我在使用 EEPlus 库从 excel (.xlsx) 文件获取正确的日期字段值时遇到问题。 具体问题是在 excel 中我有例如1900.01.04,但在 C# 中我得到 1900.01.03。
我是一名优秀的程序员,十分优秀!