/
ord_of_am.py
97 lines (89 loc) · 2.53 KB
/
ord_of_am.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
from exp_mod import exp_mod
from gcd import ext_gcd
from euler import euler
from factoring import factoring
def ord_of_am(a, m):
# a,m需互素
if ext_gcd(a, m)[0] == 1:
euler_ = euler(m)
for _ in range(1, euler(m)):
# 指数整除euler(m)
if euler_ % _ == 0:
mod = exp_mod(a, _, m)
if mod == 1:
return _
return euler(m)
def primitive_root(p):
euler_ = euler(p)
for _ in range(2, p):
if ord_of_am(_, p) == euler_:
# print(_)
return _
# print(_,end=',')
# print('\n')
def all_primitive_roots(p):
root = primitive_root(p)
euler_ = euler(p)
root_list = []
for _ in range(2, euler_):
# 指数与euler(m)互素
if ext_gcd(_, euler_)[0] == 1:
root_list.append(_)
# print(_, end=',')
return root_list
# print(euler(20000))
# print(ord_of_am(11,20000))
# primitive_root(2000)
# print(all_primitive_roots(9973))
# print(17)
# for _ in range(2, 17):
# print(_, "的指数是", ord_of_am(_, 17))
# print(19)
# for _ in range(2, 19):
# print(_, "的指数是", ord_of_am(_, 19))
# print(21)
# for _ in range(2, 21):
# if ext_gcd(_, 21)[0] == 1:
# print(_, "的指数是", ord_of_am(_, 21))
# print(25)
# for _ in range(2, 25):
# if ext_gcd(_, 25)[0] == 1:
# print(_, "的指数是", ord_of_am(_, 25))
# g = 19
# print('a')
# print(ord_of_am(exp_mod(g, 10, 191),191))
# print(ord_of_am(exp_mod(g, 19, 191),191))
# print(ord_of_am(exp_mod(g, 10+19, 191),191))
# print('b')
# print(ord_of_am(exp_mod(g, 10, 191),191))
# print(ord_of_am(exp_mod(g, 11, 191),191))
# print(ord_of_am(exp_mod(g, 10+11, 191),191))
# a = 10
# b = 11
# a15 = exp_mod(a, 10, 3631)
# b11 = exp_mod(b, 11, 3631)
# print('c')
# print(ord_of_am(a15,3631))
# print(ord_of_am(b11,3631))
# print(ord_of_am(a15*b11,3631))
# num_list1 = [17,19,191,311,313,2011,2017]
# num_list = [2017]
# for p in num_list:
# print(p,"的原根是",end=":")
# euler_ = euler(p)
# for _ in range(2, p):
# if ord_of_am(_, p) == euler_:
# print(_)
# break
# # print(_,end=',')
# # print('\n')
# l = [17, 19, 191, 311, 313, 2011, 2017]
# for p in l:
# g = primitive_root(p)
# flag = exp_mod(g, p-1, p*p)
# flag = (flag - 1) // p
# flag = ext_gcd(flag, p)[0]
# if flag == 1:
# print("模p^2原根:", g, "模p^α原根:", g)
# else:
# print("模p^2原根:", g+p, "模p^α原根:", g+p)