Python求质数的三种方法(python求质数)

本文将介绍Python求质数三种方法,分别是试除法、埃氏筛法和线性筛法。

一、试除法

试除法是最简单的求质数的方法,就是判断给定的数是否能被小于它的数整除。如果能整除,那么这个数就不是质数。

下面是使用试除法求解质数的代码示例:

def trial_division(n):
    """
    :param n: 待判断的数
    :return: True为质数,False为非质数
    """
    if n < 2:
        return False
    for i in range(2, int(n ** 0.5) + 1):
        if n % i == 0:
            return False
    return True

以上代码首先判断待判断的数是否小于2,如果小于2就不是质数。然后从2到根号下n进行遍历,判断余数是否为0,如果为0就不是质数。

二、埃氏筛法

埃氏筛法是一种比试除法更高效的求质数方法。它的原理是从2开始,将每个质数的倍数都标记成合数,直到筛完所有小于等于n的数为止。

下面是使用埃氏筛法求解质数的代码示例:

def eratosthenes(n):
    """
    :param n: 待求解质数范围的上限
    :return: 返回小于等于n的质数列表
    """
    Prime = [True] * (n + 1)
    Prime[0] = False
    Prime[1] = False
    for i in range(2, int(n ** 0.5) + 1):
        if Prime[i] == True:
            for j in range(i * i, n + 1, i):
                Prime[j] = False
    return [i for i in range(2, n + 1) if Prime[i] == True]

以上代码创建了一个bool类型的数组Prime,用来记录每个数是否为质数。初始时,所有数都被标记为True。从2开始遍历,如果发现某个数为质数,就将其倍数标记为False。最后统计所有True的数就是小于等于n的质数。

三、线性筛法

线性筛法是一种更加高效的求质数方法,相比于埃氏筛法,它避免了重复标记筛选合数的过程。它的原理是遍历到一个质数p时,将p与p的倍数i*p(i>=2)标记为合数,下一个质数一定不会被p和i*p标记成合数,因此就可以直接遍历到下一个质数。

下面是使用线性筛法求解质数的代码示例:

def sieve(n):
    """
    :param n: 待求解质数范围的上限
    :return: 返回小于等于n的质数列表
    """
    Prime = [True] * (n + 1)
    Prime[0] = False
    Prime[1] = False
    p = []
    for i in range(2, n + 1):
        if Prime[i] == True:
            p.append(i)
        for j in p:
            if i * j > n:
                break
            Prime[i * j] = False
            if i % j == 0:
                break
    return p

以上代码和埃氏筛法有些类似,但是它多了一个质数列表p来记录已知质数。遍历到一个数i时,如果它是质数,则加入p,然后遍历p列表中的质数j,计算i*j,如果i*j超过了n,就结束本轮循环。如果i能被j整除,说明j是i的最小质因子,后面的i*j就可以被标记为合数了,因此退出本轮循环。

Published by

风君子

独自遨游何稽首 揭天掀地慰生平