簡體   English   中英

進一步優化素數生成器

[英]optimization of prime number generator further

Python 程序將素數列表打印到給定的限制,但問題是它必須通過跳過一個步驟來打印它們。 這意味着直到 20 的素數將是:2,3,5,7,11,13,17,19

但我必須通過跳過一個數字來打印它們,這意味着:2 5 11 17

但是使用 python 生成器 function:我已經在下面寫了代碼,但我想問有沒有其他方法或者我可以進一步優化它。

def prime(n):
  lst = []
  newlist = []
  if n == 1:
       pass
       for i in range(2,n):
           for j in range(2,i//2+1):
                if i%j==0:
                   break
       else:
           lst.append(i)

  length = len(last)
  newlist = lst[0:length:1]


  for m in newlist:
     yield m 


for i in prime(20):
   print(i)

改進

  • 只需要檢查直到 sqrt(n) 的除數(這會將算法復雜度更改為 O(n*sqrt(n)) 而不是 O(n^2)
  • 只需要檢查兩個后的素數奇數
  • 使用一個標志來切換每個素數檢測,作為決定報告哪些素數的有效方法(避免必須將素數保存在列表中,從而將存儲復雜度從 O(n/ln n) 降低到 O(1))。

代碼

def prime(n):
  '''
      Report every other prime up to n
  '''
  if n < 2:
    return  # No primes

  yield 2   # First prime (only even prime, rest are odd)
  
  report = False     # Report flag (toggle on each prime)
  for candidate in range(3, n, 2):
    # Check only odd numbers
    for divisor in range(2, int((candidate**0.5) + 1)):
        if candidate % divisor == 0:
            break
    else:
        # No divisors found so prime (i.e. did not hit break)
        if report:    # Report this prime
            yield candidate
            
        report = not report   # Toggle report flag (don't report next prime)
                     
for i in prime(20):
   print(i, end = ' ')

# Out: 2 5 11 17

暫無
暫無

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

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