设计一个程序:对任意给定的一个素数 p,求出 Z∗p 的最小生成元。任取一个整数 n,对大于 1 小于 n 的所有素数 p,求 Z∗p 的最小生成元,并求以上最小生成元集合中最大者所对应的

先编写一个函数来判断一个数是否为素数:
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

接下来,我们可以编写一个函数来求解Z∗p的最小生成元。对于给定的素数p,我们可以使用一个循环来依次尝试各个整数i,直到找到一个i使得i的阶等于Z∗p的阶。然后,我们可以定义一个函数来计算一个整数的阶:


def calc_order(base, mod):
    order = 1
    result = 1
    while result != 0:
        order += 1
        result = (result * base) % mod
    return order
 

最后,我们可以使用另一个循环来求解大于1小于n的所有素数p的最小生成元,并找出最大的最小生成元所对应的素数p:


def find_min_generator(n):
    max_min_gen = 1
    max_min_p = 2
    for p in range(2, n):
        if is_prime(p):
            min_gen = find_min_generator_of_prime(p)
            if min_gen > max_min_gen:
                max_min_gen = min_gen
                max_min_p = p
    return max_min_p

def find_min_generator_of_prime(p):
    for i in range(2, p):
        if calc_order(i, p) == p-1:
            return i
    return -1

然后,我们可以调用函数find_min_generator(n)来求解大于1小于n的所有素数p的最小生成元,并找出最大的最小生成元所对应的素数p。


n = 100
result = find_min_generator(n)
print("最大的素数p是", result)
 

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值