在讲座中,我们被告知,对于所有k,k³和(k + 1)³之间至少有一个素数。 1.我现在想知道如何在C中有效地找到这样一个素数。我知道Eratosthenes的Sieve但我不知道如何在不污染内存的情况下实现它。谢谢你的帮助。
答案 0 :(得分:4)
你需要污染你的记忆以提高寻找素数的速度。有一种简单的方法可以快速而简单地实现。
primes = list of prime number below sqrt( (k+1)^3 )
for i = k^3 + 1 to (k+1)^3 :
is_prime = true
for p in primes:
if (i % p == 0) :
is_prime = false
break
if (is_prime):
print(i)
为了生成低于sqrt((k + 1)^ 3)的素数列表,您可以使用Sieve of Eratosthenes。使用这种方法,您只需要使用最多(k + 1) 1.5 的内存。
答案 1 :(得分:0)
答案很大程度上取决于 k 的大小。如果 k 很小,小于10 ** 3或其左右,Eratosthenes的Sieve将运作良好。但是如果 k 更大,更好的方法是使用Miller-Rabin伪等级测试:
function isPrime(n, k=5)
if n < 2 then return False
for p in [2,3,5,7,11,13,17,19,23,29]
if n % p == 0 then return n == p
s, d = 0, n-1
while d % 2 == 0
s, d = s+1, d/2
for i from 0 to k
x = powerMod(randint(2, n-1), d, n)
if x == 1 or x == n-1 then next i
for r from 1 to s
x = (x * x) % n
if x == 1 then return False
if x == n-1 then next i
return False
return True
这样,您可以测试从 k 立方体开始的每个奇数。找到一个素数不应该花很长时间。