寻找原根

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

posted @ 2021-05-27 16:35  爱吃砂糖橘的白龙  阅读(189)  评论(0编辑  收藏  举报