簡體   English   中英

在 python 中生成大素數

[英]Generating large prime numbers in python

我似乎無法使用此代碼生成隨機素數,有人可以幫助我嗎?

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

想象一下如果range(3, int(n**0.5), 2)最后一個數字range(3, int(n**0.5), 2)不是n的整數除數會發生什么:

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

因此, 即使所有先前的檢查都評估為False ,也可以將n稱為素數。 修復此問題的代碼的最小更改是:

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

因此,如果prime 已經為 False ,則它仍為False

但是,請記住,對於素性,如果這些檢查中的任何一個是False n不是素數。 你可以使用它和Python的and all (它們被懶惰地評估,即一旦找到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更清晰(盡管它可能會或可能不會更有效 )。

正確的邏輯,你在n % x時設置為True 第一次= 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

讀取中斷並繼續語句,以及循環上的子句

編寫等效代碼的較短方式是(來自@ Steve Jesso ):

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

看一下標簽: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

您的代碼中存在錯誤:

  1. 不正確的“else:”; 如果余數不為0,則不能將數字聲明為素數; 所有的備用者都應該是非零的
  2. int(n * 0.5)應該是int(n * 0.5 + 1)以防止舍入錯誤

可能的解決方案是

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

一遍又一遍地生成大素數可能會花費大量時間。 出於這個原因,我使用了增量。

import random

def generate_big_prime(size):
    p = random.randrange(2 ** (size - 1), 2 ** size - 1)
    if p % 2 == 0:
        p += 1
    while not is_prime(p):
        p += 2
    return p

其中 is_prime() 是素數測試。 我會推薦Miller-Rabin 素數測試的效率。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM