📅  最后修改于: 2023-12-03 15:26:12.509000             🧑  作者: Mango
在数论中,我们经常需要研究加法作用下的有限循环群,这个群的所有元素都是一些自然数的和,并且满足循环特性。生成器是这个群中的一个特殊元素,可以通过它来生成整个群。
下面介绍两种方法来求加法作用下有限循环群的生成器。
假设我们要求的有限循环群的阶为 $n$,我们可以通过辗转相除法来找到其生成器。
代码实现:
def gcd(a, b):
# 求两个数的最大公约数
if b == 0:
return a
return gcd(b, a % b)
def is_generator(n, a):
r = n % a
for i in range(2, a):
if gcd(i, a) == 1: # 判断 i 和 a 是否互质
x = pow(i, b, a)
if x == 1 or x == r:
return False
return True
def find_generator(n):
factors = []
m = int(n ** 0.5)
for i in range(1, m + 1):
if n % i == 0:
factors.append(i)
if i != n // i:
factors.append(n // i)
factors.sort(reverse=True)
for a in factors:
if is_generator(n, a):
return a
return n
如果 $n$ 是一个质数,我们可以使用原根来求其生成器。
原根是一个跟 $n$ 互质的数 $g$,满足 $g^1,g^2,...,g^{n-1}$ 模 $n$ 的余数构成了 $1,2,...,n-1$ 的一个排列。
代码实现:
def is_primitive_root(n, g):
a = set()
t = n - 1
while t % 2 == 0:
a.add(t // 2)
t //= 2
for x in a:
if pow(g, x, n) == 1:
return False
if pow(g, t, n) == 1:
return False
return True
def find_generator(n):
for g in range(2, n):
if is_primitive_root(n, g):
return g
return n
使用方法:
n = 47
g = find_generator(n)
print(g) # 5
以上就是求加法作用下有限循环群生成器的两种方法,希望对你有帮助!