[英]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
您的代碼中存在錯誤:
可能的解決方案是
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.