求一个数的原根并求其欧拉函数的所有质因数
题目背景:已知一个素数p,我们需要求它的原根,因此需要对它的欧拉函数p-1进行分解质因数。
代码:
def fjzys(p,listg):
"""
质因数分解分两种情况:
1、因数都小于等于根号n,只需要从2到根号n之间找质因数
2、有比根号n大的质因数且必定只有一个,那么我们仍然只需要从2到根号n之间找质因数,最后剩下的就是那么大于根号n的质因数
综上我们只需要从2到根号n之间找质因数即可。
"""
listy=[]
n = p-1 #n的欧拉函数
m=int(math.sqrt(n)) #从2到根号n之间找质因数
listy.append(2)
while n % 2 == 0: #p-1必是一个偶数,因此现将质因数2加入列表
n //= 2
for i in range(3,m,2): #3到p的奇数来找p-1的质因数
#if gmpy2.is_prime(i):
if n % i == 0: #找到了质因数
listy.append(i)
while n % i == 0: #将这个质因数都从n中除掉
n //= i
if n != 1: #n不等于1说明剩下的n是一个大于根号n的质因数
listy.append(n)
flag=1
for i in range(2,p): #从2到p求解所有的原根
for j in range(len(listy)): #依次取原根j,计算i的p除以j的次方是否都不等于1,满足说明是原根
if pow(i,p//listy[j],p)==1:
flag=0
break
if flag==1:
listg.append(i)
flag=1
return listg
n=97
listg=fjzys(n)

浙公网安备 33010602011771号