n>1,(a,n)=1,使同余式成立的最小正整数d称为a对模n的指数,阶(order),基。记为
。
若,则称a为模N的原根。
以下程序只能判断N为质数时模N的原根。
对于模4的primitive_root=3,模9的primitive_root=2,5这些情况无法判断。
def find_primitive_root(n):
for base in range(1,n):
l=[]
for index in range(1,n):
l.append(pow(base,index,n))
if len(set(l))==n-1:
print('primitive root {} of {}'.format(base,n))
find_primitive_root(11)
# primitive root 2 of 11
# primitive root 6 of 11
# primitive root 7 of 11
# primitive root 8 of 11
mod 9的情况
1, 2, 3, 4, 5, 6, 7, 8
1 [1, 1, 1, 1, 1, 1, 1, 1]
2 [2, 4, 8, 7, 5, 1, 2, 4]
3 [3, 0, 0, 0, 0, 0, 0, 0]
4 [4, 7, 1, 4, 7, 1, 4, 7]
5 [5, 7, 8, 4, 2, 1, 5, 7]
6 [6, 0, 0, 0, 0, 0, 0, 0]
7 [7, 4, 1, 7, 4, 1, 7, 4]
8 [8, 1, 8, 1, 8, 1, 8, 1]
phi(9)=3*2=6
2,4,5,7,8都符合,但是只有2,5模9的阶为6。
4模9的阶=3,7模9的阶=3,8模9的阶=2,不符合定义。
所以只有2,5为模9的原根。
判断[2,phi(n)-1]范围内是否有1即可
勉强能用,euler_phi抄的知乎大佬的。
import math
def euler_phi(n):
phi = [0] * (n + 1)
phi[1] = 1
for i in range(2, n + 1):
if phi[i] == 0:
phi[i] = i - 1
for j in range(2 * i, n + 1, i):
if phi[j] != 0:
phi[j] = phi[j] // i * (i - 1)
else:
phi[j] = j // i * (i - 1)
return phi[n]
def find_primitive_root(n):
for base in range(1,n):
l=[]
for index in range(1,n):
l.append(pow(base,index,n))
if len(set(l))==n-1:
print('primitive root {} of {}'.format(base,n))
def find_primitive_root_with_euler(n):
for base in range(1,n):
l=[]
for index in range(1,n):
if math.gcd(base,n)!=1:
continue
l.append(pow(base,index,n))
if len(set(l))==euler_phi(n):
print('primitive root {} of {}'.format(base,n))
for each in range(1,14):
print(each)
find_primitive_root_with_euler(each)
print()
参考资料:A046147 - OEIS
table--20以内的数的原根
2
primitive root 1 of 2
3
primitive root 2 of 3
4
primitive root 3 of 4
5
primitive root 2 of 5
primitive root 3 of 5
6
primitive root 5 of 6
7
primitive root 3 of 7
primitive root 5 of 7
8
9
primitive root 2 of 9
primitive root 5 of 9
10
primitive root 3 of 10
primitive root 7 of 10
11
primitive root 2 of 11
primitive root 6 of 11
primitive root 7 of 11
primitive root 8 of 11
12
13
primitive root 2 of 13
primitive root 6 of 13
primitive root 7 of 13
primitive root 11 of 13
14
primitive root 3 of 14
primitive root 5 of 14
15
16
17
primitive root 3 of 17
primitive root 5 of 17
primitive root 6 of 17
primitive root 7 of 17
primitive root 10 of 17
primitive root 11 of 17
primitive root 12 of 17
primitive root 14 of 17
18
primitive root 5 of 18
primitive root 11 of 18
19
primitive root 2 of 19
primitive root 3 of 19
primitive root 10 of 19
primitive root 13 of 19
primitive root 14 of 19
primitive root 15 of 19
20