繁体   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