Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
241852 views
1
2
#######################################################################################
3
# Compute local splitting at 2 by successive lifting argument.
4
#######################################################################################
5
"""
6
This is on pages 9-10 of my research notes on 2010-11-07.
7
8
The mod-2 splitting must be done differently because I,J do *not*
9
generate the icosian ring over O_F, because of the 2's in the
10
denominator.
11
12
The icosian ring has generators given above, call them w0,w1,w2,w3. Using linear algebra
13
we find that w0^2=w0-1, w1^2=-1, w2^2=-1, w3^2=-1. Moreover, and most importantly, we have
14
letting g=(1+sqrt(5))/2, that
15
16
w0 = (g-1)*(2*g*w3 - w1 - w2 - w1*w2)
17
w3 = g*w0 + w2*w1
18
19
Thus mod 2, w0 and w3 are completely determined by w1 and w2.
20
Also, because of the 2 coefficient of w3 in the first equation,
21
modulo 2^i, w0 and w3 are completely determined if we know w1, w2, and w3 mod 2^(i-1).
22
23
We have several functions below. The one called find_mod2_splitting iterates
24
through all of M_2(O/2O) finding the possibilities for w1 and w2, i.e., matrices
25
with square minus 1. For each, we let w0 and w3 be the corresponding matrices
26
given by the above formulas, verify that we get four independent matrices, and
27
that the minpoly conditions on w0 and w3 hold. We thus construct a matrix
28
algebra Alg over F_4 satisfying all the above relations, and get a map R -->> Alg.
29
30
[[I have some worry though -- what if somehow not *all* the right relations hold?!]]
31
32
Next we lift from mod p^(i-1) to mod p^i. This uses the following algebra.
33
Suppose A^2 = -1 (mod 2^(i-1)) and (A+2^(i-1)*B)^2 = -1 (mod 2^i).
34
Then A^2+2^(i-1)(AB+BA) + 2^(2(i-1))*B^2=-1 (mod 2^i).
35
Thus (-1+2^(i-1)*C) + 2^i*(AB+BA) = -1 (mod 2^i)
36
So we need C + AB + BA = 0 (mod 2), where C = (A^2+1)/2^i in Mat(O/2O).
37
38
To find the B's with this property, we just loop through Mat(O/2O), and test
39
the condition C+AB+BA in Mat(O/2O).
40
41
TODO: This implementation is slow. This is since matrix arithmetic is
42
generic, and generic matrix arithmetic is double dog slow (100 times
43
too slow). I think the algorithm itself is solid.
44
"""
45
46
from sqrt5_fast import ResidueRing
47
from sage.matrix.all import MatrixSpace, matrix
48
from sqrt5 import F, B, icosian_ring_gens
49
from sage.misc.all import cached_function
50
51
@cached_function
52
def find_mod2_splitting():
53
P = F.primes_above(2)[0]
54
k = P.residue_field()
55
M = MatrixSpace(k,2)
56
V = k**4
57
g = k.gen() # image of golden ratio
58
59
m1 = M(-1)
60
sqrt_minus_1 = [(w, V(w.list())) for w in M if w*w == m1]
61
one = M(1)
62
v_one = V(one.list())
63
for w1, v1 in sqrt_minus_1:
64
for w2, v2 in sqrt_minus_1:
65
w0 = (g-1)*(w1+w2 - w1*w2)
66
w3 = g*w0 + w2*w1
67
if w0*w0 != w0 - 1:
68
continue
69
if w3*w3 != -1:
70
continue
71
if V.span([w0.list(),v1,v2,w3.list()]).dimension() == 4:
72
return w0, w1, w2, w3
73
74
def matrix_lift(A):
75
R = A.base_ring()
76
return matrix(A.nrows(),A.ncols(),[R.lift(x) for x in A.list()])
77
78
@cached_function
79
def find_mod2pow_splitting(i):
80
P = F.primes_above(2)[0]
81
if i == 1:
82
R = ResidueRing(P, 1)
83
M = MatrixSpace(R,2)
84
return [M(matrix_lift(a).list()) for a in find_mod2_splitting()]
85
86
R = ResidueRing(P, i)
87
M = MatrixSpace(R,2)
88
# arbitrary lift
89
wbar = [M(matrix_lift(a).list()) for a in find_mod2pow_splitting(i-1)]
90
91
# Find lifts of wbar[1] and wbar[2] that have square -1
92
k = P.residue_field()
93
Mk = MatrixSpace(k, 2)
94
95
t = 2**(i-1)
96
s = M(t)
97
98
L = []
99
for j in [1,2]:
100
C = Mk(matrix_lift(wbar[j]**2 + M(1)) / t)
101
A = Mk(matrix_lift(wbar[j]))
102
# Find all matrices B in Mk such that AB+BA=C.
103
L.append([wbar[j]+s*M(matrix_lift(B)) for B in Mk if A*B + B*A == C])
104
105
g = M(F.gen())
106
t = M(t)
107
two = M(2)
108
ginv = M(F.gen()**(-1))
109
for w1 in L[0]:
110
for w2 in L[1]:
111
w0 = ginv*(two*g*wbar[3] -w1 -w2 - w1*w2)
112
w3 = g*w0 + w2*w1
113
if w0*w0 != w0 - M(1):
114
continue
115
if w3*w3 != M(-1):
116
continue
117
return w0, w1, w2, w3
118
119
raise ValueError
120
121
122
123
124
125