若模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!")