寻找原根
若模m有缘跟,则原根共有\(\varphi(\varphi(m))\)个原根。
若m是奇素数p,则模p共有\(\varphi(p-1)\)个原根。
若g为关于模p的一个原根,则模p的全部原根:
\(
\{ g^k| 1 \leq k \leq p-1, (p-1,k) = 1 \}
\)
对于p-1的每个正因子d,模p阶为d的数共有\(\varphi(d)\)个,是
\(
\{ g^k| 1 \leq k \leq p-1, (p-1,k) = \frac{p-1}{d} \}
\)
def gcd(a, b):
while a != 0:
a, b = b%a, a
return b
p = 17
# 假设存在原根
for g in range(2, p - 1): #寻找最小原根
SET = set()
for i in range(p):
SET.add(pow(g, i, p))
if len(SET) == p-1: # 找到原根
print("Found One Generator! g = %d" % g)
break
g = None
# g = 3 # 3为关于17的其中一个生成元
if g:
K_exponent = [] # 寻找所有生成元(原根)
for i in range(1, p):
if(gcd(i, p-1)==1):
K_exponent.append(i)
generator = []
for k in K_exponent:
generator.append(pow(g, k, p))
print("All of generators: ", generator)
else:
print("No generator!")