寻找原根

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

原文地址:https://www.cnblogs.com/Higgerw/p/14818506.html