簡體   English   中英

查找最近的素數 python

[英]Find nearest prime number python

我想找到range(old_number + 1, 2*old_number)的最大素數

到目前為止,這是我的代碼:

def get_nearest_prime(self, old_number):
    for num in range(old_number + 1, 2 * old_number) :
        for i in range(2,num):
            if num % i == 0:

                break

    return num

當我調用get_nearest_prime(13)時,正確的 output 應該是23 ,而我的結果是25 誰能幫我解決這個問題? 幫助將不勝感激!

可以進行很多更改,但是您應該進行哪些更改取決於您想要完成的任務。 您的代碼目前最大的問題是您成功地通過break識別素數,然后不對該信息執行任何操作。 這是做大致相同事情的最小更改。

def get_nearest_prime(old_number):
    largest_prime = 0
    for num in range(old_number + 1, 2 * old_number) :
        for i in range(2,num):
            if num % i == 0:
                break
        else:
            largest_prime = num
    return largest_prime

我們正在使用largest_prime局部變量來跟蹤您找到的所有素數(因為您以遞增順序遍歷它們)。 else子句會在您“正常”退出內部for循環(即沒有命中break子句)時觸發。 換句話說,任何時候你找到一個素數。

這是一個稍微快一點的解決方案。

import numpy as np

def seive(n):
    mask = np.ones(n+1)
    mask[:2] = 0
    for i in range(2, int(n**.5)+1):
        if not mask[i]:
            continue
        mask[i*i::i] = 0
    return np.argwhere(mask)

def get_nearest_prime(old_number):
    try:
        n = np.max(seive(2*old_number-1))
        if n < old_number+1:
            return None
        return n
    except ValueError:
        return None

它做的事情大致相同,但它使用一種稱為“Eratosthenes 篩法”的算法來加速素數的查找(與您正在使用的“試驗除法”相反)。 它不是世界上最快的篩子,但無需太多調整就可以合理理解。

在任何一種情況下,如果您多次調用它,您可能希望跟蹤您發現的所有素數,因為計算它們的成本很高。 緩存在 Python 中既簡單又靈活,如果您確實需要速度提升,有許多方法可以實現這一點。

請注意,我不確定您指定的范圍始終包含質數。 很有可能,如果確實如此,您可以使用更短的代碼。 像下面這樣的東西。

def get_nearest_prime(old_number):
    return np.max(seive(2*old_number-1))

我不完全同意您選擇的名稱,因為該區間中最大的素數通常不是最接近old_number的素數,但我認為這正是您要尋找的。

您可以使用子列表檢查數字是否為質數,如果all(i % n for n in range(2, i))表示該數字是prime ,因為從模返回的所有值都是True而不是 0。從那里你可以將這些值append到一個名為primes的列表,然后取該列表的max

列表理解

num = 13
l = [*range(num, (2*num)+1)]
print(max([i for i in l if all([i % n for n in range(2,i)])]))

展開:

num = 13
l = [*range(num, (2*num)+1)]

primes = []
for i in l:
     if all([i % n for n in range(2, i)]):
        primes.append(i)

print(max(primes))
 23

使用seive function 從上面搜索最近的素數

def get_nearest_prime(old_number):
    return old_number+min(seive(2*old_number-1)-old_number, key=lambda a:a<0)

暫無
暫無

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

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