Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sagemathinc
GitHub Repository: sagemathinc/wapython
Path: blob/main/python/bench/src/p1list.py
1067 views
1
from bench import register, all
2
from nt import gcd, xgcd, inverse_mod
3
4
5
def p1_normalize(N, u, v, compute_s=False):
6
if N == 1:
7
return [0, 0, 1]
8
9
u = u % N
10
v = v % N
11
if u < 0: u = u + N
12
if v < 0: v = v + N
13
if u == 0:
14
return [0, 1 if gcd(v, N) == 1 else 0, v]
15
16
[g, s, t] = xgcd(u, N)
17
s = s % N
18
if s < 0: s = s + N
19
if gcd(g, v) != 1:
20
return [0, 0, 0]
21
22
# Now g = s*u + t*N, so s is a "pseudo-inverse" of u mod N
23
# Adjust s modulo N/g so it is coprime to N.
24
if g != 1:
25
d = N // g
26
while gcd(s, N) != 1:
27
s = (s + d) % N
28
29
# Multiply [u,v] by s; then [s*u,s*v] = [g,s*v] (mod N)
30
u = g
31
v = (s * v) % N
32
33
min_v = v
34
min_t = 1
35
if g != 1:
36
Ng = N // g
37
vNg = (v * Ng) % N
38
t = 1
39
for k in range(2, g + 1):
40
v = (v + vNg) % N
41
t = (t + Ng) % N
42
if v < min_v and gcd(t, N) == 1:
43
min_v = v
44
min_t = t
45
v = min_v
46
if u < 0: u = u + N
47
if v < 0: v = v + N
48
if compute_s:
49
s = inverse_mod(s * min_t, N)
50
else:
51
s = 0
52
return [u, v, s]
53
54
55
def p1_normalize_many_times(n=10**5):
56
s = 0
57
for a in range(n):
58
s += p1_normalize(46100, 39949, a)[0]
59
return s
60
61
62
register("p1_normalize_many_times", p1_normalize_many_times)
63
64
if __name__ == '__main__':
65
all('p1list')
66
67