在python中生成大素数

时间:2014-01-10 11:23:41

标签: python random rsa primality-test

我似乎无法使用此代码制作随机素数,请有人帮助我吗?

def RandomPrime():
  prime = False
  while prime == False:
    n = random.randint(10000, 100000)
    if n % 2 != 0:
      for x in range(3, int(n**0.5), 2):
        if n % x ==0:
          prime = False
        else:
          prime = True


  return n

4 个答案:

答案 0 :(得分:4)

想象一下,如果range(3, int(n**0.5), 2)中的 last 号码不是n的整数除数会发生什么:

if n % x ==0:
    prime = False # not this
else:
    prime = True # this

所以即使所有先前的检查都已评估False ,您也可以将n称为素数。 minimal 更改为您的代码以解决此问题:

prime = prime and True # or 'prime &= True'

因此,如果prime 已经 False,则它仍为False

但是,请记住,对于素性,如果这些检查中的任何 False n不是素数。你可以使用这个和Python的andall(它们被懒惰地评估,即一旦找到False就不再检查)以更有效地实现:

def rand_prime():
    while True:
        p = randint(10000, 100000)
        if (r % 2 != 0 and
            all(p % n != 0 for n in range(3, int(((p ** 0.5) + 1), 2))):
            return p

为了获得更好的性能,请注意randrange包含step参数,就像range一样,因此您可以跳过所有偶数(绝对不是素数!) :

def rand_prime():
    while True:
        p = randrange(10001, 100000, 2)
        if all(p % n != 0 for n in range(3, int((p ** 0.5) + 1), 2)):
            return p

注意:在我看来,sqrt(n)(来自math)对其他技术性较差的读者比n ** 0.5更清楚一点(尽管它may or may not be more efficient })。

答案 1 :(得分:0)

正确的逻辑,您在True时设置n % x!第一次= 0

  for x in range(3, int(n**0.5), 2):
    if n % x ==0:
      prime = False
    else:
      prime = True

应该是:

  prime = False
  for x in range(3, int(n**0.5), 2):
    if n % x ==0:
      break
  else: 
    prime = True

阅读break and continue Statements, and else Clauses on Loops

编写等效代码的较短方式是(来自@ Steve Jesso):

prime = all(n % x != 0 for x in range(3, int(n**0.5), 2)

答案 2 :(得分:0)

看一下标签:else应该引用整个for循环,而不是iF

def RandomPrime():
  prime = False
  while prime == False:
    n = random.randint(10000, 100000)
    if n % 2 != 0:
      for x in range(3, int(n**0.5), 2):
        if n % x ==0:
          break
      else:
          prime = True


  return n

答案 3 :(得分:0)

您的代码中存在错误:

  1. 不正确“else:”;如果余数不为0,则不能将数字声明为素数; 所有留言者应为非零
  2. int(n * 0.5)应为int(n * 0.5 + 1)以防止上舍入错误
  3. 可能的解决方案是

    def RandomPrime():
      while True:
        n = random.randint(10000, 100000)
    
        if n % 2 == 0:
          continue;
    
        prime = True;
    
        for x in range(3, int(n**0.5 + 1), 2):
          if n % x == 0:
            prime = False;
    
            break; 
    
        if prime: 
          return n