commit fe5b1e69a3b219d548a8b8b044660e9c936645cc
parent 0e71e0bcb65dc464350abebe171fb7984280fbba
Author: Sebastiano Tronto <sebastiano.tronto@gmail.com>
Date:   Fri, 27 Sep 2019 13:10:41 +0200
Fixed a bug in parameters_Q4
Diffstat:
1 file changed, 26 insertions(+), 15 deletions(-)
diff --git a/kummer_degree.sage b/kummer_degree.sage
@@ -288,7 +288,12 @@ def l_adic_failure_from_data( B, l, tablel, M, N ):
 # Returns the l-dvisibility parameters of G over Q, given a good basis b of
 # G, as a list of pairs (di,hi).
 def parameters_Q( b, l ):
-    return [x for a in [[(i,0)]*len(b[i]) for i in range(len(b))] for x in a]
+    if l != 2:
+        return [x for a in [[(i,0)]*len(b[i]) for i in range(len(b))] \
+                for x in a]
+    else:
+        return [x for a in [[(i,1-max(0,sgn(g))) for g in b[i]] \
+                for i in range(len(b))] for x in a]
 
 # Computes the l-divisibility parameters of G over Q4, given a good basis gb
 # over Q for G. Returns a list of pairs (di,hi).
@@ -309,31 +314,37 @@ def parameters_Q4( gb, l ):
 
         # Computing a combination of bb elements of the form 2 * square.
         MM = exponent_matrix( bb + [2] ).change_ring( GF( 2 ) ) 
-
+        
         for a in MM.kernel().basis():
             if a[-1] != 0:
                 # the vector a[0:-1] gives the coefficients for a combination
-                # of the b_i's of the form 2 * square
+                # of the b_i's of the form 2 * square.
                 
-                # Basis elements that actually appear in the combination
-                c = [ b[i] for i in range(len(a[0:-1])) if a[i] != 0 ]
+                # Index of asis elements that do appear in the combination
+                c = [ i for i in range(len(a[0:-1])) if a[i] != 0 ]
+                
+                # Change of basis to include the element of the form 
+                # 2 * square to some power.
+                div_max = -1
+                i_max = -1
+                for j in c:
+                    if divisibility(M[j],2) > div_max:
+                        div_max = divisibility(M[j],2)
+                        i_max = j
+                b[i_max] = prod([b[j]^(2^(div_max-divisibility(M[j],2))) \
+                                 for j in c])
+                M = exponent_matrix(b)
 
                 # Return the parameters, changing only those of the element
                 # of highest divisibility that appears in the combination.
-                ret = []
-                div_max = -1
-                ind_max = -1
-                for i in range(len(b)):
-                    ret.append( (divisibility(M[i],2), 1-max(0,sgn(b[i]))) )
-                    if a[i] != 0 and ret[i][0] > div_max:
-                        div_max = ret[i][0]
-                        ind_max = i
-                d1, h1 = ret[ind_max]
+                ret = [(divisibility(M[i],2),1-max(0,sgn(b[i]))) \
+                        for i in range(len(b)) ]
+                d1, h1 = ret[i_max]
                 if d1 == 1:
                     h1 = 1 - h1
                 elif d1 == 0:
                     h1 = 2
-                ret[ind_max] = ( d1+1, h1 )
+                ret[i_max] = ( d1+1, h1 )
 
                 return ret