C在区间k ^ 3到(k + 1)^ 3中找到素数的有效方法

时间:2015-07-19 07:22:19

标签: c algorithm primes

在讲座中,我们被告知,对于所有k,k³和(k + 1)³之间至少有一个素数。 1.我现在想知道如何在C中有效地找到这样一个素数。我知道Eratosthenes的Sieve但我不知道如何在不污染内存的情况下实现它。谢谢你的帮助。

2 个答案:

答案 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 立方体开始的每个奇数。找到一个素数不应该花很长时间。