📜  程序查找带有梅森编号的编号的乘积(1)

📅  最后修改于: 2023-12-03 15:41:05.714000             🧑  作者: Mango

程序:查找带有梅森编号的编号的乘积

本程序用于查找带有梅森编号(p = 2^n -1)的素数,并计算它们的乘积。

程序流程
  1. 获取用户输入的范围,即素数的最大值;
  2. 循环判断每个数字是否为梅森素数;
  3. 若是梅森素数,则将它乘入累积乘积中。
实现细节
  1. 判断素数:本程序采用试除法判断一个数是否为素数;
  2. 判断梅森素数:若 2^n -1 为素数,则 n 必为素数,故先判断 n 是否为素数,再判断 2^n -1 是否为素数。
代码实现
def is_prime(n):
    if n < 2:
        return False
    for i in range(2, int(n**0.5)+1):
        if n % i == 0:
            return False
    return True

def is_mersenne_prime(p):
    if not is_prime(p):
        return False
    n = int(p**0.5)
    return 2**n - 1 == p

def calc_mersenne_primes_product(n):
    product = 1
    for i in range(2, n+1):
        p = 2**i - 1
        if is_mersenne_prime(p):
            product *= p
    return product

使用方法

运行 calc_mersenne_primes_product 函数,传入一个整数作为最大范围参数,即可得到对应范围内梅森素数的乘积。

calc_mersenne_primes_product(100)
性能分析

本程序使用试除法判断素数,时间复杂度为 $O(\sqrt{n})$;

对于一个 p,判定是否为梅森素数的时间复杂度为 $O(\sqrt{p})$;

而本程序循环的次数为 $O(n)$,故总时间复杂度为 $O(n\sqrt{n})$,在 $n$ 较小的时候,程序运行较快,但随着 $n$ 的增大,程序运行时间会变得较长,不适合用于大规模数据的处理。