|
|
|
|
@ -1,2 +1,43 @@
|
|
|
|
|
# zwf
|
|
|
|
|
import random
|
|
|
|
|
from sympy import GF, symbols, primerange
|
|
|
|
|
from sympy.polys.galoistools import gf_irreducible_p
|
|
|
|
|
from sympy.polys.domains import FF
|
|
|
|
|
|
|
|
|
|
# 步骤1:随机选择素数p和整数n
|
|
|
|
|
# 生成2到10之间的素数列表
|
|
|
|
|
primes = list(primerange(2, 10))
|
|
|
|
|
# 随机选择素数p
|
|
|
|
|
p = random.choice(primes)
|
|
|
|
|
# 随机选择3到10之间的整数n
|
|
|
|
|
n = random.randint(3, 10)
|
|
|
|
|
|
|
|
|
|
# 步骤2:在F_p上寻找一个n次的不可约多项式p(x)
|
|
|
|
|
x = symbols('x')
|
|
|
|
|
while True:
|
|
|
|
|
# 生成n+1个随机系数(0到p-1之间)
|
|
|
|
|
coeffs = [random.randint(0, p-1) for _ in range(n+1)]
|
|
|
|
|
# 确保首项系数为1
|
|
|
|
|
coeffs[-1] = 1
|
|
|
|
|
# 检查多项式是否不可约
|
|
|
|
|
if gf_irreducible_p(coeffs, p, GF):
|
|
|
|
|
break
|
|
|
|
|
|
|
|
|
|
# 构造多项式表达式
|
|
|
|
|
p_poly = 0
|
|
|
|
|
for i, coeff in enumerate(coeffs):
|
|
|
|
|
p_poly += coeff * x**i
|
|
|
|
|
|
|
|
|
|
# 步骤3:构造有限域F_{p^n}
|
|
|
|
|
# 使用多项式模运算表示元素
|
|
|
|
|
# 寻找生成元(生成元的寻找较为复杂,这里简化处理)
|
|
|
|
|
|
|
|
|
|
# 步骤4:表示非零元素
|
|
|
|
|
# 使用多项式表示法
|
|
|
|
|
# 注意:sympy的FF类不直接支持自定义模数的有限域构造
|
|
|
|
|
F_pn = FF(p**n, modulus=p_poly) # 概念性表示
|
|
|
|
|
|
|
|
|
|
# 输出结果
|
|
|
|
|
print(f"素数 p: {p}")
|
|
|
|
|
print(f"整数 n: {n}")
|
|
|
|
|
print(f"不可约多项式 p(x): {p_poly}")
|
|
|
|
|
print(f"有限域 F_{p}^{n} 的元素数量: {p**n}")
|