📅  最后修改于: 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 语言,以简短、易懂的方式展示了算法的主要思路和实现细节。