📜  数论|加法作用下有限循环群的生成器(1)

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

数论|加法作用下有限循环群的生成器

在数论中,我们经常需要研究加法作用下的有限循环群,这个群的所有元素都是一些自然数的和,并且满足循环特性。生成器是这个群中的一个特殊元素,可以通过它来生成整个群。

下面介绍两种方法来求加法作用下有限循环群的生成器。

辗转相除法

假设我们要求的有限循环群的阶为 $n$,我们可以通过辗转相除法来找到其生成器。

  1. 找到 $n$ 的所有正因子 $a_1,a_2,...,a_m$。
  2. 对于每个 $a_i$,我们计算 $b_i = \dfrac{n}{a_i}$,并找到 $b_i$ 模 $a_i$ 的余数 $r_i$。
  3. 如果 $r_i \neq 0$,则 $a_i$ 不是生成器。
  4. 如果对于所有 $a_i$ 都有 $r_i = 0$,则 $n$ 的最小正生成元就是 $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

以上就是求加法作用下有限循环群生成器的两种方法,希望对你有帮助!