📜  求模根的本底根数(1)

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

求模根的本底根数

在数学中,本原根是模n的一个原根,模根是模n下的一个特殊的本原根,用于解决方程 $x^k \equiv a \pmod n$ (其中 a 和 k 互质)的问题。本文将介绍如何在程序中实现求模根的本底根数。

模幂运算

先介绍一个必备的函数——模幂运算。对于给定的 a, b 和 n,模幂运算可以快速求解 $a^b \pmod n$:

def power_mod(a, b, n):
    result = 1
    a = a % n
    while b > 0:
        if b % 2 == 1:
            result = (result * a) % n
        a = (a * a) % n
        b //= 2
    return result
判断是否为本原根

判断一个数是否为模n的本原根,可以遍历其所有小于n的幂次,看是否能够取遍 0 到 n-2 的所有数。也就是说,对于每个小于n的正整数i,我们都要检查 $a^i \pmod n$ 是否为1,以及 $a^{i \cdot 2^k} \pmod n$ 是否为-1(其中 k 为大于等于0的整数)。如果一个数a能够满足这样的条件,那么它就是模n的本原根。

def is_primitive_root(a, n):
    phi_n = n - 1
    factors = factorize(phi_n)
    
    for factor in factors:
        if power_mod(a, phi_n // factor, n) == 1:
            return False
        
        if all(power_mod(a, phi_n // factor // 2, n) != 1 for _ in range(factor)):
            return False
        
    return True

其中 factorize 函数可以分解 phi(n) 为质因数乘积的形式。

求模根的本底根数

对于给定的 k 和 n,我们要求解 x,满足 $x^k \equiv 1 \pmod n$,但x不是 1,也不是n的因子。我们可以先找到n的所有本原根,然后遍历这些本原根,判断是否满足上述条件:

def find_primitive_roots(n):
    phi_n = n - 1
    factors = factorize(phi_n)
    
    primitive_roots = []
    for i in range(2, n):
        if math.gcd(i, n) == 1 and all(power_mod(i, phi_n // factor, n) != 1 for factor in factors):
            primitive_roots.append(i)
    
    return primitive_roots

def get_discrete_root(k, n):
    primitive_roots = find_primitive_roots(n)
    
    for root in primitive_roots:
        if power_mod(root, k, n) == 1:
            continue
        
        if is_primitive_root(power_mod(root, (n - 1) // k, n), n):
            return power_mod(root, (n - 1) // k, n)
    
    return None

其中 find_primitive_roots 函数用于找到模n的所有本原根,is_primitive_root 函数判断一个数是否为模n的本原根,get_discrete_root 函数用于求解模根的本底根数。

总结

本文介绍了如何利用模幂运算和本原根求解模根的本底根数。代码实现使用了 Python 语言,以简短、易懂的方式展示了算法的主要思路和实现细节。