commit 1437da00eeb4a7581df1b54ffc7680ffb491d690
parent fe5b1e69a3b219d548a8b8b044660e9c936645cc
Author: Sebastiano Tronto <sebastiano.tronto@gmail.com>
Date: Mon, 15 Feb 2021 11:30:51 +0100
Fixed for python3
Diffstat:
13 files changed, 2624 insertions(+), 258 deletions(-)
diff --git a/kummer_degree.sage b/kummer_degree.sage
@@ -1,16 +1,3 @@
-#############################################################################
-# This program allows one to compute the degree of certain field extensions #
-# of the rational numbers. In particular, it can compute the degree over Q #
-# of extensions of the form Q( sqrt[N](G), \zeta_M ), where: #
-# - N and M are integers with N dividing M; #
-# - G is a finitely generated subgroup of the multiplicative group of Q #
-# - \zeta_M is a primitive M-th root of unity #
-# The group G does not have to be given in a particular format. A finite #
-# set of generators is sufficient. #
-#############################################################################
-
-from sage.misc.cachefunc import CachedFunction
-
# Computes the "adelic Kummer failure", i.e. the degrees of the intersection
# of the the Kummer extension Q(\sqrt{2^n}{G}) with the M-th cyclotomic field
# over Q_{2^n}.
@@ -18,12 +5,12 @@ from sage.misc.cachefunc import CachedFunction
# Input: a good basis B for the torsion-free group G, organized as a list of
# lists, and a non negative integer d. They have to satisfy the following:
# 1. Each list B[i] contains all basis elements of 2-divisibility i.
-# 2. The basis given by B is 2-maximal, that is to say it satisfies Theorem
-# 14 of Debry-Perucca; i.e. each element of B[i] is, up to plus or minus
-# 1, the 2^i-th power of a strongly 2-indivisible rational.
+# 2. The basis given by B is 2-maximal, that is to say it satisfies Theorem 14
+# of Debry-Perucca; i.e. each element of B[i] is, up to plus or minus 1, the
+# 2^i-th power of a strongly 2-indivisible rational.
# 3. For i != d every element of B[i] is positive, and B[d][0] is the only
# negative element of B[d] (if d=-1, then there is no negative element).
-# 3'. Notice that the existence on negative elements in B[0] does not change
+# 3'. Notice that the existence on negative elements in B[0] does not influence
# the correctness of the algorithm; in fact, the function adjust_sign
# produces a basis that may have negative elements of divisibility 0, and
# this basis is given as input for adelic_failure_gb.
@@ -32,9 +19,9 @@ from sage.misc.cachefunc import CachedFunction
# integer such that the intersection of Q(\sqrt{2^n}{G}) with Q_\infty is
# contained in Q_M0.
# The table ad_fail has N rows, where N is defined below.
-# Each row R=ad_fail[i] contains a variable number of pairs (d,r), where d
-# is a divisor of M0 and r is the degree of Q(\sqrt{2^{i+1}}{G}) \cap Q_d
-# over Q_{2^n}.
+# Each row R=ad_fail[i] contains a variable number of pairs (d,r), where d is a
+# divisor of M0 and r is the degree of Q(\sqrt{2^{i+1}}{G}) \cap Q_d over
+# Q_{2^n}.
# Each divisor of M appears at most once on each row, and the last element of
# the last row is of the form (M0,r0).
def adelic_failure_gb( B, d ):
@@ -42,48 +29,48 @@ def adelic_failure_gb( B, d ):
# The table to be returned (or printed at the end), as described above.
ad_fail = []
- # N is such that for every n > N the adelic failure of Q(\sqrt{2^n}{G})
- # is the same as that of Q(\sqrt{2^N}{G}).
- # We always have to include n=3, because of problem with sqrt(2) in Q_8
- # (in theory, this is not necessary in some cases, e.g. if 2 does not
- # divide any element of G).
- # If the negative generator is on the last level, we need to increase N
- # by 1, because it would contribute to the shortlist in the next level
- # (by taking the root of an even power).
+ # N is such that for every n > N the adelic failure of Q(\sqrt{2^n}{G}) is
+ # the same as that of Q(\sqrt{2^N}{G}).
+ # We always have to include n=3, because of problem with sqrt(2) in Q_8 (in
+ # theory, this is not necessary in some cases, e.g. if 2 does not divide
+ # any element of G).
+ # If the negative generator is on the last level, we need to increase N by
+ # 1, because it would contribute to the shortlist in the next level (by
+ # taking the root of an even power).
if d == len(B)-1:
N = max(3,len(B)+1)
else:
N = max(3,len(B))
# The intersection is given by adding the square roots of the elements of
- # this shortlist (and a "special element", not always of the form sqrt d,
- # coming from taking a suitable root of a negative generator; this
- # special element is dealt with later). The shortlist grows at each step,
- # so we declare it before starting to loop over n and we build it
- # incrementally. The "special element" is of the form \zeta_{2^n}\sqrt b,
- # which we encode as (n,b). We use the value (1,1) (special element -1)
- # to say that there is no special element at this level.
+ # this shortlist (and a "special element", not always of the form sqrt(d),
+ # coming from taking a suitable root of a negative generator; this special
+ # element is dealt with later). The shortlist grows at each step, so we
+ # declare it before starting to loop over n and we build it incrementally.
+ # The "special element" is of the form \zeta_{2^n}\sqrt{b}, which we encode
+ # as (n,b). We use the value (1,1) (special element -1) to say that there
+ # isno special element at this level.
shortlist = []
special_element = (1,1)
# The integers M, giving the smallest cyclotomic field in which lies the
- # whole intersection with Q_\infty, grows with n. As with the shortlist,
- # we declare it here and increase it appropriately at each step.
+ # whole intersection with Q_\infty, also grows with n. As with the
+ # shortlist, we declare it here and increase it appropriately at each step.
M = 1
- for n in range( 1, N+1 ):
+ for n in range( 1, N+1 ): # 1 \leq n \leq N
# We add the new elements to the shortlist, modifying M if needed.
- # This is not done in case we are in the extra "fake" level (this
- # case dealt with immediately below).
+ # This is not done in case we are in the extra "fake" level (this case
+ # dealt with immediately below).
if n-1 < len(B):
for g in B[n-1]:
# Case of negative g
if g < 0 and n > 1:
# Special element of the form \zeta_{2^{n+1}}\sqrt(b).
- # It is contained in Q_{lcm(2^{n+1},cyc_emb(b))}, except
- # in case n=2 and b=2, in which case it is contained in
- # Q_4. We store it as as pair ( n+1, b ).
+ # It is contained in Q_{lcm(2^{n+1},cyc_emb(b))}, except in
+ # case n=2 and b=2, in which case it is contained in Q_4.
+ # We store it as as pair ( n+1, b ).
special_element = ( n+1, abs(g)^(1/(2^(n-1))) )
M = lcm( M, special_embed( special_element ) )
else:
@@ -91,8 +78,8 @@ def adelic_failure_gb( B, d ):
shortlist.append( b )
M = lcm( M, cyc_embed(b) )
- # We add a root of an even power of the negative generator, as soon
- # as we are beyond its level.
+ # We add a root of an even power of the negative generator, as soon as
+ # we are beyond its level.
if d != -1 and n == d+2:
b = abs(B[d][0])^(1/2^d)
shortlist.append( b )
@@ -114,20 +101,19 @@ def adelic_failure_gb( B, d ):
# For each divisor dM of M, compute the degree of the intersection of
# Q(\sqrt{2^n}{G}) with Q_dM over Q_{2^n}. We need to compute the
- # number r of elements in the subgroup of G generated by the
- # shortlist that lie in Q_dM. This is going to be a power of 2. The
- # sought degree will be r, up to considering some special cases
- # (described below).
+ # number r of elements in the subgroup of G generated by the shortlist
+ # that lie in Q_dM. This is going to be a power of 2. The sought degree
+ # will be r, up to considering some special cases (described below).
#
- # This algorithm could be inefficient for groups of big rank. It can
- # be improved by precomputing subgroups of G/G^2 and the cyclotomic
- # fields containing them.
+ # This algorithm could be inefficient for groups of big rank. It can be
+ # improved by precomputing subgroups of G/G^2 and the cyclotomic fields
+ # containing them.
aux = [] # Next line of ad_fail table
for dM in divisors( M ):
- # We only care of the intersection with Q_dM if it contains the
- # 2^n roots of unity.
+ # We only care of the intersection with Q_dM if it contains the 2^n
+ # roots of unity.
if dM % (2^n) != 0:
continue
@@ -144,7 +130,7 @@ def adelic_failure_gb( B, d ):
if n <= d and dM % (2^(n+1)) == 0 and n > 1:
r *= 2
- # We loose a factor of 2 if we have sqrt(2) in Q_8 or \zeta_8 in
+ # We loose a factor of 2 if we have sqrt(2) in Q_8 or \zeta_8 2 in
# Q_4.
if 8 in H and dM % 8 == 0 and (n >= 3 or (n == 2 and n <= d)):
r = r/2
@@ -153,11 +139,11 @@ def adelic_failure_gb( B, d ):
# We have to consider all possible special elements arising from
# multiplying the given element with the other elements of the
# shortlist.
- # If any of them is of the form \zeta_8 2q for q a square, there
- # is nothing to do: in fact \zeta_8 2 embeds in Q_4, which
- # coincides with Q_{2^n} (n must be 2); so we would double the
- # degree because of the existence of the special element, but
- # then we would loose another factor of 2 because of this.
+ # If any of them is of the form \zeta_8 2q for q a square, there is
+ # nothing to do: in fact \zeta_8 2 embeds in Q_4, which coincides
+ # with Q_{2^n} (n must be 2); so we would double the degree because
+ # of the existence of the special element, butthen we would loose
+ # another factor of 2 because of this.
if special_element != (1,1) and special_element[0] == n+1:
nothing_to_do = False
intersecting_QdM = False
@@ -184,8 +170,11 @@ def cyc_embed( b ):
m *= 4
return abs(m)
-# Computes the minimal cyclotomic field containing \zeta_{2^n}\sqrt(b).
-def special_embed( (n,b) ):
+# Computes the minimal cyclotomic field containing \zeta_{2^n}\sqrt(b),
+# where (n,b)=p
+def special_embed( p ):
+ n = p.first
+ n = p.second
m = squarefree_part(b)
if n == 3 and m % 2 == 0:
return 4 * cyc_embed(m/2)
@@ -201,7 +190,7 @@ def special_embed( (n,b) ):
# degree of Q_{l^m,l^n} over Q_{l^m}, where l = L[i]
def total_l_adic_failure( B ):
- bp = bad_primes(B)
+ bp = bad_primes( B )
ret = ( bp, [] )
for l in bp:
@@ -210,32 +199,35 @@ def total_l_adic_failure( B ):
return ret
# Computes the "bad primes", i.e. the ones for which the l-adic part is not
-# maximal. Used by total_l_adic_failure.
+# maximal. Used by l_adic_degree and total_l_adic_failure.
def bad_primes( B ):
M = exponent_matrix( B )
(a,b) = M.dimensions()
-
if a > b or M.rank() < a:
- print "This is not a basis"
+ print( "This is not a basis" )
return
# Compute which primes l divide all minors of the exponent matrix
- bad_p = list( prime_factors( gcd( M.minors(a) ) ) )
- if 2 not in bad_p:
- bad_p += [2] # 2 is always bad
-
- return sorted(bad_p) # Ensures 2 is always first
+ ms = M.minors( a )
+ d = ms[0]
+ for m in ms:
+ d = gcd( d, m )
+ bad_primes = list( prime_factors( d ) )
+ if 2 not in bad_primes:
+ bad_primes += [2] # 2 is always bad
+ bad_primes.sort() # Ensures 2 is always first
+
+ return bad_primes
-# Computes the l-adic failure for a specific l. Returns a "table" as
-# described above "total_l_adic_failure".
+# Computes the l-adic failure for a specific l. Returns a "table" as described
+# above "total_l_adic_failure".
# B is any basis for G.
def l_adic_failure( B, l ):
r = len(B)
GB = make_good_basis( B, l )
- # Computes the parameters for G over Q4. For l odd, they are the same as
- # over Q.
+ # Computes the parameters over Q4. For l odd, they are the same as over Q.
p = parameters_Q4( GB, l )
maxM = max( [ sum(x) for x in p ] )
maxN = max( maxM, len(GB)-1 )
@@ -277,6 +269,7 @@ def l_adic_failure_from_data( B, l, tablel, M, N ):
return 1
r = len(B)
+ # Basically, the "dual" of what we do in l_adic_degree.
if m > len(tablel):
if n > len(tablel):
return l^tablel[-1][1]
@@ -285,70 +278,127 @@ def l_adic_failure_from_data( B, l, tablel, M, N ):
return l^(r*n-tablel[m-1][0][n-1])
-# 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 ):
- 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
+# Computes the l-divisibility parameters of G over Q4, given a good basis b
# over Q for G. Returns a list of pairs (di,hi).
# If l is odd it just uses the good basis given to compute the parameters.
-# If l=2, it uses the results of PST-2.
def parameters_Q4( gb, l ):
+ # Converts from "good basis format" to simple list
+ b = []
+ for x in gb:
+ b += x
+ ret = []
+
if l != 2:
- return parameters_Q( gb, l )
+ for i in range( len( gb ) ):
+ for j in gb[i]:
+ ret.append( (i,0) )
+ return ret
else:
- # Converts from "good basis format" to simple list
- b = [ x for a in gb for x in a ]
-
- M = exponent_matrix( b )
-
- # Thanks to my bad notation, the elements of b are what are called
- # g_i in the article, while the elements of bb will be the b_i's.
- bb = [ abs(b[i])^(2^(-divisibility(M[i],2))) for i in range(len(b)) ]
-
- # Computing a combination of bb elements of the form 2 * square.
- MM = exponent_matrix( bb + [2] ).change_ring( GF( 2 ) )
+ R.<y> = PolynomialRing( QQ )
+ pol = R(y^2+1)
+ Q4.<eye> = NumberField( pol ) # I already use i for other things
+
+ # Factorize basis elements over Q4 and so on.
+ d = []
+ B = []
+ h = []
+ ideals_list = set()
+ M = [] # Exponent matrix of the Bi's
+
+ # Pre-process to find all ideals appearing in the factorization and fix
+ # a chosen generator for each of them. This is important in order to
+ # compute the "sign" (h-parameter) of an element with respect to it Bi.
+ for g in b:
+ factorization_list = list( Q4.ideal(g).factor() )
+ ideals_list |= set( [ x[0] for x in factorization_list ] )
+ ideals_list = list( ideals_list )
+ # Chooses a generator of each principal ideal in the list
+ irreducibles_list = [ J.gens_reduced()[0] for J in ideals_list ]
+
+ # Compute the Q4-parameters of the given basis b. Also computes the
+ # exponent matrix of the Bi's
+ for g in b:
+ factorization_list = list( Q4.ideal(g).factor() )
+ exps = [ x[1] for x in factorization_list ]
+ d.append( divisibility( exps, l ) )
+ Bg = 1
+ for j in range(len(factorization_list)):
+ a = 0
+ for i in range( len( ideals_list ) ):
+ if ideals_list[i] == factorization_list[j][0]:
+ a = irreducibles_list[i]
+ break
+ Bg *= a ^ (exps[j]/(l^d[-1]))
+ B.append(Bg)
+ u = g / (Bg^(l^d[-1]))
+ if not u.is_unit():
+ print( "Error: g is not the right power of the computed Bg." )
+ print( "g:", g, ", Bg:", Bg, ", exponent:", l^d[-1] )
+ if u == 1:
+ h.append( 0 )
+ elif u == -1:
+ h.append( 1 )
+ else:
+ h.append( 2 )
+
+ # Make the exponent matrix M (for now as a list of rows)
+ for g in B:
+ row = [0] * len(ideals_list)
+ for i in range(len(ideals_list)):
+ I = ideals_list[i]
+ ee = 1
+ while (I^ee).divides(g):
+ ee += 1
+ row[i] = ee-1
+ M.append(row)
+
+ # If the Bi's are not strongly independent, apply the algorithm (only
+ # once) to produce a new basis. The new basis has maximal parameters.
+ coeffs = find_combination( matrix(M), l )
+ if coeffs != []:
+
+ maxi = -1
+ maxd = -1
+ for i in range(len(d)):
+ if d[i] > maxd and coeffs[i] != 0:
+ maxd = d[i]
+ maxi = i
+
+ x = [(a/coeffs[maxi]).lift() for a in coeffs] # Now a vector of int
+
+ new_element = 1
+ for i in range(len(d)):
+ new_element *= b[i]^( x[i] * l^(d[maxi]-d[i]) )
- 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.
-
- # 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 = [(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[i_max] = ( d1+1, h1 )
-
- return ret
-
- return parameters_Q( gb, 2 )
+ b[maxi] = new_element
+
+ # Compute new B, d and so on.
+ factorization_list = list( Q4.ideal(b[maxi]).factor() )
+ exps = [ x[1] for x in factorization_list ]
+ d[maxi] = divisibility( exps, l )
+ Bg = 1
+
+ for j in range(len(factorization_list)):
+ a = 0
+ for i in range( len( ideals_list ) ):
+ if ideals_list[i] == factorization_list[j][0]:
+ a = irreducibles_list[i]
+ break
+ Bg *= a ^ (exps[j]/(l^d[maxi]))
+ B[maxi] = Bg
+ M[maxi] = [ x[1] for x in list( Q4.ideal(Bg).factor() ) ]
+ u = b[maxi] / (Bg^(l^d[maxi]))
+ if not u.is_unit():
+ print( "Error: new element is not the right power of B." )
+ print( "New el.:",b[maxi],", B:",Bg,", exponent:",l^d[maxi] )
+ if u == 1:
+ h[maxi] = 0
+ elif u == -1:
+ h[maxi] = 1
+ else:
+ h[maxi] = 2
+
+ return [(d[i],h[i]) for i in range(len(d))]
# Uses Theorem 18 to compute the degree of Kummer extensions.
def compute_vl( p, n, m, r ):
@@ -358,26 +408,16 @@ def compute_vl( p, n, m, r ):
return M - m + r*n - sum( ni )
-# Computes a basis for G from a frozen_set of generators.
-# Returns a pair (B,torsion) where B is a list of rational numbers and
-# torsion is true if -1 is in G and false otherwise.
-@CachedFunction
-def generators_to_basis( G ):
- (BM,BM_primes) = exponent_matrix_with_sign_and_primes( list(G) )
- BM = BM.echelon_form()
- BM_primes.append(-1)
-
- B = [prod([BM_primes[i]^r[i] for i in range(len(r))]) for r in BM.rows()]
-
- return ( [ x for x in B if abs(x) != 1 ], -1 in B )
-
-
# Given any basis b of a group G computes an l-good basis for G. This is done
# using the algorithm outlined in the proof of Theorem 14 of (Debry-Perucca).
def make_good_basis( b, l ):
M = exponent_matrix( b )
- d = [ divisibility(x,l) for x in M ]
- B = [ abs(b[i])^(1/(l^d[i])) for i in range(len(b)) ]
+ d = []
+ B = []
+ for i in range(len(b)):
+ di = divisibility( M[i], l )
+ d.append( di )
+ B.append( abs(b[i])^(1/(l^di)) )
# Computes the coeffiecients of a linear combination of the rows of M
# that is zero modulo l. These coefficients are elements of F_l.
@@ -385,8 +425,8 @@ def make_good_basis( b, l ):
while coeffs != []:
- # Computes which basis element (with non-zero coefficient in the
- # linear combination above) has maximal divisibility.
+ # Computes which basis element (with non-zero coefficient in the linear
+ # combination above) has maximal divisibility.
maxi = -1
maxd = -1
for i in range(len(d)):
@@ -394,24 +434,31 @@ def make_good_basis( b, l ):
maxd = d[i]
maxi = i
- x = [ (a/coeffs[maxi]).lift() for a in coeffs ] # Now a vector of int
+ x = [ (a/coeffs[maxi]).lift() for a in coeffs ] # Now a vector of ints
- new_elt = prod([b[i]^(x[i]*l^(d[maxi]-d[i])) for i in range(len(d))])
+ new_element = 1
+ for i in range(len(d)):
+ new_element *= b[i]^( x[i] * l^(d[maxi]-d[i]) )
- b[maxi] = new_elt
+ b[maxi] = new_element
M = exponent_matrix( b )
d[maxi] = divisibility( M[maxi], l )
B[maxi] = abs(b[maxi])^(1/(l^d[maxi]))
coeffs = find_combination( exponent_matrix( B ), l )
- return [[b[i] for i in range(len(b)) if d[i]==j] for j in range(max(d)+1)]
-
-# Takes a good basis B and adjusts the sign of the elements so that there is
-# at most one negative generator (of positive divisibility). The input is a
-# good basis in the format returned by make_good_basis.
-# Returns a pair (B,d), where B is the updated basis and d is the
-# divisibility parameter of the only negative element remained.
+ GB = [[]]
+ for i in range(len(d)):
+ while( len(GB) <= d[i] ):
+ GB.append([])
+ GB[d[i]].append(b[i])
+ return GB
+
+# Takes a good basis B and adjusts the sign of the elements so that there is at
+# most one negative generator (of positive divisibility). The input is a good
+# basis in the format returned by make_good_basis.
+# Returns a pair (B,d), where B is the updated basis and d is the divisibility
+# parameter of the only negative element remained.
# The sign of the d=0 elements is just ignored in the other steps of the
# algorithm, so we keep them negative.
def adjust_sign( B ):
@@ -430,7 +477,6 @@ def adjust_sign( B ):
# Given the exponent matrix M of a list of rational numbers B, returns the
# coefficients of a linear combination that is weakly l-divisible, or [] if
# the B[i] are strongly l-independent.
-@CachedFunction
def find_combination( M, l ):
M = M.change_ring( GF( l ) )
if M.rank() != min( M.dimensions() ):
@@ -443,8 +489,8 @@ def find_combination( M, l ):
# Returns the minimal l-valuation of the exponents.
def divisibility( A, l ):
if len(A) == 0:
- print "Warning: computing the divisibility of a torsion element.",
- print "Returning +Infinity."
+ print( "Warning: computing the divisibility of a torsion element.", end="" )
+ print( "Returning +Infinity." )
return +Infinity
return min( [ valuation( x, l ) for x in A ] )
@@ -469,10 +515,11 @@ def exponent_matrix( B ):
# Returns a pair (M,L) where M is the modified exponent matrix and L is the
# list of primes appearing in the factorization.
def exponent_matrix_with_sign_and_primes( B ):
-
- prime_list = list({x for a in [prime_factors(g) for g in B] for x in a})
+ prime_list = set()
+ for g in B:
+ prime_list |= set( prime_factors( g ) )
+ prime_list = list( prime_list )
np = len( prime_list )
-
rows = []
for g in B:
rowg = [0] * np
@@ -480,19 +527,21 @@ def exponent_matrix_with_sign_and_primes( B ):
for i in range( np ):
if f[0] == prime_list[i]:
rowg[i] = f[1]
- rowg.append( 1 - max(0,sgn(g)) )
+ s = 0
+ if sgn(g) == -1:
+ s = 1
+ rowg.append( s )
rows.append( rowg )
return ( matrix( rows ), prime_list )
-# The function TotalKummerFailure (with its many wrapper functions) computes
-# the total table of Kummer Failures for the given group G. Moreover, the
-# result is cached for speeding up following computations on the same group,
-# even if the same group is given with a different set of generators.
-#
+# This is a wrapper function for total_kummer_failure( G, True ), see below.
+def TotalKummerFailure( G ):
+ total_kummer_failure( G, True )
+
# Input: any set of generators for a subgroup G of Q*.
# If output=False, returns a 4-uple (t,MM,NN,D):
-# - t is a pair, where t[0] is the rank of G and t[1] is either True (if G
-# has torsion) or False (is it does not).
+# - t is a pair, where t[0] is the rank of G and t[1] is either True (if G has
+# torsion) or False (is it does not).
# - MM is the pair (M0,divisors(M0))
# - NN is the pair (N0,divisors(N0))
# - D is a table F, where F[j][i] is the ration between phi(m)n^r and the
@@ -501,34 +550,42 @@ def exponent_matrix_with_sign_and_primes( B ):
# computed for a torsion-free part of G.
# If output is True, outputs this data in a human-readable way and does not
# return any value.
+def total_kummer_failure( G, output ):
-def TotalKummerFailure( G ):
- total_kummer_failure( G, True )
+ # Computing a basis.
+ (BM,BM_primes) = exponent_matrix_with_sign_and_primes( G )
+ BM = BM.echelon_form()
+ BM_primes.append(-1)
+ B = []
+ torsion = False
+
+ for r in BM.rows():
+ gr = product( [ BM_primes[i]^r[i] for i in range(len(r)) ] )
+ if gr == -1:
+ torsion = True
+ break
+ elif gr == 1:
+ break
+ else:
+ B.append(gr)
-@CachedFunction
-def total_kummer_failure_cachable( G ):
- B, torsion = generators_to_basis( G )
- return total_kummer_failure_cachable_basis( tuple(B), torsion )
+ if len(B) == 0:
+ print( "G is torsion. The extension is cyclotomic. Stopping." )
+ return False
-@CachedFunction
-def total_kummer_failure_cachable_basis( B, torsion ):
- B = list(B)
r = len(B) # Rank of G
- if r == 0:
- print "G is torsion. The extension is cyclotomic. Stopping."
- return False
-
# Compute l-adic data (straightforward)
- ( bad_p, l_adic_failure_table ) = total_l_adic_failure( B )
+ ( bad_primes, l_adic_failure_table ) = total_l_adic_failure( B )
# Compute adelic data.
(GB,d) = adjust_sign( make_good_basis( B, 2 ) )
adelic_failure_table = adelic_failure_gb( GB, d )
# Computing the bounds M0 and N0
- N0 = prod( [ bad_p[i] ^ len( l_adic_failure_table[i][-1][0] ) \
- for i in range(len(bad_p)) ] )
+ N0 = 1
+ for i in range(len( bad_primes )):
+ N0 *= bad_primes[i] ^ len( l_adic_failure_table[i][-1][0] )
# Extra factors of 2 may come from the adelic failure
N0 = lcm( N0, 2^len( adelic_failure_table ) )
divs_N0 = divisors(N0)
@@ -555,20 +612,16 @@ def total_kummer_failure_cachable_basis( B, torsion ):
FT[j][l] = lcm( FT[j][l], pp[1] )
# Adding l-adic failure to the table
- for i in range( len( bad_p ) ):
- l = bad_p[i]
+ for i in range( len( bad_primes ) ):
+ l = bad_primes[i]
for j in range(len(divs_N0)):
dN = divs_N0[j]
fl = l_adic_failure_from_data(B,l,l_adic_failure_table[i],dN,dN)
for h in range(len(divs_M0)):
FT[j][h] *= fl
- return ( ( r, torsion ), ( M0, divs_M0 ), ( N0, divs_N0 ), FT )
+ ret = ( ( r, torsion ), ( M0, divs_M0 ), ( N0, divs_N0 ), FT )
-def total_kummer_failure( G, output ):
-
- ret = total_kummer_failure_cachable( frozenset(G) )
-
if output:
print_total_table( ret )
# Uncomment following line for case list description.
@@ -581,9 +634,9 @@ def total_kummer_failure( G, output ):
# as the ration between 2^eN^r and the degree of Q_{M,N} over Q_M, where e=1
# if N is even and e=0 otherwise.
-# Makes the failure table for the torsion case when M/N is even. In this
-# case an entry of the table is doubled if the corresponding value of N
-# (actually, of gcd(N,N0) ) is even, and is kept the same otherwise.
+# Makes the failure table for the torsion case when M/N is even. In this case,
+# an entry of the table is doubled if the corresponding value of N (actually,
+# of gcd(N,N0) ) is even, and is kept the same otherwise.
# The expected degree (over Q) 2^e * phi(M) * N^r, where e=1 if N is even and
# e=0 otherwise.
def torsion_table_even( data ):
@@ -600,8 +653,8 @@ def torsion_table_even( data ):
# Makes the failure table for the torsion case when M/N is odd. In this case
# the entry at (M,N) is taken from the torsion-free entry at (2M,N).
-# In other words, the expected degree (over Q) 2^e * phi(M) * N^r, where e=1
-# if N is even and e=0 otherwise.
+# In other words, the expected degree (over Q) 2^e * phi(M) * N^r, where e=1 if
+# N is even and e=0 otherwise.
def torsion_table_odd( data ):
( ( r, torsion ), ( M0, divs_M0 ), ( N0, divs_N0 ), FT ) = data
@@ -625,101 +678,114 @@ def print_total_table( data ):
( ( r, torsion ), ( M0, divs_M0 ), ( N0, divs_N0 ), FT ) = data
- print "M_0 =", M0
- print "N_0 =", N0
- print ""
- print "The following table shows the total failure of Kummer",
- if torsion:
- print "degrees in case the quotient M/N is EVEN."
- else:
- print "degrees."
- print "The degree of the Kummer extension (M,N) is e / f, where",
+ print( "M_0 =", M0 )
+ print( "N_0 =", N0 )
+ print( "" )
+ print( "The following table shows the total failure of Kummer degrees", end="" )
if torsion:
- print "e = phi(M)*N^rank(G) if N is odd and e = 2*phi(M)*N^rank(G)",
- print "if N is even",
+ print( "in\n case the quotient M/N is EVEN." )
else:
- print "e = phi(M)*N^rank(G)",
- print "and f is the entry of the table below at the row labelled with",
- print "gcd(N,N0) and the column labelled with gcd(M,M0)."
- print ""
-
+ print( "." )
+ print( "Columns correspond to values of M, rows to values of N" )
+ print( "" )
+ print( "The degree of the Kummer extension (M,N) can be extracted by taking" )
+ print( "the value f (failure) of the entry at (gcd(N,N0),gcd(M,M0)) and" )
+ print( "simply computing ed(M,N) / f, where ed(M,N) is the expected degree" )
+ print( "of the Kummer extension." )
if torsion:
+ print( "In this case (-1 is in G), we have ed(M,N) = 2^e*phi(M)*N^r," )
+ print( "where e=1 if N is even and e=0 if N is odd." )
FT1 = torsion_table_even( data )
else:
+ print( "In this case (G is torsion-free) we have ed(M,N) = phi(M)*N^r," )
FT1 = FT
+ print( "where r is the rank of G." )
+ print( "" )
tt = [ ["","|"] + divs_M0 ]
tt.append( "-" * (len(divs_M0)+2) )
for i in range(len(divs_N0)):
tt.append( [ divs_N0[i] ] + ["|"] + FT1[i] )
- print table(tt)
- print ""
+ print( table(tt) )
+ print( "" )
if torsion:
- print "The following table shows the total failure of Kummer degrees",
- print "if the quotient M/N is ODD and is read as the previous one."
- print ""
+ print( "The following table shows the total failure of Kummer degrees in" )
+ print( "case the quotient M/N is ODD." )
+ print( "This table can be read exactly as the first one." )
+ print( "" )
# A good strategy is the following:
# A little translation exercise: the failure at (M,N) in the torsion
- # case is either the same as that for (2M,N) in the torsion-free
- # case (if M is even) or its double (if M is odd).
+ # case is either the same as that for (2M,N) in the torsion-free case
+ # (if M is even) or its double (if M is odd).
# However, due to problems in reading the table for bigger M, it is
# easier to just compute the degree every time, and then deduce the
- # failure. This is not too inefficient, since we can use the data
- # that we have already computed via kummer_degree_from_total_table.
+ # failure. This is not too inefficient, since we can use the data that
+ # we have already computed via kummer_degree_from_total_table.
new_FT = torsion_table_odd( data )
# Printing the new table
tt = [ ["","|"] + divs_M0 ]
tt.append( "-" * (len(divs_M0)+2) )
for i in range(len(divs_N0)):
tt.append( [ divs_N0[i] ] + ["|"] + new_FT[i] )
- print table(tt)
- print ""
+ print( table(tt) )
+ print( "" )
def print_case_list( data ):
( ( r, torsion ), ( M0, divs_M0 ), ( N0, divs_N0 ), FT ) = data
- FT_odd = torsion_table_odd( data )
+ FT_odd = torsion_table_odd( data )
+ # FT1 is either FT or FT_even in the torsion case
+ FT1 = FT
if torsion:
FT1 = torsion_table_even( data )
- pf = sorted(list({ x for row in FT_odd for x in row }))
- else:
- FT1 = FT
- pf = sorted(list({ x for row in FT1 for x in row }))
-
+ pf = []
+ for row in FT1:
+ pf += row
+ if torsion:
+ for row in FT_odd:
+ pf += row
+ pf = list(set(pf))
+ pf.sort()
for f in pf:
- print "Failure is", f, "if",
+ print( "Failure is", f, "if", end="" )
if torsion:
- print "M/N is EVEN and",
- print "(gcd(M,M0),gcd(N,N0)) is one of the following:"
- print [ (divs_M0[j], divs_N0[i]) \
- for i in range(len(divs_N0)) for j in range(len(divs_M0)) \
- if FT1[i][j] == f ]
-
+ print( "M/N is EVEN and", end="" )
+ print( "(gcd(M,M0),gcd(N,N0)) is one of the following:" )
+ lijst = []
+ for i in range(len(divs_N0)):
+ for j in range(len(divs_M0)):
+ if FT1[i][j] == f:
+ lijst.append( ( divs_M0[j], divs_N0[i] ) )
+ print( lijst )
if torsion:
- print "or if M/N is ODD and (gcd(M,M0)),gcd(N,N0)) is one of the",
- print "following:"
- print [ (divs_M0[j], divs_N0[i]) \
- for i in range(len(divs_N0)) for j in range(len(divs_M0))\
- if FT_odd[i][j] == f ]
+ print( "or if M/N is ODD and (gcd(M,M0)),gcd(N,N0)) is one of the", end="" )
+ print( "following:" )
- print ""
+ lijst_odd = []
+ for i in range(len(divs_N0)):
+ for j in range(len(divs_M0)):
+ if FT_odd[i][j] == f:
+ lijst_odd.append( ( divs_M0[j], divs_N0[i] ) )
+ print( lijst_odd )
+
+ print( "" )
# Extracts a specific value of failure from the total table.
def kummer_failure_from_total_table( M, N, data ):
( ( r, torsion ), ( M0, divs_M0 ), ( N0, divs_N0 ), FT ) = data
-
+ FT1 = FT
if torsion:
if (M/N) % 2 == 0:
FT1 = torsion_table_even( data )
else:
FT1 = torsion_table_odd( data )
- else:
- FT1 = FT
- return FT1[divs_N0.index( gcd( N, N0 ) )][divs_M0.index( gcd( M, M0 ) )]
+ i = divs_N0.index( gcd( N, N0 ) )
+ j = divs_M0.index( gcd( M, M0 ) )
+ return FT1[i][j]
# Computes the degree of the Kummer extension (M,N), by taking as input the
# table computed by TotalKummerFailure.
@@ -737,17 +803,20 @@ def kummer_degree_from_total_table( M, N, data ):
# M must be a multiple of N.
def KummerDegree( G, M, N ):
if M % N != 0:
- print "M is not a multiple of N"
+ print( "M is not a multiple of N" )
return -1
data = total_kummer_failure(G,False)
((r,torsion),(M0,divs_M0),(N0,divs_N0),FT) = data
- e_deg = euler_phi(M) * N^r
+ exp_deg = euler_phi(M) * N^r
if torsion and N % 2 == 0:
- e_deg *= 2
+ exp_deg *= 2
+ j = divs_M0.index(gcd(M,M0))
+ i = divs_N0.index(gcd(N,N0))
+
if torsion:
if (M/N)%2 == 0:
failure = torsion_table_even( data )
@@ -756,5 +825,4 @@ def KummerDegree( G, M, N ):
else:
failure = FT
- return e_deg/failure[divs_N0.index(gcd(N,N0))][divs_M0.index(gcd(M,M0))]
-
+ return exp_deg / failure[i][j]
diff --git a/tex/README b/tex/README
@@ -0,0 +1,7 @@
+Here we collect some incomplete and work-in-progress documentation.
+
+In compute_degrees we prove that our way to compute the degrees gives the
+correct result.
+
+In af_code we break down the code for the "adelic failure" part of the script
+and we check that it computes the degrees as described in compute_degrees.
diff --git a/tex/af_code.aux b/tex/af_code.aux
@@ -0,0 +1,11 @@
+\relax
+\citation{PST1}
+\citation{PST1}
+\citation{DebryPerucca}
+\@writefile{loa}{\contentsline {algorithm}{\numberline {1}{\ignorespaces Compute the adelic failure}}{2}}
+\@writefile{loa}{\contentsline {algorithm}{\numberline {2}{\ignorespaces Adelic failure, case $G\leq \mathbb {Q}^\times $}}{4}}
+\@writefile{loa}{\contentsline {algorithm}{\numberline {3}{\ignorespaces Adelic failure, case $d\not =-1$, $n\leq d$}}{5}}
+\@writefile{loa}{\contentsline {algorithm}{\numberline {4}{\ignorespaces Adelic failure, case $d\not =-1$, $n\geq d+2$}}{6}}
+\@writefile{loa}{\contentsline {algorithm}{\numberline {5}{\ignorespaces Adelic failure, case $d\not =-1$, $n= d+1$}}{7}}
+\bibcite{DebryPerucca}{1}
+\bibcite{PST1}{2}
diff --git a/tex/af_code.log b/tex/af_code.log
@@ -0,0 +1,764 @@
+This is pdfTeX, Version 3.14159265-2.6-1.40.18 (TeX Live 2017/Debian) (preloaded format=pdflatex 2019.9.20) 20 SEP 2019 10:04
+entering extended mode
+ \write18 enabled.
+ %&-line parsing enabled.
+**af_code.tex
+(./af_code.tex
+LaTeX2e <2017-04-15>
+Babel <3.18> and hyphenation patterns for 18 language(s) loaded.
+(/usr/share/texlive/texmf-dist/tex/latex/base/report.cls
+Document Class: report 2014/09/29 v1.4h Standard LaTeX document class
+(/usr/share/texlive/texmf-dist/tex/latex/base/size10.clo
+File: size10.clo 2014/09/29 v1.4h Standard LaTeX file (size option)
+)
+\c@part=\count79
+\c@chapter=\count80
+\c@section=\count81
+\c@subsection=\count82
+\c@subsubsection=\count83
+\c@paragraph=\count84
+\c@subparagraph=\count85
+\c@figure=\count86
+\c@table=\count87
+\abovecaptionskip=\skip41
+\belowcaptionskip=\skip42
+\bibindent=\dimen102
+)
+(/usr/share/texlive/texmf-dist/tex/latex/base/inputenc.sty
+Package: inputenc 2015/03/17 v1.2c Input encoding file
+\inpenc@prehook=\toks14
+\inpenc@posthook=\toks15
+
+(/usr/share/texlive/texmf-dist/tex/latex/base/utf8.def
+File: utf8.def 2017/01/28 v1.1t UTF-8 support for inputenc
+Now handling font encoding OML ...
+... no UTF-8 mapping file for font encoding OML
+Now handling font encoding T1 ...
+... processing UTF-8 mapping file for font encoding T1
+
+(/usr/share/texlive/texmf-dist/tex/latex/base/t1enc.dfu
+File: t1enc.dfu 2017/01/28 v1.1t UTF-8 support for inputenc
+ defining Unicode char U+00A0 (decimal 160)
+ defining Unicode char U+00A1 (decimal 161)
+ defining Unicode char U+00A3 (decimal 163)
+ defining Unicode char U+00AB (decimal 171)
+ defining Unicode char U+00AD (decimal 173)
+ defining Unicode char U+00BB (decimal 187)
+ defining Unicode char U+00BF (decimal 191)
+ defining Unicode char U+00C0 (decimal 192)
+ defining Unicode char U+00C1 (decimal 193)
+ defining Unicode char U+00C2 (decimal 194)
+ defining Unicode char U+00C3 (decimal 195)
+ defining Unicode char U+00C4 (decimal 196)
+ defining Unicode char U+00C5 (decimal 197)
+ defining Unicode char U+00C6 (decimal 198)
+ defining Unicode char U+00C7 (decimal 199)
+ defining Unicode char U+00C8 (decimal 200)
+ defining Unicode char U+00C9 (decimal 201)
+ defining Unicode char U+00CA (decimal 202)
+ defining Unicode char U+00CB (decimal 203)
+ defining Unicode char U+00CC (decimal 204)
+ defining Unicode char U+00CD (decimal 205)
+ defining Unicode char U+00CE (decimal 206)
+ defining Unicode char U+00CF (decimal 207)
+ defining Unicode char U+00D0 (decimal 208)
+ defining Unicode char U+00D1 (decimal 209)
+ defining Unicode char U+00D2 (decimal 210)
+ defining Unicode char U+00D3 (decimal 211)
+ defining Unicode char U+00D4 (decimal 212)
+ defining Unicode char U+00D5 (decimal 213)
+ defining Unicode char U+00D6 (decimal 214)
+ defining Unicode char U+00D8 (decimal 216)
+ defining Unicode char U+00D9 (decimal 217)
+ defining Unicode char U+00DA (decimal 218)
+ defining Unicode char U+00DB (decimal 219)
+ defining Unicode char U+00DC (decimal 220)
+ defining Unicode char U+00DD (decimal 221)
+ defining Unicode char U+00DE (decimal 222)
+ defining Unicode char U+00DF (decimal 223)
+ defining Unicode char U+00E0 (decimal 224)
+ defining Unicode char U+00E1 (decimal 225)
+ defining Unicode char U+00E2 (decimal 226)
+ defining Unicode char U+00E3 (decimal 227)
+ defining Unicode char U+00E4 (decimal 228)
+ defining Unicode char U+00E5 (decimal 229)
+ defining Unicode char U+00E6 (decimal 230)
+ defining Unicode char U+00E7 (decimal 231)
+ defining Unicode char U+00E8 (decimal 232)
+ defining Unicode char U+00E9 (decimal 233)
+ defining Unicode char U+00EA (decimal 234)
+ defining Unicode char U+00EB (decimal 235)
+ defining Unicode char U+00EC (decimal 236)
+ defining Unicode char U+00ED (decimal 237)
+ defining Unicode char U+00EE (decimal 238)
+ defining Unicode char U+00EF (decimal 239)
+ defining Unicode char U+00F0 (decimal 240)
+ defining Unicode char U+00F1 (decimal 241)
+ defining Unicode char U+00F2 (decimal 242)
+ defining Unicode char U+00F3 (decimal 243)
+ defining Unicode char U+00F4 (decimal 244)
+ defining Unicode char U+00F5 (decimal 245)
+ defining Unicode char U+00F6 (decimal 246)
+ defining Unicode char U+00F8 (decimal 248)
+ defining Unicode char U+00F9 (decimal 249)
+ defining Unicode char U+00FA (decimal 250)
+ defining Unicode char U+00FB (decimal 251)
+ defining Unicode char U+00FC (decimal 252)
+ defining Unicode char U+00FD (decimal 253)
+ defining Unicode char U+00FE (decimal 254)
+ defining Unicode char U+00FF (decimal 255)
+ defining Unicode char U+0100 (decimal 256)
+ defining Unicode char U+0101 (decimal 257)
+ defining Unicode char U+0102 (decimal 258)
+ defining Unicode char U+0103 (decimal 259)
+ defining Unicode char U+0104 (decimal 260)
+ defining Unicode char U+0105 (decimal 261)
+ defining Unicode char U+0106 (decimal 262)
+ defining Unicode char U+0107 (decimal 263)
+ defining Unicode char U+0108 (decimal 264)
+ defining Unicode char U+0109 (decimal 265)
+ defining Unicode char U+010A (decimal 266)
+ defining Unicode char U+010B (decimal 267)
+ defining Unicode char U+010C (decimal 268)
+ defining Unicode char U+010D (decimal 269)
+ defining Unicode char U+010E (decimal 270)
+ defining Unicode char U+010F (decimal 271)
+ defining Unicode char U+0110 (decimal 272)
+ defining Unicode char U+0111 (decimal 273)
+ defining Unicode char U+0112 (decimal 274)
+ defining Unicode char U+0113 (decimal 275)
+ defining Unicode char U+0114 (decimal 276)
+ defining Unicode char U+0115 (decimal 277)
+ defining Unicode char U+0116 (decimal 278)
+ defining Unicode char U+0117 (decimal 279)
+ defining Unicode char U+0118 (decimal 280)
+ defining Unicode char U+0119 (decimal 281)
+ defining Unicode char U+011A (decimal 282)
+ defining Unicode char U+011B (decimal 283)
+ defining Unicode char U+011C (decimal 284)
+ defining Unicode char U+011D (decimal 285)
+ defining Unicode char U+011E (decimal 286)
+ defining Unicode char U+011F (decimal 287)
+ defining Unicode char U+0120 (decimal 288)
+ defining Unicode char U+0121 (decimal 289)
+ defining Unicode char U+0122 (decimal 290)
+ defining Unicode char U+0123 (decimal 291)
+ defining Unicode char U+0124 (decimal 292)
+ defining Unicode char U+0125 (decimal 293)
+ defining Unicode char U+0128 (decimal 296)
+ defining Unicode char U+0129 (decimal 297)
+ defining Unicode char U+012A (decimal 298)
+ defining Unicode char U+012B (decimal 299)
+ defining Unicode char U+012C (decimal 300)
+ defining Unicode char U+012D (decimal 301)
+ defining Unicode char U+012E (decimal 302)
+ defining Unicode char U+012F (decimal 303)
+ defining Unicode char U+0130 (decimal 304)
+ defining Unicode char U+0131 (decimal 305)
+ defining Unicode char U+0132 (decimal 306)
+ defining Unicode char U+0133 (decimal 307)
+ defining Unicode char U+0134 (decimal 308)
+ defining Unicode char U+0135 (decimal 309)
+ defining Unicode char U+0136 (decimal 310)
+ defining Unicode char U+0137 (decimal 311)
+ defining Unicode char U+0139 (decimal 313)
+ defining Unicode char U+013A (decimal 314)
+ defining Unicode char U+013B (decimal 315)
+ defining Unicode char U+013C (decimal 316)
+ defining Unicode char U+013D (decimal 317)
+ defining Unicode char U+013E (decimal 318)
+ defining Unicode char U+0141 (decimal 321)
+ defining Unicode char U+0142 (decimal 322)
+ defining Unicode char U+0143 (decimal 323)
+ defining Unicode char U+0144 (decimal 324)
+ defining Unicode char U+0145 (decimal 325)
+ defining Unicode char U+0146 (decimal 326)
+ defining Unicode char U+0147 (decimal 327)
+ defining Unicode char U+0148 (decimal 328)
+ defining Unicode char U+014A (decimal 330)
+ defining Unicode char U+014B (decimal 331)
+ defining Unicode char U+014C (decimal 332)
+ defining Unicode char U+014D (decimal 333)
+ defining Unicode char U+014E (decimal 334)
+ defining Unicode char U+014F (decimal 335)
+ defining Unicode char U+0150 (decimal 336)
+ defining Unicode char U+0151 (decimal 337)
+ defining Unicode char U+0152 (decimal 338)
+ defining Unicode char U+0153 (decimal 339)
+ defining Unicode char U+0154 (decimal 340)
+ defining Unicode char U+0155 (decimal 341)
+ defining Unicode char U+0156 (decimal 342)
+ defining Unicode char U+0157 (decimal 343)
+ defining Unicode char U+0158 (decimal 344)
+ defining Unicode char U+0159 (decimal 345)
+ defining Unicode char U+015A (decimal 346)
+ defining Unicode char U+015B (decimal 347)
+ defining Unicode char U+015C (decimal 348)
+ defining Unicode char U+015D (decimal 349)
+ defining Unicode char U+015E (decimal 350)
+ defining Unicode char U+015F (decimal 351)
+ defining Unicode char U+0160 (decimal 352)
+ defining Unicode char U+0161 (decimal 353)
+ defining Unicode char U+0162 (decimal 354)
+ defining Unicode char U+0163 (decimal 355)
+ defining Unicode char U+0164 (decimal 356)
+ defining Unicode char U+0165 (decimal 357)
+ defining Unicode char U+0168 (decimal 360)
+ defining Unicode char U+0169 (decimal 361)
+ defining Unicode char U+016A (decimal 362)
+ defining Unicode char U+016B (decimal 363)
+ defining Unicode char U+016C (decimal 364)
+ defining Unicode char U+016D (decimal 365)
+ defining Unicode char U+016E (decimal 366)
+ defining Unicode char U+016F (decimal 367)
+ defining Unicode char U+0170 (decimal 368)
+ defining Unicode char U+0171 (decimal 369)
+ defining Unicode char U+0172 (decimal 370)
+ defining Unicode char U+0173 (decimal 371)
+ defining Unicode char U+0174 (decimal 372)
+ defining Unicode char U+0175 (decimal 373)
+ defining Unicode char U+0176 (decimal 374)
+ defining Unicode char U+0177 (decimal 375)
+ defining Unicode char U+0178 (decimal 376)
+ defining Unicode char U+0179 (decimal 377)
+ defining Unicode char U+017A (decimal 378)
+ defining Unicode char U+017B (decimal 379)
+ defining Unicode char U+017C (decimal 380)
+ defining Unicode char U+017D (decimal 381)
+ defining Unicode char U+017E (decimal 382)
+ defining Unicode char U+01CD (decimal 461)
+ defining Unicode char U+01CE (decimal 462)
+ defining Unicode char U+01CF (decimal 463)
+ defining Unicode char U+01D0 (decimal 464)
+ defining Unicode char U+01D1 (decimal 465)
+ defining Unicode char U+01D2 (decimal 466)
+ defining Unicode char U+01D3 (decimal 467)
+ defining Unicode char U+01D4 (decimal 468)
+ defining Unicode char U+01E2 (decimal 482)
+ defining Unicode char U+01E3 (decimal 483)
+ defining Unicode char U+01E6 (decimal 486)
+ defining Unicode char U+01E7 (decimal 487)
+ defining Unicode char U+01E8 (decimal 488)
+ defining Unicode char U+01E9 (decimal 489)
+ defining Unicode char U+01EA (decimal 490)
+ defining Unicode char U+01EB (decimal 491)
+ defining Unicode char U+01F0 (decimal 496)
+ defining Unicode char U+01F4 (decimal 500)
+ defining Unicode char U+01F5 (decimal 501)
+ defining Unicode char U+0218 (decimal 536)
+ defining Unicode char U+0219 (decimal 537)
+ defining Unicode char U+021A (decimal 538)
+ defining Unicode char U+021B (decimal 539)
+ defining Unicode char U+0232 (decimal 562)
+ defining Unicode char U+0233 (decimal 563)
+ defining Unicode char U+1E02 (decimal 7682)
+ defining Unicode char U+1E03 (decimal 7683)
+ defining Unicode char U+200C (decimal 8204)
+ defining Unicode char U+2010 (decimal 8208)
+ defining Unicode char U+2011 (decimal 8209)
+ defining Unicode char U+2012 (decimal 8210)
+ defining Unicode char U+2013 (decimal 8211)
+ defining Unicode char U+2014 (decimal 8212)
+ defining Unicode char U+2015 (decimal 8213)
+ defining Unicode char U+2018 (decimal 8216)
+ defining Unicode char U+2019 (decimal 8217)
+ defining Unicode char U+201A (decimal 8218)
+ defining Unicode char U+201C (decimal 8220)
+ defining Unicode char U+201D (decimal 8221)
+ defining Unicode char U+201E (decimal 8222)
+ defining Unicode char U+2030 (decimal 8240)
+ defining Unicode char U+2031 (decimal 8241)
+ defining Unicode char U+2039 (decimal 8249)
+ defining Unicode char U+203A (decimal 8250)
+ defining Unicode char U+2423 (decimal 9251)
+ defining Unicode char U+1E20 (decimal 7712)
+ defining Unicode char U+1E21 (decimal 7713)
+)
+Now handling font encoding OT1 ...
+... processing UTF-8 mapping file for font encoding OT1
+
+(/usr/share/texlive/texmf-dist/tex/latex/base/ot1enc.dfu
+File: ot1enc.dfu 2017/01/28 v1.1t UTF-8 support for inputenc
+ defining Unicode char U+00A0 (decimal 160)
+ defining Unicode char U+00A1 (decimal 161)
+ defining Unicode char U+00A3 (decimal 163)
+ defining Unicode char U+00AD (decimal 173)
+ defining Unicode char U+00B8 (decimal 184)
+ defining Unicode char U+00BF (decimal 191)
+ defining Unicode char U+00C5 (decimal 197)
+ defining Unicode char U+00C6 (decimal 198)
+ defining Unicode char U+00D8 (decimal 216)
+ defining Unicode char U+00DF (decimal 223)
+ defining Unicode char U+00E6 (decimal 230)
+ defining Unicode char U+00EC (decimal 236)
+ defining Unicode char U+00ED (decimal 237)
+ defining Unicode char U+00EE (decimal 238)
+ defining Unicode char U+00EF (decimal 239)
+ defining Unicode char U+00F8 (decimal 248)
+ defining Unicode char U+0131 (decimal 305)
+ defining Unicode char U+0141 (decimal 321)
+ defining Unicode char U+0142 (decimal 322)
+ defining Unicode char U+0152 (decimal 338)
+ defining Unicode char U+0153 (decimal 339)
+ defining Unicode char U+0174 (decimal 372)
+ defining Unicode char U+0175 (decimal 373)
+ defining Unicode char U+0176 (decimal 374)
+ defining Unicode char U+0177 (decimal 375)
+ defining Unicode char U+0218 (decimal 536)
+ defining Unicode char U+0219 (decimal 537)
+ defining Unicode char U+021A (decimal 538)
+ defining Unicode char U+021B (decimal 539)
+ defining Unicode char U+2013 (decimal 8211)
+ defining Unicode char U+2014 (decimal 8212)
+ defining Unicode char U+2018 (decimal 8216)
+ defining Unicode char U+2019 (decimal 8217)
+ defining Unicode char U+201C (decimal 8220)
+ defining Unicode char U+201D (decimal 8221)
+)
+Now handling font encoding OMS ...
+... processing UTF-8 mapping file for font encoding OMS
+
+(/usr/share/texlive/texmf-dist/tex/latex/base/omsenc.dfu
+File: omsenc.dfu 2017/01/28 v1.1t UTF-8 support for inputenc
+ defining Unicode char U+00A7 (decimal 167)
+ defining Unicode char U+00B6 (decimal 182)
+ defining Unicode char U+00B7 (decimal 183)
+ defining Unicode char U+2020 (decimal 8224)
+ defining Unicode char U+2021 (decimal 8225)
+ defining Unicode char U+2022 (decimal 8226)
+)
+Now handling font encoding OMX ...
+... no UTF-8 mapping file for font encoding OMX
+Now handling font encoding U ...
+... no UTF-8 mapping file for font encoding U
+ defining Unicode char U+00A9 (decimal 169)
+ defining Unicode char U+00AA (decimal 170)
+ defining Unicode char U+00AE (decimal 174)
+ defining Unicode char U+00BA (decimal 186)
+ defining Unicode char U+02C6 (decimal 710)
+ defining Unicode char U+02DC (decimal 732)
+ defining Unicode char U+200C (decimal 8204)
+ defining Unicode char U+2026 (decimal 8230)
+ defining Unicode char U+2122 (decimal 8482)
+ defining Unicode char U+2423 (decimal 9251)
+))
+(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty
+Package: amsmath 2017/09/02 v2.17a AMS math features
+\@mathmargin=\skip43
+
+For additional information on amsmath, use the `?' option.
+(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty
+Package: amstext 2000/06/29 v2.01 AMS text
+
+(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty
+File: amsgen.sty 1999/11/30 v2.0 generic functions
+\@emptytoks=\toks16
+\ex@=\dimen103
+))
+(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty
+Package: amsbsy 1999/11/29 v1.2d Bold Symbols
+\pmbraise@=\dimen104
+)
+(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty
+Package: amsopn 2016/03/08 v2.02 operator names
+)
+\inf@bad=\count88
+LaTeX Info: Redefining \frac on input line 213.
+\uproot@=\count89
+\leftroot@=\count90
+LaTeX Info: Redefining \overline on input line 375.
+\classnum@=\count91
+\DOTSCASE@=\count92
+LaTeX Info: Redefining \ldots on input line 472.
+LaTeX Info: Redefining \dots on input line 475.
+LaTeX Info: Redefining \cdots on input line 596.
+\Mathstrutbox@=\box26
+\strutbox@=\box27
+\big@size=\dimen105
+LaTeX Font Info: Redeclaring font encoding OML on input line 712.
+LaTeX Font Info: Redeclaring font encoding OMS on input line 713.
+\macc@depth=\count93
+\c@MaxMatrixCols=\count94
+\dotsspace@=\muskip10
+\c@parentequation=\count95
+\dspbrk@lvl=\count96
+\tag@help=\toks17
+\row@=\count97
+\column@=\count98
+\maxfields@=\count99
+\andhelp@=\toks18
+\eqnshift@=\dimen106
+\alignsep@=\dimen107
+\tagshift@=\dimen108
+\tagwidth@=\dimen109
+\totwidth@=\dimen110
+\lineht@=\dimen111
+\@envbody=\toks19
+\multlinegap=\skip44
+\multlinetaggap=\skip45
+\mathdisplay@stack=\toks20
+LaTeX Info: Redefining \[ on input line 2817.
+LaTeX Info: Redefining \] on input line 2818.
+)
+(/usr/share/texlive/texmf-dist/tex/latex/amscls/amsthm.sty
+Package: amsthm 2017/10/31 v2.20.4
+\thm@style=\toks21
+\thm@bodyfont=\toks22
+\thm@headfont=\toks23
+\thm@notefont=\toks24
+\thm@headpunct=\toks25
+\thm@preskip=\skip46
+\thm@postskip=\skip47
+\thm@headsep=\skip48
+\dth@everypar=\toks26
+)
+(/usr/share/texlive/texmf-dist/tex/generic/xypic/xy.sty
+(/usr/share/texlive/texmf-dist/tex/generic/xypic/xy.tex Bootstrap'ing:
+catcodes, docmode, (/usr/share/texlive/texmf-dist/tex/generic/xypic/xyrecat.tex
+) (/usr/share/texlive/texmf-dist/tex/generic/xypic/xyidioms.tex)
+
+ Xy-pic version 3.8.9 <2013/10/06>
+ Copyright (c) 1991-2013 by Kristoffer H. Rose <krisrose@tug.org> and others
+ Xy-pic is free software: see the User's Guide for details.
+
+Loading kernel: messages; fonts; allocations: state,
+\X@c=\dimen112
+\Y@c=\dimen113
+\U@c=\dimen114
+\D@c=\dimen115
+\L@c=\dimen116
+\R@c=\dimen117
+\Edge@c=\toks27
+\X@p=\dimen118
+\Y@p=\dimen119
+\U@p=\dimen120
+\D@p=\dimen121
+\L@p=\dimen122
+\R@p=\dimen123
+\Edge@p=\toks28
+\X@origin=\dimen124
+\Y@origin=\dimen125
+\X@xbase=\dimen126
+\Y@xbase=\dimen127
+\X@ybase=\dimen128
+\Y@ybase=\dimen129
+\X@min=\dimen130
+\Y@min=\dimen131
+\X@max=\dimen132
+\Y@max=\dimen133
+\lastobjectbox@=\box28
+\zerodotbox@=\box29
+\almostz@=\dimen134
+ direction,
+\d@X=\dimen135
+\d@Y=\dimen136
+\K@=\count100
+\KK@=\count101
+\Direction=\count102
+\K@dXdY=\dimen137
+\K@dYdX=\dimen138
+\xyread@=\read1
+\xywrite@=\write3
+\csp@=\count103
+\quotPTK@=\dimen139
+
+utility macros; pictures: \xy, positions,
+\swaptoks@@=\toks29
+\connectobjectbox@@=\box30
+ objects,
+\styletoks@=\toks30
+ decorations;
+kernel objects: directionals, circles, text; options; algorithms: directions,
+edges, connections; Xy-pic loaded)
+(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/ifpdf.sty
+Package: ifpdf 2017/03/15 v3.2 Provides the ifpdf switch
+)
+Package: xy 2013/10/06 Xy-pic version 3.8.9
+
+(/usr/share/texlive/texmf-dist/tex/generic/xypic/xyall.tex
+ Xy-pic option: All features v.3.8
+(/usr/share/texlive/texmf-dist/tex/generic/xypic/xycurve.tex
+ Xy-pic option: Curve and Spline extension v.3.12 curve,
+\crv@cnt@=\count104
+\crvpts@=\toks31
+\splinebox@=\box31
+\splineval@=\dimen140
+\splinedepth@=\dimen141
+\splinetol@=\dimen142
+\splinelength@=\dimen143
+ circles,
+\L@=\dimen144
+ loaded)
+(/usr/share/texlive/texmf-dist/tex/generic/xypic/xyframe.tex
+ Xy-pic option: Frame and Bracket extension v.3.14 loaded)
+(/usr/share/texlive/texmf-dist/tex/generic/xypic/xycmtip.tex
+ Xy-pic option: Computer Modern tip extension v.3.7
+(/usr/share/texlive/texmf-dist/tex/generic/xypic/xytips.tex
+ Xy-pic option: More Tips extension v.3.11 loaded) loaded)
+(/usr/share/texlive/texmf-dist/tex/generic/xypic/xyline.tex
+ Xy-pic option: Line styles extension v.3.10
+\xylinethick@=\dimen145
+ loaded)
+(/usr/share/texlive/texmf-dist/tex/generic/xypic/xyrotate.tex
+ Xy-pic option: Rotate and Scale extension v.3.8 loaded)
+(/usr/share/texlive/texmf-dist/tex/generic/xypic/xycolor.tex
+ Xy-pic option: Colour extension v.3.11 loaded)
+(/usr/share/texlive/texmf-dist/tex/generic/xypic/xymatrix.tex
+ Xy-pic option: Matrix feature v.3.14
+\Row=\count105
+\Col=\count106
+\queue@=\toks32
+\queue@@=\toks33
+\qcount@=\count107
+\qcount@@=\count108
+\matrixsize@=\count109
+ loaded)
+(/usr/share/texlive/texmf-dist/tex/generic/xypic/xyarrow.tex
+ Xy-pic option: Arrow and Path feature v.3.9 path, \ar, loaded)
+(/usr/share/texlive/texmf-dist/tex/generic/xypic/xygraph.tex
+ Xy-pic option: Graph feature v.3.11 loaded) loaded)
+(/usr/share/texlive/texmf-dist/tex/generic/xypic/xypdf.tex
+ Xy-pic option: PDF driver v.1.7 Xy-pic pdf driver: `color' extension support
+(/usr/share/texlive/texmf-dist/tex/generic/xypic/xypdf-co.tex loaded)
+Xy-pic pdf driver: `curve' extension support
+(/usr/share/texlive/texmf-dist/tex/generic/xypic/xypdf-cu.tex loaded)
+Xy-pic pdf driver: `frame' extension support
+(/usr/share/texlive/texmf-dist/tex/generic/xypic/xypdf-fr.tex loaded)
+Xy-pic pdf driver: `line' extension support
+(/usr/share/texlive/texmf-dist/tex/generic/xypic/xypdf-li.tex loaded)
+Xy-pic pdf driver: `rotate' extension support
+(/usr/share/texlive/texmf-dist/tex/generic/xypic/xypdf-ro.tex loaded) loaded))
+(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/amsfonts.sty
+Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support
+\symAMSa=\mathgroup4
+\symAMSb=\mathgroup5
+LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold'
+(Font) U/euf/m/n --> U/euf/b/n on input line 106.
+)
+(/usr/share/texlive/texmf-dist/tex/latex/graphics/color.sty
+Package: color 2016/07/10 v1.1e Standard LaTeX Color (DPC)
+
+(/usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/color.cfg
+File: color.cfg 2016/01/02 v1.6 sample color configuration
+)
+Package color Info: Driver file: pdftex.def on input line 147.
+
+(/usr/share/texlive/texmf-dist/tex/latex/graphics-def/pdftex.def
+File: pdftex.def 2018/01/08 v1.0l Graphics/color driver for pdftex
+))
+(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/amssymb.sty
+Package: amssymb 2013/01/14 v3.01 AMS font symbols
+)
+(/usr/share/texlive/texmf-dist/tex/latex/float/float.sty
+Package: float 2001/11/08 v1.3d Float enhancements (AL)
+\c@float@type=\count110
+\float@exts=\toks34
+\float@box=\box32
+\@float@everytoks=\toks35
+\@floatcapt=\box33
+)
+(/usr/share/texlive/texmf-dist/tex/latex/geometry/geometry.sty
+Package: geometry 2010/09/12 v5.6 Page Geometry
+
+(/usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty
+Package: keyval 2014/10/28 v1.15 key=value parser (DPC)
+\KV@toks@=\toks36
+)
+(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/ifvtex.sty
+Package: ifvtex 2016/05/16 v1.6 Detect VTeX and its facilities (HO)
+Package ifvtex Info: VTeX not detected.
+)
+(/usr/share/texlive/texmf-dist/tex/generic/ifxetex/ifxetex.sty
+Package: ifxetex 2010/09/12 v0.6 Provides ifxetex conditional
+)
+\Gm@cnth=\count111
+\Gm@cntv=\count112
+\c@Gm@tempcnt=\count113
+\Gm@bindingoffset=\dimen146
+\Gm@wd@mp=\dimen147
+\Gm@odd@mp=\dimen148
+\Gm@even@mp=\dimen149
+\Gm@layoutwidth=\dimen150
+\Gm@layoutheight=\dimen151
+\Gm@layouthoffset=\dimen152
+\Gm@layoutvoffset=\dimen153
+\Gm@dimlist=\toks37
+)
+(/usr/share/texlive/texmf-dist/tex/latex/listings/listings.sty
+\lst@mode=\count114
+\lst@gtempboxa=\box34
+\lst@token=\toks38
+\lst@length=\count115
+\lst@currlwidth=\dimen154
+\lst@column=\count116
+\lst@pos=\count117
+\lst@lostspace=\dimen155
+\lst@width=\dimen156
+\lst@newlines=\count118
+\lst@lineno=\count119
+\lst@maxwidth=\dimen157
+
+(/usr/share/texlive/texmf-dist/tex/latex/listings/lstmisc.sty
+File: lstmisc.sty 2015/06/04 1.6 (Carsten Heinz)
+\c@lstnumber=\count120
+\lst@skipnumbers=\count121
+\lst@framebox=\box35
+)
+(/usr/share/texlive/texmf-dist/tex/latex/listings/listings.cfg
+File: listings.cfg 2015/06/04 1.6 listings configuration
+))
+Package: listings 2015/06/04 1.6 (Carsten Heinz)
+
+(/usr/share/texlive/texmf-dist/tex/latex/algorithms/algorithm.sty
+Package: algorithm 2009/08/24 v0.1 Document Style `algorithm' - floating enviro
+nment
+
+(/usr/share/texlive/texmf-dist/tex/latex/base/ifthen.sty
+Package: ifthen 2014/09/29 v1.1c Standard LaTeX ifthen package (DPC)
+)
+\@float@every@algorithm=\toks39
+\c@algorithm=\count122
+)
+(/usr/share/texlive/texmf-dist/tex/latex/algorithmicx/algpseudocode.sty
+Package: algpseudocode
+
+(/usr/share/texlive/texmf-dist/tex/latex/algorithmicx/algorithmicx.sty
+Package: algorithmicx 2005/04/27 v1.2 Algorithmicx
+
+Document Style algorithmicx 1.2 - a greatly improved `algorithmic' style
+\c@ALG@line=\count123
+\c@ALG@rem=\count124
+\c@ALG@nested=\count125
+\ALG@tlm=\skip49
+\ALG@thistlm=\skip50
+\c@ALG@Lnr=\count126
+\c@ALG@blocknr=\count127
+\c@ALG@storecount=\count128
+\c@ALG@tmpcounter=\count129
+\ALG@tmplength=\skip51
+)
+Document Style - pseudocode environments for use with the `algorithmicx' style
+)
+\c@lemma=\count130
+ (./af_code.aux)
+\openout1 = `af_code.aux'.
+
+LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 105.
+LaTeX Font Info: ... okay on input line 105.
+LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 105.
+LaTeX Font Info: ... okay on input line 105.
+LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 105.
+LaTeX Font Info: ... okay on input line 105.
+LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 105.
+LaTeX Font Info: ... okay on input line 105.
+LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 105.
+LaTeX Font Info: ... okay on input line 105.
+LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 105.
+LaTeX Font Info: ... okay on input line 105.
+LaTeX Font Info: Try loading font information for U+msa on input line 105.
+ (/usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsa.fd
+File: umsa.fd 2013/01/14 v3.01 AMS symbols A
+)
+LaTeX Font Info: Try loading font information for U+msb on input line 105.
+
+(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsb.fd
+File: umsb.fd 2013/01/14 v3.01 AMS symbols B
+)
+Package xypdf Info: Line width: 0.39998pt on input line 105.
+
+(/usr/share/texlive/texmf-dist/tex/context/base/mkii/supp-pdf.mkii
+[Loading MPS to PDF converter (version 2006.09.02).]
+\scratchcounter=\count131
+\scratchdimen=\dimen158
+\scratchbox=\box36
+\nofMPsegments=\count132
+\nofMParguments=\count133
+\everyMPshowfont=\toks40
+\MPscratchCnt=\count134
+\MPscratchDim=\dimen159
+\MPnumerator=\count135
+\makeMPintoPDFobject=\count136
+\everyMPtoPDFconversion=\toks41
+)
+*geometry* driver: auto-detecting
+*geometry* detected driver: pdftex
+*geometry* verbose mode - [ preamble ] result:
+* driver: pdftex
+* paper: a4paper
+* layout: <same size as paper>
+* layoutoffset:(h,v)=(0.0pt,0.0pt)
+* modes:
+* h-part:(L,W,R)=(71.13188pt, 455.24411pt, 71.13188pt)
+* v-part:(T,H,B)=(85.35826pt, 674.33032pt, 85.35826pt)
+* \paperwidth=597.50787pt
+* \paperheight=845.04684pt
+* \textwidth=455.24411pt
+* \textheight=674.33032pt
+* \oddsidemargin=-1.1381pt
+* \evensidemargin=-1.1381pt
+* \topmargin=-23.91173pt
+* \headheight=12.0pt
+* \headsep=25.0pt
+* \topskip=10.0pt
+* \footskip=30.0pt
+* \marginparwidth=57.0pt
+* \marginparsep=11.0pt
+* \columnsep=10.0pt
+* \skip\footins=9.0pt plus 4.0pt minus 2.0pt
+* \hoffset=0.0pt
+* \voffset=0.0pt
+* \mag=1000
+* \@twocolumnfalse
+* \@twosidefalse
+* \@mparswitchfalse
+* \@reversemarginfalse
+* (1in=72.27pt=25.4mm, 1cm=28.453pt)
+
+\c@lstlisting=\count137
+LaTeX Font Info: Try loading font information for OMS+cmr on input line 117.
+
+(/usr/share/texlive/texmf-dist/tex/latex/base/omscmr.fd
+File: omscmr.fd 2014/09/29 v2.5h Standard LaTeX font definitions
+)
+LaTeX Font Info: Font shape `OMS/cmr/m/n' in size <10> not available
+(Font) Font shape `OMS/cmsy/m/n' tried instead on input line 117.
+ [1
+
+
+{/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map}] [2] [3] [4] [5] [6] [7] [8
+
+] (./af_code.aux) )
+Here is how much of TeX's memory you used:
+ 7341 strings out of 494283
+ 92388 string characters out of 6169691
+ 205701 words of memory out of 5000000
+ 10561 multiletter control sequences out of 15000+600000
+ 14410 words of font info for 60 fonts, out of 8000000 for 9000
+ 497 hyphenation exceptions out of 8191
+ 27i,13n,32p,3239b,350s stack positions out of 5000i,500n,10000p,200000b,80000s
+</usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/c
+m/cmbx10.pfb></usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmbx
+12.pfb></usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmcsc10.pf
+b></usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmex10.pfb></us
+r/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi10.pfb></usr/shar
+e/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi12.pfb></usr/share/texl
+ive/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi5.pfb></usr/share/texlive/tex
+mf-dist/fonts/type1/public/amsfonts/cm/cmmi7.pfb></usr/share/texlive/texmf-dist
+/fonts/type1/public/amsfonts/cm/cmr10.pfb></usr/share/texlive/texmf-dist/fonts/
+type1/public/amsfonts/cm/cmr12.pfb></usr/share/texlive/texmf-dist/fonts/type1/p
+ublic/amsfonts/cm/cmr5.pfb></usr/share/texlive/texmf-dist/fonts/type1/public/am
+sfonts/cm/cmr7.pfb></usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/c
+m/cmr8.pfb></usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy10
+.pfb></usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy5.pfb></
+usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy7.pfb></usr/sha
+re/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmsy8.pfb></usr/share/texl
+ive/texmf-dist/fonts/type1/public/amsfonts/cm/cmti10.pfb></usr/share/texlive/te
+xmf-dist/fonts/type1/public/amsfonts/cm/cmtt10.pfb></usr/share/texlive/texmf-di
+st/fonts/type1/public/amsfonts/symbols/msbm10.pfb>
+Output written on af_code.pdf (8 pages, 212906 bytes).
+PDF statistics:
+ 111 PDF objects out of 1000 (max. 8388607)
+ 80 compressed objects within 1 object stream
+ 0 named destinations out of 1000 (max. 500000)
+ 1 words of extra memory for PDF output out of 10000 (max. 10000000)
+
diff --git a/tex/af_code.pdf b/tex/af_code.pdf
Binary files differ.
diff --git a/tex/af_code.synctex.gz b/tex/af_code.synctex.gz
Binary files differ.
diff --git a/tex/af_code.tex b/tex/af_code.tex
@@ -0,0 +1,474 @@
+\documentclass[10pt,a4paper]{report}
+\usepackage[utf8]{inputenc}
+\usepackage{amsmath}
+\usepackage{amsthm}
+\usepackage[all]{xy}
+\usepackage{amsfonts}
+\usepackage{color}
+\usepackage{amssymb}
+\usepackage{float}
+\usepackage[a4paper, top=3cm, bottom=3cm, left=2.5cm, right=2.5cm]{geometry}
+\usepackage{listings}
+\usepackage{algorithm}
+%\usepackage{algorithmic}
+\usepackage{algpseudocode}
+
+\DeclareMathOperator{\alg}{alg}
+\DeclareMathOperator{\obj}{Obj}
+\DeclareMathOperator{\Hom}{Hom}
+\DeclareMathOperator{\End}{End}
+\DeclareMathOperator{\hol}{Hol}
+\DeclareMathOperator{\aut}{Aut}
+\DeclareMathOperator{\gal}{Gal}
+\DeclareMathOperator{\id}{id}
+\DeclareMathOperator{\res}{res}
+\DeclareMathOperator{\im}{Im}
+\DeclareMathOperator{\Id}{Id}
+\DeclareMathOperator{\fib}{Fib}
+\DeclareMathOperator{\spec}{Spec}
+\DeclareMathOperator{\proj}{Proj}
+\DeclareMathOperator{\trdeg}{trdeg}
+\DeclareMathOperator{\car}{char}
+\DeclareMathOperator{\Frac}{Frac}
+\DeclareMathOperator{\reduced}{red}
+\DeclareMathOperator{\real}{Re}
+\DeclareMathOperator{\imag}{Im}
+\DeclareMathOperator{\vol}{vol}
+\DeclareMathOperator{\den}{den}
+\DeclareMathOperator{\rank}{rank}
+\DeclareMathOperator{\lcm}{lcm}
+\DeclareMathOperator{\rad}{rad}
+\DeclareMathOperator{\ord}{ord}
+\DeclareMathOperator{\Br}{Br}
+\DeclareMathOperator{\inv}{inv}
+\DeclareMathOperator{\Nm}{Nm}
+\DeclareMathOperator{\Tr}{Tr}
+\DeclareMathOperator{\an}{an}
+\DeclareMathOperator{\op}{op}
+\DeclareMathOperator{\sep}{sep}
+\DeclareMathOperator{\unr}{unr}
+\DeclareMathOperator{\et}{\acute et}
+\DeclareMathOperator{\ev}{ev}
+\DeclareMathOperator{\gl}{GL}
+\DeclareMathOperator{\SL}{SL}
+\DeclareMathOperator{\mat}{Mat}
+\DeclareMathOperator{\ab}{ab}
+\DeclareMathOperator{\tors}{tors}
+\DeclareMathOperator{\ed}{ed}
+
+\newcommand{\grp}{\textsc{Grp}}
+\newcommand{\set}{\textsc{Set}}
+\newcommand{\x}{\mathbf{x}}
+\newcommand{\naturalto}{\overset{.}{\to}}
+\newcommand{\qbar}{\overline{\mathbb{Q}}}
+\newcommand{\zbar}{\overline{\mathbb{Z}}}
+
+\newcommand{\pro}{\mathbb{P}}
+\newcommand{\aff}{\mathbb{A}}
+\newcommand{\quat}{\mathbb{H}}
+\newcommand{\rea}{\mathbb{R}}
+\newcommand{\kiu}{\mathbb{Q}}
+\newcommand{\F}{\mathbb{F}}
+\newcommand{\zee}{\mathbb{Z}}
+\newcommand{\ow}{\mathcal{O}}
+\newcommand{\mcx}{\mathcal{X}}
+\newcommand{\mcy}{\mathcal{Y}}
+\newcommand{\mcs}{\mathcal{S}}
+\newcommand{\mca}{\mathcal{A}}
+\newcommand{\mcb}{\mathcal{B}}
+\newcommand{\mcf}{\mathcal{F}}
+\newcommand{\mcg}{\mathcal{G}}
+\newcommand{\mct}{\mathcal{T}}
+\newcommand{\mcq}{\mathcal{Q}}
+\newcommand{\mcr}{\mathcal{R}}
+\newcommand{\adl}{\mathbf{A}}
+\newcommand{\mbk}{\mathbf{k}}
+\newcommand{\m}{\mathfrak{m}}
+\newcommand{\p}{\mathfrak{p}}
+
+\newcommand{\kbar}{\overline{K}}
+
+\newtheorem{lemma}{Lemma}
+\newtheorem{proposition}[lemma]{Proposition}
+\newtheorem{conjecture}[lemma]{Conjecture}
+\newtheorem{corollary}[lemma]{Corollary}
+\newtheorem{definition}[lemma]{Definition}
+\newtheorem{theorem}[lemma]{Theorem}
+\newtheorem{cond-thm}[lemma]{Conditional Theorem}
+\theoremstyle{definition}
+\newtheorem{remark}[lemma]{Remark}
+
+%\author{Sebastiano Tronto}
+\title{Computation of the adelic failure}
+
+
+\begin{document}
+
+\chapter*{Computation of the adelic failure}
+
+The aim of this document is bridge the gap between the theory developed in \cite{PST1} and the function \texttt{adelic\_failure\_gb} that computes the adelic failure. By reading \cite{PST1}, the pseudo-code in this file and the (commented) SageMath code, one can verify that the script produces the correct results.
+
+We begin by giving the code for the function that computes the adelic failure, both in SageMath and in pseudocode. Then we procede to breaking it down into different subcases.
+
+\section*{The SageMath code}
+
+The function \texttt{adelic\_failure\_gb} takes two parameters as input: a list $B=\{B_0,\dots, B_t\}$ and an integer $d$. Each $B_i$ is itself a list of elements of $G$, and we require the following:
+\begin{itemize}
+\item Each element of $B_i=\{B_{i,0},\dots,B_{i,t_i}\}$ has $2$-divisibility $i$, using the terminology of \cite{DebryPerucca}.
+\item $\mathcal{B}=\bigcup_{i=1}^t B_i$ is a $2$-maximal basis for $G$.
+\item The integer $d$ is either $-1$ or $1\leq d\leq t$. For $i\in\{1,\dots,t\}\setminus\{d\}$ we have $B_i\subseteq \mathbb{Q}_+$. If $d\neq -1$ we have $B_{d,0}<0$ and $B_{d,j}>0$ for $j\neq 0$.
+\end{itemize}
+The output is a list $A=\{A_n\mid n\text{ divides }N_0\}$, indexed by the positive divisors of $N_0$, where $N_0=\max(3,t+1)$ if $d=t$, while $N_0=\max(3,t)$ otherwise. Each $A_n=\{A_{n,0},\dots,A_{n,r_n}\}$ is a list of pairs $A_{n,i}=(d_{n,i},f_{n,i})$. For each $n\mid N_0$ and each $i\leq r_n$, the integer $d_{n,i}$ is a divisor of $M_0=d_{N_0,r_{N_0}}$ and a multiple of $2^i$, and $f_{n,i}$ is the \emph{adelic failure}, that is the degree
+\begin{align*}
+f_{n,i}=\left[\mathbb{Q}_{2^i}\left(G^{1/2^i}\right)\cap \mathbb{Q}_{d_{n,i}}:\mathbb{Q}_{2^i}\right].
+\end{align*}
+
+%\lstset{language=Python}
+%\begin{lstlisting}
+%def adelic_failure_gb( B, d ):
+%
+% ad_fail = [] # The table to be returned at the end.
+%
+% if d == len(B)-1:
+% N = max(3,len(B)+1)
+% else:
+% N = max(3,len(B))
+%
+% # The shortlist grows at each step, so we build it incrementally.
+% shortlist = []
+% # The "special element" is (n,b) = \zeta_{2^n}\sqrt{b}.
+% special_element = (1,1)
+%
+% M = 1 # M also grows with n.
+%
+% for n in range( 1, N+1 ): # Read as: 1 \leq n \leq N
+%
+% # We add the new elements to the shortlist, modifying M if needed.
+% # This is not done in case we are in the extra "fake" level.
+% if n-1 < len(B):
+% for g in B[n-1]:
+% if g < 0 and n > 1:
+% special_element = ( n+1, abs(g)^(1/(2^(n-1))) )
+% M = lcm( M, special_embed( special_element ) )
+% else:
+% b = g^(1/(2^(n-1))) # b is 2-indivisible
+% shortlist.append( b )
+% M = lcm( M, cyc_embed(b) )
+%
+% # We add a root of an even power of the negative generator, as soon as
+% # we are beyond its level.
+% if d != -1 and n == d+2:
+% b = abs(B[d][0])^(1/2^d)
+% shortlist.append( b )
+% M = lcm( M, cyc_embed(b) )
+%
+% M = lcm(M,2^n)
+%
+% if n <= d:
+% M = lcm( M, 2^(n+1) )
+%
+% if n == 1 and d >= 1:
+% shortlist.append(-1)
+% if n > 1 and -1 in shortlist:
+% shortlist.remove(-1)
+%
+% aux = [] # Next line of ad_fail table
+%
+% for dM in divisors( M ):
+% if dM % (2^n) != 0:
+% continue
+%
+% S = [ product(s) for s in subsets( shortlist ) ]
+% H = [ cyc_embed( s ) for s in S ]
+% r = len( [ b for b in H if dM % b == 0 ] )
+%
+% if n <= d and dM % (2^(n+1)) == 0 and n > 1:
+% r *= 2
+%
+% if 8 in H and dM % 8 == 0 and (n >= 3 or (n == 2 and n <= d)):
+% r = r/2
+%
+% if special_element != (1,1) and special_element[0] == n+1:
+% nothing_to_do = False
+% intersecting_QdM = False
+% for s in S:
+% new_special = ( n+1, special_element[1] * s )
+% m = special_embed( new_special )
+% if n == 2 and m == 4: # \zeta_8 times 2 times square
+% nothing_to_do = True
+% if dM % m == 0:
+% intersecting_QdM = True
+% if intersecting_QdM and not nothing_to_do:
+% r *= 2
+%
+% aux.append( (dM,r) )
+%
+% ad_fail.append(aux)
+%
+% return ad_fail
+%\end{lstlisting}
+%
+%We have used the following auxiliary functions:
+%
+%\begin{lstlisting}
+%# Computes the minimal cyclotomic field containing \sqrt(b)
+%def cyc_embed( b ):
+% m = squarefree_part(b)
+% if m%4 != 1:
+% m *= 4
+% return abs(m)
+%
+%# Computes the minimal cyclotomic field containing \zeta_{2^n}\sqrt(b)
+%def special_embed( (n,b) ):
+% m = squarefree_part(b)
+% if n == 3 and m % 2 == 0:
+% return 4 * cyc_embed(m/2)
+% else:
+% return lcm( 2^n, cyc_embed(b) )
+%\end{lstlisting}
+\pagebreak
+
+\section*{The pseudo-code}
+We translate the SageMath code into pseudocode for ease of readability.
+
+\begin{algorithm}
+\caption{Compute the adelic failure}
+\begin{algorithmic}
+\State Let $B$, $t$, $d$ and $N$ as described in the previous section
+\State Let $M\leftarrow1$, $\texttt{special\_element}\leftarrow1$ and $\texttt{shortlist}\leftarrow[\,]$
+
+\State
+
+\For {$n=1$ to $N$}
+\If{$n-1<t$}
+\For{$g\in B_{n-1}$}
+\If{$g<0$ and $n>1$}
+\State $\texttt{special\_element}\leftarrow(n+1,\sqrt[2^{n-1}]{|g|})$
+\State $M\leftarrow\lcm(M,\texttt{special\_embed}(\texttt{special\_element}))$
+\Else
+\State Add $\sqrt[2^{n-1}]{g}$ to \texttt{shortlist}
+\State $M\leftarrow\lcm(M,\texttt{cyc\_embed}(g))$
+\EndIf
+\EndFor
+\EndIf
+
+\State
+
+\If{$n=d+2$ and $d\neq -1$}
+\State Add $\sqrt[2^{d}]{|B_{d,0}|}$ to \texttt{shortlist}
+\State $M\leftarrow\lcm(M,\texttt{cyc\_embed}(|B_{d,0}|))$
+\EndIf
+
+\State
+\If{$n\leq d$}
+\State $M\leftarrow\lcm(M,2^{n+1})$
+\Else
+\State $M\leftarrow\lcm(M,2^n)$
+\EndIf
+\State
+
+\If{$n=1$ and $d\geq 1$}
+\State Add $-1$ to \texttt{shortlist}
+\EndIf
+\State
+\If{$n>1$}
+\State Remove $-1$ from \texttt{shortlist} (if present)
+\EndIf
+\State
+\algstore{alg1}
+\end{algorithmic}
+\end{algorithm}
+\pagebreak
+
+\begin{algorithm}
+\begin{algorithmic}
+\algrestore{alg1}
+\ForAll{$d_M\in \texttt{divisors}(M)$ such that $2^n\,|\,M$}
+\State $S\leftarrow\left\{\prod_{x\in T}x\,|\,T\subseteq\texttt{shortlist}\right\}$
+\State $H\leftarrow\left\{\min\left\{x\in\mathbb{Z}_{>0}\,|\sqrt{s}\in \mathbb{Q}_x\right\}\,|\,s\in S\right\}$
+\State $r\leftarrow\# \left\{s\in S\,|\, \sqrt{s}\in\mathbb{Q}_{d_M}\right\}$
+\State
+\If{$q<n\leq d$ and $2^{n+1}\,|\,{d_M}$}
+\State $r\leftarrow 2r$
+\EndIf
+\State
+\If{$8\in H$ and $8\,|\,d_M$ and (either $n\geq 3$ or $n=2\leq d$)}
+\State $r\leftarrow r/2$
+\EndIf
+\State
+
+\If{$\texttt{special\_element}=\zeta_{2^{n+1}}\sqrt{b}$ for some $b\in\mathbb{Q}$}
+\State $\texttt{specials}\leftarrow\{\zeta_{2^{n+1}}\sqrt{bs}\,|\,s\in S\}$
+\If{$\exists x\in \texttt{specials}$ such that $x\in\mathbb{Q}_{d_M}$ and $\texttt{special\_embed}(s)\neq 4\,\forall s\in\texttt{specials}$}
+\State $r\leftarrow 2r$
+\EndIf
+\EndIf
+\State
+\State Declare $\left[\mathbb{Q}_{2^n}\left(\sqrt[2^n]{G}\right)\cap \mathbb{Q}_{d_M}:\mathbb{Q}_{2^n}\right]=r$.
+
+\EndFor
+\EndFor
+\end{algorithmic}
+\end{algorithm}
+
+\pagebreak
+
+\section*{Pseudo-code, the sub-cases}
+
+We divide the pseudocode in sub-cases. In each sub-case we apply the trivial simplifications to the pseudo-code above.
+
+\subsection*{Case $G\leq \mathbb{Q}_+^\times$}
+
+\begin{algorithm}
+\caption{Adelic failure, case $G\leq \mathbb{Q}^\times$}
+
+\begin{algorithmic}
+\For {$n=1$ to $N$}
+\For{$g\in B_{n-1}$}
+\State Add $\sqrt[2^{n-1}]{g}$ to \texttt{shortlist}
+\State $M\leftarrow\lcm(M,\texttt{cyc\_embed}(g))$
+\EndFor
+\State
+\State $M\leftarrow\lcm(M,2^n)$
+\State
+\ForAll{$d_M\in \texttt{divisors}(M)$ such that $2^n\,|\,M$}
+\State $S\leftarrow\left\{\prod_{x\in T}x\,|\,T\subseteq\texttt{shortlist}\right\}$
+\State $H\leftarrow\left\{\min\left\{x\in\mathbb{Z}_{>0}\,|\sqrt{s}\in \mathbb{Q}_x\right\}\,|\,s\in S\right\}$
+\State $r\leftarrow\# \left\{s\in S\,|\, \sqrt{s}\in\mathbb{Q}_{d_M}\right\}$
+%\State
+\State Declare $\left[\mathbb{Q}_{2^n}\left(\sqrt[2^n]{G}\right)\cap \mathbb{Q}_{d_M}:\mathbb{Q}_{2^n}\right]=\begin{cases}
+r/2&\text{ if }8\in H\text{ and }n\geq 3,\\
+r&\text{ otherwise}.
+\end{cases}$
+\EndFor
+\EndFor
+\end{algorithmic}
+
+\end{algorithm}
+\pagebreak
+\subsection*{Case $d\neq -1$, $n\leq d$}
+For this and the following cases, we assume we are already inside the main \texttt{for} cycle, since we have particular assumptions on $n$.
+\begin{algorithm}
+\caption{Adelic failure, case $d\neq -1$, $n\leq d$}
+\begin{algorithmic}
+\For{$g\in B_{n-1}$}
+\State Add $\sqrt[2^{n-1}]{g}$ to \texttt{shortlist}
+\State $M\leftarrow\lcm(M,\texttt{cyc\_embed}(g))$
+\EndFor
+\State
+\State $M\leftarrow\lcm(M,2^{n+1})$
+\State
+\If{$n=1$ and $d\geq 1$}
+\State Add $-1$ to \texttt{shortlist}
+\EndIf
+\State
+\If{$n>1$}
+\State Remove $-1$ from \texttt{shortlist} (if present)
+\EndIf
+\State
+\ForAll{$d_M\in \texttt{divisors}(M)$ such that $2^n\,|\,M$}
+\State $S\leftarrow\left\{\prod_{x\in T}x\,|\,T\subseteq\texttt{shortlist}\right\}$
+\State $H\leftarrow\left\{\min\left\{x\in\mathbb{Z}_{>0}\,|\sqrt{s}\in \mathbb{Q}_x\right\}\,|\,s\in S\right\}$
+\State $r\leftarrow\# \left\{s\in S\,|\, \sqrt{s}\in\mathbb{Q}_{d_M}\right\}$
+\State
+\If{$n>1$ and $2^{n+1}\,|\,d_M$}
+\State $r\leftarrow 2r$
+\EndIf
+\State Declare $\left[\mathbb{Q}_{2^n}\left(\sqrt[2^n]{G}\right)\cap \mathbb{Q}_{d_M}:\mathbb{Q}_{2^n}\right]=\begin{cases}
+r/2&\text{ if }8\in H\text{ and }n\geq 3,\\
+r/2&\text{ if }8\in H\text{ and }n=2\text{ and }8\,|\,d_M\\
+r&\text{ otherwise}.
+\end{cases}$
+\EndFor
+\end{algorithmic}
+
+\end{algorithm}
+
+
+\pagebreak
+\subsection*{Case $d\neq -1$, $n\geq d+2$}
+
+\begin{algorithm}
+\caption{Adelic failure, case $d\neq -1$, $n\geq d+2$}
+\begin{algorithmic}
+\If{$n-1<t$}
+\For{$g\in B_{n-1}$}
+\State Add $\sqrt[2^{n-1}]{g}$ to \texttt{shortlist}
+\State $M\leftarrow\lcm(M,\texttt{cyc\_embed}(g))$
+\EndFor
+\EndIf
+\State
+
+\If{$n=d+2$}
+\State Add $\sqrt[2^{d}]{|B_{d,0}|}$ to \texttt{shortlist}
+\State $M\leftarrow\lcm(M,\texttt{cyc\_embed}(|B_{d,0}|))$
+\EndIf
+
+\State
+\State $M\leftarrow\lcm(M,2^{n})$
+\State
+\ForAll{$d_M\in \texttt{divisors}(M)$ such that $2^n\,|\,M$}
+\State $S\leftarrow\left\{\prod_{x\in T}x\,|\,T\subseteq\texttt{shortlist}\right\}$
+\State $H\leftarrow\left\{\min\left\{x\in\mathbb{Z}_{>0}\,|\sqrt{s}\in \mathbb{Q}_x\right\}\,|\,s\in S\right\}$
+\State $r\leftarrow\# \left\{s\in S\,|\, \sqrt{s}\in\mathbb{Q}_{d_M}\right\}$
+\State Declare $\left[\mathbb{Q}_{2^n}\left(\sqrt[2^n]{G}\right)\cap \mathbb{Q}_{d_M}:\mathbb{Q}_{2^n}\right]=\begin{cases}
+r/2&\text{ if }8\in H,\\
+r&\text{ otherwise}.
+\end{cases}$
+\EndFor
+\end{algorithmic}
+
+\end{algorithm}
+
+\pagebreak
+
+\subsection*{Case $d\neq -1$, $n= d+1$}
+
+\begin{algorithm}
+\caption{Adelic failure, case $d\neq -1$, $n= d+1$}
+\begin{algorithmic}
+\For{$g\in B_{n-1}$}
+\If{$g<0$}
+\State $\texttt{special\_element}\leftarrow(n+1,\sqrt[2^{n-1}]{|g|})$
+\State $M\leftarrow\lcm(M,\texttt{special\_embed}(\texttt{special\_element}))$
+\Else
+\State Add $\sqrt[2^{n-1}]{g}$ to \texttt{shortlist}
+\State $M\leftarrow\lcm(M,\texttt{cyc\_embed}(g))$
+\EndIf
+\EndFor
+\State
+\State $M\leftarrow\lcm(M,2^{n})$
+\State
+\State Remove $-1$ from \texttt{shortlist} (if present)
+
+
+\State
+\ForAll{$d_M\in \texttt{divisors}(M)$ such that $2^n\,|\,M$}
+\State $S\leftarrow\left\{\prod_{x\in T}x\,|\,T\subseteq\texttt{shortlist}\right\}$
+\State $H\leftarrow\left\{\min\left\{x\in\mathbb{Z}_{>0}\,|\sqrt{s}\in \mathbb{Q}_x\right\}\,|\,s\in S\right\}$
+\State $r\leftarrow\# \left\{s\in S\,|\, \sqrt{s}\in\mathbb{Q}_{d_M}\right\}$
+\State
+%\State $\texttt{specials}\leftarrow\{\zeta_{2^{n+1}}\sqrt{bs}\,|\,s\in S\}$
+\If{$\exists x\in \{\zeta_{2^{n+1}}\sqrt{bs}\,|\,s\in S\}\cap\mathbb{Q}_{d_M}$ and $\texttt{special\_embed}(s)\neq 4\,\forall s\in\texttt{specials}$}
+\State $r\leftarrow 2r$
+\EndIf
+\State Declare $\left[\mathbb{Q}_{2^n}\left(\sqrt[2^n]{G}\right)\cap \mathbb{Q}_{d_M}:\mathbb{Q}_{2^n}\right]=\begin{cases}
+r/2&\text{ if }8\in H\text{ and }n\geq 3,\\
+r&\text{ otherwise}.
+\end{cases}$
+\EndFor
+\end{algorithmic}
+
+\end{algorithm}
+
+\begin{thebibliography}{10} \expandafter\ifx\csname url\endcsname\relax \def\url#1{\texttt{#1}}\fi \expandafter\ifx\csname urlprefix\endcsname\relax\def\urlprefix{URL }\fi
+
+\bibitem{DebryPerucca}
+\textsc{Debry, C. - Perucca, A.}: \emph{Reductions of algebraic integers}, J. Number Theory, {\bf 167} (2016), 259--283.
+
+\bibitem{PST1}
+\textsc{Perucca, A. - Sgobba, P. - Tronto, S.}: \emph{Explicit Kummer Theory for the rational numbers}, preprint.
+
+\end{thebibliography}
+
+\end{document}
+\ No newline at end of file
diff --git a/tex/old/compute_degree.aux b/tex/old/compute_degree.aux
@@ -0,0 +1,14 @@
+\relax
+\citation{DebryPerucca}
+\citation{DebryPerucca}
+\newlabel{lemma_zero}{{1}{1}}
+\newlabel{degree}{{1}{1}}
+\@writefile{toc}{\contentsline {section}{\numberline {1}Case $G\leq \mathbb {Q}_+^\times $}{1}}
+\@writefile{toc}{\contentsline {section}{\numberline {2}General case}{2}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {2.1}General case, $n=1(\leq d)$}{2}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {2.2}General case, $n=2\leq d$}{2}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {2.3}General case, $3\leq n\leq d$}{2}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {2.4}General case, $n\geq d+2$}{3}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {2.5}General case, $n=d+1$}{3}}
+\bibcite{DebryPerucca}{1}
+\bibcite{PeruccaSgobba}{2}
diff --git a/tex/old/compute_degree.log b/tex/old/compute_degree.log
@@ -0,0 +1,706 @@
+This is pdfTeX, Version 3.14159265-2.6-1.40.18 (TeX Live 2017/Debian) (preloaded format=pdflatex 2019.9.20) 20 SEP 2019 10:05
+entering extended mode
+ \write18 enabled.
+ %&-line parsing enabled.
+**compute_degree.tex
+(./compute_degree.tex
+LaTeX2e <2017-04-15>
+Babel <3.18> and hyphenation patterns for 18 language(s) loaded.
+(/usr/share/texlive/texmf-dist/tex/latex/base/article.cls
+Document Class: article 2014/09/29 v1.4h Standard LaTeX document class
+(/usr/share/texlive/texmf-dist/tex/latex/base/size10.clo
+File: size10.clo 2014/09/29 v1.4h Standard LaTeX file (size option)
+)
+\c@part=\count79
+\c@section=\count80
+\c@subsection=\count81
+\c@subsubsection=\count82
+\c@paragraph=\count83
+\c@subparagraph=\count84
+\c@figure=\count85
+\c@table=\count86
+\abovecaptionskip=\skip41
+\belowcaptionskip=\skip42
+\bibindent=\dimen102
+)
+(/usr/share/texlive/texmf-dist/tex/latex/base/inputenc.sty
+Package: inputenc 2015/03/17 v1.2c Input encoding file
+\inpenc@prehook=\toks14
+\inpenc@posthook=\toks15
+
+(/usr/share/texlive/texmf-dist/tex/latex/base/utf8.def
+File: utf8.def 2017/01/28 v1.1t UTF-8 support for inputenc
+Now handling font encoding OML ...
+... no UTF-8 mapping file for font encoding OML
+Now handling font encoding T1 ...
+... processing UTF-8 mapping file for font encoding T1
+
+(/usr/share/texlive/texmf-dist/tex/latex/base/t1enc.dfu
+File: t1enc.dfu 2017/01/28 v1.1t UTF-8 support for inputenc
+ defining Unicode char U+00A0 (decimal 160)
+ defining Unicode char U+00A1 (decimal 161)
+ defining Unicode char U+00A3 (decimal 163)
+ defining Unicode char U+00AB (decimal 171)
+ defining Unicode char U+00AD (decimal 173)
+ defining Unicode char U+00BB (decimal 187)
+ defining Unicode char U+00BF (decimal 191)
+ defining Unicode char U+00C0 (decimal 192)
+ defining Unicode char U+00C1 (decimal 193)
+ defining Unicode char U+00C2 (decimal 194)
+ defining Unicode char U+00C3 (decimal 195)
+ defining Unicode char U+00C4 (decimal 196)
+ defining Unicode char U+00C5 (decimal 197)
+ defining Unicode char U+00C6 (decimal 198)
+ defining Unicode char U+00C7 (decimal 199)
+ defining Unicode char U+00C8 (decimal 200)
+ defining Unicode char U+00C9 (decimal 201)
+ defining Unicode char U+00CA (decimal 202)
+ defining Unicode char U+00CB (decimal 203)
+ defining Unicode char U+00CC (decimal 204)
+ defining Unicode char U+00CD (decimal 205)
+ defining Unicode char U+00CE (decimal 206)
+ defining Unicode char U+00CF (decimal 207)
+ defining Unicode char U+00D0 (decimal 208)
+ defining Unicode char U+00D1 (decimal 209)
+ defining Unicode char U+00D2 (decimal 210)
+ defining Unicode char U+00D3 (decimal 211)
+ defining Unicode char U+00D4 (decimal 212)
+ defining Unicode char U+00D5 (decimal 213)
+ defining Unicode char U+00D6 (decimal 214)
+ defining Unicode char U+00D8 (decimal 216)
+ defining Unicode char U+00D9 (decimal 217)
+ defining Unicode char U+00DA (decimal 218)
+ defining Unicode char U+00DB (decimal 219)
+ defining Unicode char U+00DC (decimal 220)
+ defining Unicode char U+00DD (decimal 221)
+ defining Unicode char U+00DE (decimal 222)
+ defining Unicode char U+00DF (decimal 223)
+ defining Unicode char U+00E0 (decimal 224)
+ defining Unicode char U+00E1 (decimal 225)
+ defining Unicode char U+00E2 (decimal 226)
+ defining Unicode char U+00E3 (decimal 227)
+ defining Unicode char U+00E4 (decimal 228)
+ defining Unicode char U+00E5 (decimal 229)
+ defining Unicode char U+00E6 (decimal 230)
+ defining Unicode char U+00E7 (decimal 231)
+ defining Unicode char U+00E8 (decimal 232)
+ defining Unicode char U+00E9 (decimal 233)
+ defining Unicode char U+00EA (decimal 234)
+ defining Unicode char U+00EB (decimal 235)
+ defining Unicode char U+00EC (decimal 236)
+ defining Unicode char U+00ED (decimal 237)
+ defining Unicode char U+00EE (decimal 238)
+ defining Unicode char U+00EF (decimal 239)
+ defining Unicode char U+00F0 (decimal 240)
+ defining Unicode char U+00F1 (decimal 241)
+ defining Unicode char U+00F2 (decimal 242)
+ defining Unicode char U+00F3 (decimal 243)
+ defining Unicode char U+00F4 (decimal 244)
+ defining Unicode char U+00F5 (decimal 245)
+ defining Unicode char U+00F6 (decimal 246)
+ defining Unicode char U+00F8 (decimal 248)
+ defining Unicode char U+00F9 (decimal 249)
+ defining Unicode char U+00FA (decimal 250)
+ defining Unicode char U+00FB (decimal 251)
+ defining Unicode char U+00FC (decimal 252)
+ defining Unicode char U+00FD (decimal 253)
+ defining Unicode char U+00FE (decimal 254)
+ defining Unicode char U+00FF (decimal 255)
+ defining Unicode char U+0100 (decimal 256)
+ defining Unicode char U+0101 (decimal 257)
+ defining Unicode char U+0102 (decimal 258)
+ defining Unicode char U+0103 (decimal 259)
+ defining Unicode char U+0104 (decimal 260)
+ defining Unicode char U+0105 (decimal 261)
+ defining Unicode char U+0106 (decimal 262)
+ defining Unicode char U+0107 (decimal 263)
+ defining Unicode char U+0108 (decimal 264)
+ defining Unicode char U+0109 (decimal 265)
+ defining Unicode char U+010A (decimal 266)
+ defining Unicode char U+010B (decimal 267)
+ defining Unicode char U+010C (decimal 268)
+ defining Unicode char U+010D (decimal 269)
+ defining Unicode char U+010E (decimal 270)
+ defining Unicode char U+010F (decimal 271)
+ defining Unicode char U+0110 (decimal 272)
+ defining Unicode char U+0111 (decimal 273)
+ defining Unicode char U+0112 (decimal 274)
+ defining Unicode char U+0113 (decimal 275)
+ defining Unicode char U+0114 (decimal 276)
+ defining Unicode char U+0115 (decimal 277)
+ defining Unicode char U+0116 (decimal 278)
+ defining Unicode char U+0117 (decimal 279)
+ defining Unicode char U+0118 (decimal 280)
+ defining Unicode char U+0119 (decimal 281)
+ defining Unicode char U+011A (decimal 282)
+ defining Unicode char U+011B (decimal 283)
+ defining Unicode char U+011C (decimal 284)
+ defining Unicode char U+011D (decimal 285)
+ defining Unicode char U+011E (decimal 286)
+ defining Unicode char U+011F (decimal 287)
+ defining Unicode char U+0120 (decimal 288)
+ defining Unicode char U+0121 (decimal 289)
+ defining Unicode char U+0122 (decimal 290)
+ defining Unicode char U+0123 (decimal 291)
+ defining Unicode char U+0124 (decimal 292)
+ defining Unicode char U+0125 (decimal 293)
+ defining Unicode char U+0128 (decimal 296)
+ defining Unicode char U+0129 (decimal 297)
+ defining Unicode char U+012A (decimal 298)
+ defining Unicode char U+012B (decimal 299)
+ defining Unicode char U+012C (decimal 300)
+ defining Unicode char U+012D (decimal 301)
+ defining Unicode char U+012E (decimal 302)
+ defining Unicode char U+012F (decimal 303)
+ defining Unicode char U+0130 (decimal 304)
+ defining Unicode char U+0131 (decimal 305)
+ defining Unicode char U+0132 (decimal 306)
+ defining Unicode char U+0133 (decimal 307)
+ defining Unicode char U+0134 (decimal 308)
+ defining Unicode char U+0135 (decimal 309)
+ defining Unicode char U+0136 (decimal 310)
+ defining Unicode char U+0137 (decimal 311)
+ defining Unicode char U+0139 (decimal 313)
+ defining Unicode char U+013A (decimal 314)
+ defining Unicode char U+013B (decimal 315)
+ defining Unicode char U+013C (decimal 316)
+ defining Unicode char U+013D (decimal 317)
+ defining Unicode char U+013E (decimal 318)
+ defining Unicode char U+0141 (decimal 321)
+ defining Unicode char U+0142 (decimal 322)
+ defining Unicode char U+0143 (decimal 323)
+ defining Unicode char U+0144 (decimal 324)
+ defining Unicode char U+0145 (decimal 325)
+ defining Unicode char U+0146 (decimal 326)
+ defining Unicode char U+0147 (decimal 327)
+ defining Unicode char U+0148 (decimal 328)
+ defining Unicode char U+014A (decimal 330)
+ defining Unicode char U+014B (decimal 331)
+ defining Unicode char U+014C (decimal 332)
+ defining Unicode char U+014D (decimal 333)
+ defining Unicode char U+014E (decimal 334)
+ defining Unicode char U+014F (decimal 335)
+ defining Unicode char U+0150 (decimal 336)
+ defining Unicode char U+0151 (decimal 337)
+ defining Unicode char U+0152 (decimal 338)
+ defining Unicode char U+0153 (decimal 339)
+ defining Unicode char U+0154 (decimal 340)
+ defining Unicode char U+0155 (decimal 341)
+ defining Unicode char U+0156 (decimal 342)
+ defining Unicode char U+0157 (decimal 343)
+ defining Unicode char U+0158 (decimal 344)
+ defining Unicode char U+0159 (decimal 345)
+ defining Unicode char U+015A (decimal 346)
+ defining Unicode char U+015B (decimal 347)
+ defining Unicode char U+015C (decimal 348)
+ defining Unicode char U+015D (decimal 349)
+ defining Unicode char U+015E (decimal 350)
+ defining Unicode char U+015F (decimal 351)
+ defining Unicode char U+0160 (decimal 352)
+ defining Unicode char U+0161 (decimal 353)
+ defining Unicode char U+0162 (decimal 354)
+ defining Unicode char U+0163 (decimal 355)
+ defining Unicode char U+0164 (decimal 356)
+ defining Unicode char U+0165 (decimal 357)
+ defining Unicode char U+0168 (decimal 360)
+ defining Unicode char U+0169 (decimal 361)
+ defining Unicode char U+016A (decimal 362)
+ defining Unicode char U+016B (decimal 363)
+ defining Unicode char U+016C (decimal 364)
+ defining Unicode char U+016D (decimal 365)
+ defining Unicode char U+016E (decimal 366)
+ defining Unicode char U+016F (decimal 367)
+ defining Unicode char U+0170 (decimal 368)
+ defining Unicode char U+0171 (decimal 369)
+ defining Unicode char U+0172 (decimal 370)
+ defining Unicode char U+0173 (decimal 371)
+ defining Unicode char U+0174 (decimal 372)
+ defining Unicode char U+0175 (decimal 373)
+ defining Unicode char U+0176 (decimal 374)
+ defining Unicode char U+0177 (decimal 375)
+ defining Unicode char U+0178 (decimal 376)
+ defining Unicode char U+0179 (decimal 377)
+ defining Unicode char U+017A (decimal 378)
+ defining Unicode char U+017B (decimal 379)
+ defining Unicode char U+017C (decimal 380)
+ defining Unicode char U+017D (decimal 381)
+ defining Unicode char U+017E (decimal 382)
+ defining Unicode char U+01CD (decimal 461)
+ defining Unicode char U+01CE (decimal 462)
+ defining Unicode char U+01CF (decimal 463)
+ defining Unicode char U+01D0 (decimal 464)
+ defining Unicode char U+01D1 (decimal 465)
+ defining Unicode char U+01D2 (decimal 466)
+ defining Unicode char U+01D3 (decimal 467)
+ defining Unicode char U+01D4 (decimal 468)
+ defining Unicode char U+01E2 (decimal 482)
+ defining Unicode char U+01E3 (decimal 483)
+ defining Unicode char U+01E6 (decimal 486)
+ defining Unicode char U+01E7 (decimal 487)
+ defining Unicode char U+01E8 (decimal 488)
+ defining Unicode char U+01E9 (decimal 489)
+ defining Unicode char U+01EA (decimal 490)
+ defining Unicode char U+01EB (decimal 491)
+ defining Unicode char U+01F0 (decimal 496)
+ defining Unicode char U+01F4 (decimal 500)
+ defining Unicode char U+01F5 (decimal 501)
+ defining Unicode char U+0218 (decimal 536)
+ defining Unicode char U+0219 (decimal 537)
+ defining Unicode char U+021A (decimal 538)
+ defining Unicode char U+021B (decimal 539)
+ defining Unicode char U+0232 (decimal 562)
+ defining Unicode char U+0233 (decimal 563)
+ defining Unicode char U+1E02 (decimal 7682)
+ defining Unicode char U+1E03 (decimal 7683)
+ defining Unicode char U+200C (decimal 8204)
+ defining Unicode char U+2010 (decimal 8208)
+ defining Unicode char U+2011 (decimal 8209)
+ defining Unicode char U+2012 (decimal 8210)
+ defining Unicode char U+2013 (decimal 8211)
+ defining Unicode char U+2014 (decimal 8212)
+ defining Unicode char U+2015 (decimal 8213)
+ defining Unicode char U+2018 (decimal 8216)
+ defining Unicode char U+2019 (decimal 8217)
+ defining Unicode char U+201A (decimal 8218)
+ defining Unicode char U+201C (decimal 8220)
+ defining Unicode char U+201D (decimal 8221)
+ defining Unicode char U+201E (decimal 8222)
+ defining Unicode char U+2030 (decimal 8240)
+ defining Unicode char U+2031 (decimal 8241)
+ defining Unicode char U+2039 (decimal 8249)
+ defining Unicode char U+203A (decimal 8250)
+ defining Unicode char U+2423 (decimal 9251)
+ defining Unicode char U+1E20 (decimal 7712)
+ defining Unicode char U+1E21 (decimal 7713)
+)
+Now handling font encoding OT1 ...
+... processing UTF-8 mapping file for font encoding OT1
+
+(/usr/share/texlive/texmf-dist/tex/latex/base/ot1enc.dfu
+File: ot1enc.dfu 2017/01/28 v1.1t UTF-8 support for inputenc
+ defining Unicode char U+00A0 (decimal 160)
+ defining Unicode char U+00A1 (decimal 161)
+ defining Unicode char U+00A3 (decimal 163)
+ defining Unicode char U+00AD (decimal 173)
+ defining Unicode char U+00B8 (decimal 184)
+ defining Unicode char U+00BF (decimal 191)
+ defining Unicode char U+00C5 (decimal 197)
+ defining Unicode char U+00C6 (decimal 198)
+ defining Unicode char U+00D8 (decimal 216)
+ defining Unicode char U+00DF (decimal 223)
+ defining Unicode char U+00E6 (decimal 230)
+ defining Unicode char U+00EC (decimal 236)
+ defining Unicode char U+00ED (decimal 237)
+ defining Unicode char U+00EE (decimal 238)
+ defining Unicode char U+00EF (decimal 239)
+ defining Unicode char U+00F8 (decimal 248)
+ defining Unicode char U+0131 (decimal 305)
+ defining Unicode char U+0141 (decimal 321)
+ defining Unicode char U+0142 (decimal 322)
+ defining Unicode char U+0152 (decimal 338)
+ defining Unicode char U+0153 (decimal 339)
+ defining Unicode char U+0174 (decimal 372)
+ defining Unicode char U+0175 (decimal 373)
+ defining Unicode char U+0176 (decimal 374)
+ defining Unicode char U+0177 (decimal 375)
+ defining Unicode char U+0218 (decimal 536)
+ defining Unicode char U+0219 (decimal 537)
+ defining Unicode char U+021A (decimal 538)
+ defining Unicode char U+021B (decimal 539)
+ defining Unicode char U+2013 (decimal 8211)
+ defining Unicode char U+2014 (decimal 8212)
+ defining Unicode char U+2018 (decimal 8216)
+ defining Unicode char U+2019 (decimal 8217)
+ defining Unicode char U+201C (decimal 8220)
+ defining Unicode char U+201D (decimal 8221)
+)
+Now handling font encoding OMS ...
+... processing UTF-8 mapping file for font encoding OMS
+
+(/usr/share/texlive/texmf-dist/tex/latex/base/omsenc.dfu
+File: omsenc.dfu 2017/01/28 v1.1t UTF-8 support for inputenc
+ defining Unicode char U+00A7 (decimal 167)
+ defining Unicode char U+00B6 (decimal 182)
+ defining Unicode char U+00B7 (decimal 183)
+ defining Unicode char U+2020 (decimal 8224)
+ defining Unicode char U+2021 (decimal 8225)
+ defining Unicode char U+2022 (decimal 8226)
+)
+Now handling font encoding OMX ...
+... no UTF-8 mapping file for font encoding OMX
+Now handling font encoding U ...
+... no UTF-8 mapping file for font encoding U
+ defining Unicode char U+00A9 (decimal 169)
+ defining Unicode char U+00AA (decimal 170)
+ defining Unicode char U+00AE (decimal 174)
+ defining Unicode char U+00BA (decimal 186)
+ defining Unicode char U+02C6 (decimal 710)
+ defining Unicode char U+02DC (decimal 732)
+ defining Unicode char U+200C (decimal 8204)
+ defining Unicode char U+2026 (decimal 8230)
+ defining Unicode char U+2122 (decimal 8482)
+ defining Unicode char U+2423 (decimal 9251)
+))
+(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty
+Package: amsmath 2017/09/02 v2.17a AMS math features
+\@mathmargin=\skip43
+
+For additional information on amsmath, use the `?' option.
+(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty
+Package: amstext 2000/06/29 v2.01 AMS text
+
+(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty
+File: amsgen.sty 1999/11/30 v2.0 generic functions
+\@emptytoks=\toks16
+\ex@=\dimen103
+))
+(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty
+Package: amsbsy 1999/11/29 v1.2d Bold Symbols
+\pmbraise@=\dimen104
+)
+(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty
+Package: amsopn 2016/03/08 v2.02 operator names
+)
+\inf@bad=\count87
+LaTeX Info: Redefining \frac on input line 213.
+\uproot@=\count88
+\leftroot@=\count89
+LaTeX Info: Redefining \overline on input line 375.
+\classnum@=\count90
+\DOTSCASE@=\count91
+LaTeX Info: Redefining \ldots on input line 472.
+LaTeX Info: Redefining \dots on input line 475.
+LaTeX Info: Redefining \cdots on input line 596.
+\Mathstrutbox@=\box26
+\strutbox@=\box27
+\big@size=\dimen105
+LaTeX Font Info: Redeclaring font encoding OML on input line 712.
+LaTeX Font Info: Redeclaring font encoding OMS on input line 713.
+\macc@depth=\count92
+\c@MaxMatrixCols=\count93
+\dotsspace@=\muskip10
+\c@parentequation=\count94
+\dspbrk@lvl=\count95
+\tag@help=\toks17
+\row@=\count96
+\column@=\count97
+\maxfields@=\count98
+\andhelp@=\toks18
+\eqnshift@=\dimen106
+\alignsep@=\dimen107
+\tagshift@=\dimen108
+\tagwidth@=\dimen109
+\totwidth@=\dimen110
+\lineht@=\dimen111
+\@envbody=\toks19
+\multlinegap=\skip44
+\multlinetaggap=\skip45
+\mathdisplay@stack=\toks20
+LaTeX Info: Redefining \[ on input line 2817.
+LaTeX Info: Redefining \] on input line 2818.
+)
+(/usr/share/texlive/texmf-dist/tex/latex/amscls/amsthm.sty
+Package: amsthm 2017/10/31 v2.20.4
+\thm@style=\toks21
+\thm@bodyfont=\toks22
+\thm@headfont=\toks23
+\thm@notefont=\toks24
+\thm@headpunct=\toks25
+\thm@preskip=\skip46
+\thm@postskip=\skip47
+\thm@headsep=\skip48
+\dth@everypar=\toks26
+)
+(/usr/share/texlive/texmf-dist/tex/generic/xypic/xy.sty
+(/usr/share/texlive/texmf-dist/tex/generic/xypic/xy.tex Bootstrap'ing:
+catcodes, docmode, (/usr/share/texlive/texmf-dist/tex/generic/xypic/xyrecat.tex
+) (/usr/share/texlive/texmf-dist/tex/generic/xypic/xyidioms.tex)
+
+ Xy-pic version 3.8.9 <2013/10/06>
+ Copyright (c) 1991-2013 by Kristoffer H. Rose <krisrose@tug.org> and others
+ Xy-pic is free software: see the User's Guide for details.
+
+Loading kernel: messages; fonts; allocations: state,
+\X@c=\dimen112
+\Y@c=\dimen113
+\U@c=\dimen114
+\D@c=\dimen115
+\L@c=\dimen116
+\R@c=\dimen117
+\Edge@c=\toks27
+\X@p=\dimen118
+\Y@p=\dimen119
+\U@p=\dimen120
+\D@p=\dimen121
+\L@p=\dimen122
+\R@p=\dimen123
+\Edge@p=\toks28
+\X@origin=\dimen124
+\Y@origin=\dimen125
+\X@xbase=\dimen126
+\Y@xbase=\dimen127
+\X@ybase=\dimen128
+\Y@ybase=\dimen129
+\X@min=\dimen130
+\Y@min=\dimen131
+\X@max=\dimen132
+\Y@max=\dimen133
+\lastobjectbox@=\box28
+\zerodotbox@=\box29
+\almostz@=\dimen134
+ direction,
+\d@X=\dimen135
+\d@Y=\dimen136
+\K@=\count99
+\KK@=\count100
+\Direction=\count101
+\K@dXdY=\dimen137
+\K@dYdX=\dimen138
+\xyread@=\read1
+\xywrite@=\write3
+\csp@=\count102
+\quotPTK@=\dimen139
+
+utility macros; pictures: \xy, positions,
+\swaptoks@@=\toks29
+\connectobjectbox@@=\box30
+ objects,
+\styletoks@=\toks30
+ decorations;
+kernel objects: directionals, circles, text; options; algorithms: directions,
+edges, connections; Xy-pic loaded)
+(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/ifpdf.sty
+Package: ifpdf 2017/03/15 v3.2 Provides the ifpdf switch
+)
+Package: xy 2013/10/06 Xy-pic version 3.8.9
+
+(/usr/share/texlive/texmf-dist/tex/generic/xypic/xyall.tex
+ Xy-pic option: All features v.3.8
+(/usr/share/texlive/texmf-dist/tex/generic/xypic/xycurve.tex
+ Xy-pic option: Curve and Spline extension v.3.12 curve,
+\crv@cnt@=\count103
+\crvpts@=\toks31
+\splinebox@=\box31
+\splineval@=\dimen140
+\splinedepth@=\dimen141
+\splinetol@=\dimen142
+\splinelength@=\dimen143
+ circles,
+\L@=\dimen144
+ loaded)
+(/usr/share/texlive/texmf-dist/tex/generic/xypic/xyframe.tex
+ Xy-pic option: Frame and Bracket extension v.3.14 loaded)
+(/usr/share/texlive/texmf-dist/tex/generic/xypic/xycmtip.tex
+ Xy-pic option: Computer Modern tip extension v.3.7
+(/usr/share/texlive/texmf-dist/tex/generic/xypic/xytips.tex
+ Xy-pic option: More Tips extension v.3.11 loaded) loaded)
+(/usr/share/texlive/texmf-dist/tex/generic/xypic/xyline.tex
+ Xy-pic option: Line styles extension v.3.10
+\xylinethick@=\dimen145
+ loaded)
+(/usr/share/texlive/texmf-dist/tex/generic/xypic/xyrotate.tex
+ Xy-pic option: Rotate and Scale extension v.3.8 loaded)
+(/usr/share/texlive/texmf-dist/tex/generic/xypic/xycolor.tex
+ Xy-pic option: Colour extension v.3.11 loaded)
+(/usr/share/texlive/texmf-dist/tex/generic/xypic/xymatrix.tex
+ Xy-pic option: Matrix feature v.3.14
+\Row=\count104
+\Col=\count105
+\queue@=\toks32
+\queue@@=\toks33
+\qcount@=\count106
+\qcount@@=\count107
+\matrixsize@=\count108
+ loaded)
+(/usr/share/texlive/texmf-dist/tex/generic/xypic/xyarrow.tex
+ Xy-pic option: Arrow and Path feature v.3.9 path, \ar, loaded)
+(/usr/share/texlive/texmf-dist/tex/generic/xypic/xygraph.tex
+ Xy-pic option: Graph feature v.3.11 loaded) loaded)
+(/usr/share/texlive/texmf-dist/tex/generic/xypic/xypdf.tex
+ Xy-pic option: PDF driver v.1.7 Xy-pic pdf driver: `color' extension support
+(/usr/share/texlive/texmf-dist/tex/generic/xypic/xypdf-co.tex loaded)
+Xy-pic pdf driver: `curve' extension support
+(/usr/share/texlive/texmf-dist/tex/generic/xypic/xypdf-cu.tex loaded)
+Xy-pic pdf driver: `frame' extension support
+(/usr/share/texlive/texmf-dist/tex/generic/xypic/xypdf-fr.tex loaded)
+Xy-pic pdf driver: `line' extension support
+(/usr/share/texlive/texmf-dist/tex/generic/xypic/xypdf-li.tex loaded)
+Xy-pic pdf driver: `rotate' extension support
+(/usr/share/texlive/texmf-dist/tex/generic/xypic/xypdf-ro.tex loaded) loaded))
+(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/amsfonts.sty
+Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support
+\symAMSa=\mathgroup4
+\symAMSb=\mathgroup5
+LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold'
+(Font) U/euf/m/n --> U/euf/b/n on input line 106.
+)
+(/usr/share/texlive/texmf-dist/tex/latex/graphics/color.sty
+Package: color 2016/07/10 v1.1e Standard LaTeX Color (DPC)
+
+(/usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/color.cfg
+File: color.cfg 2016/01/02 v1.6 sample color configuration
+)
+Package color Info: Driver file: pdftex.def on input line 147.
+
+(/usr/share/texlive/texmf-dist/tex/latex/graphics-def/pdftex.def
+File: pdftex.def 2018/01/08 v1.0l Graphics/color driver for pdftex
+))
+(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/amssymb.sty
+Package: amssymb 2013/01/14 v3.01 AMS font symbols
+)
+(/usr/share/texlive/texmf-dist/tex/latex/float/float.sty
+Package: float 2001/11/08 v1.3d Float enhancements (AL)
+\c@float@type=\count109
+\float@exts=\toks34
+\float@box=\box32
+\@float@everytoks=\toks35
+\@floatcapt=\box33
+)
+(/usr/share/texlive/texmf-dist/tex/latex/geometry/geometry.sty
+Package: geometry 2010/09/12 v5.6 Page Geometry
+
+(/usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty
+Package: keyval 2014/10/28 v1.15 key=value parser (DPC)
+\KV@toks@=\toks36
+)
+(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/ifvtex.sty
+Package: ifvtex 2016/05/16 v1.6 Detect VTeX and its facilities (HO)
+Package ifvtex Info: VTeX not detected.
+)
+(/usr/share/texlive/texmf-dist/tex/generic/ifxetex/ifxetex.sty
+Package: ifxetex 2010/09/12 v0.6 Provides ifxetex conditional
+)
+\Gm@cnth=\count110
+\Gm@cntv=\count111
+\c@Gm@tempcnt=\count112
+\Gm@bindingoffset=\dimen146
+\Gm@wd@mp=\dimen147
+\Gm@odd@mp=\dimen148
+\Gm@even@mp=\dimen149
+\Gm@layoutwidth=\dimen150
+\Gm@layoutheight=\dimen151
+\Gm@layouthoffset=\dimen152
+\Gm@layoutvoffset=\dimen153
+\Gm@dimlist=\toks37
+)
+\c@lemma=\count113
+
+(./compute_degree.aux)
+\openout1 = `compute_degree.aux'.
+
+LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 100.
+LaTeX Font Info: ... okay on input line 100.
+LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 100.
+LaTeX Font Info: ... okay on input line 100.
+LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 100.
+LaTeX Font Info: ... okay on input line 100.
+LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 100.
+LaTeX Font Info: ... okay on input line 100.
+LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 100.
+LaTeX Font Info: ... okay on input line 100.
+LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 100.
+LaTeX Font Info: ... okay on input line 100.
+LaTeX Font Info: Try loading font information for U+msa on input line 100.
+
+(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsa.fd
+File: umsa.fd 2013/01/14 v3.01 AMS symbols A
+)
+LaTeX Font Info: Try loading font information for U+msb on input line 100.
+
+(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsb.fd
+File: umsb.fd 2013/01/14 v3.01 AMS symbols B
+)
+Package xypdf Info: Line width: 0.39998pt on input line 100.
+
+(/usr/share/texlive/texmf-dist/tex/context/base/mkii/supp-pdf.mkii
+[Loading MPS to PDF converter (version 2006.09.02).]
+\scratchcounter=\count114
+\scratchdimen=\dimen154
+\scratchbox=\box34
+\nofMPsegments=\count115
+\nofMParguments=\count116
+\everyMPshowfont=\toks38
+\MPscratchCnt=\count117
+\MPscratchDim=\dimen155
+\MPnumerator=\count118
+\makeMPintoPDFobject=\count119
+\everyMPtoPDFconversion=\toks39
+)
+*geometry* driver: auto-detecting
+*geometry* detected driver: pdftex
+*geometry* verbose mode - [ preamble ] result:
+* driver: pdftex
+* paper: a4paper
+* layout: <same size as paper>
+* layoutoffset:(h,v)=(0.0pt,0.0pt)
+* modes:
+* h-part:(L,W,R)=(71.13188pt, 455.24411pt, 71.13188pt)
+* v-part:(T,H,B)=(85.35826pt, 674.33032pt, 85.35826pt)
+* \paperwidth=597.50787pt
+* \paperheight=845.04684pt
+* \textwidth=455.24411pt
+* \textheight=674.33032pt
+* \oddsidemargin=-1.1381pt
+* \evensidemargin=-1.1381pt
+* \topmargin=-23.91173pt
+* \headheight=12.0pt
+* \headsep=25.0pt
+* \topskip=10.0pt
+* \footskip=30.0pt
+* \marginparwidth=57.0pt
+* \marginparsep=11.0pt
+* \columnsep=10.0pt
+* \skip\footins=9.0pt plus 4.0pt minus 2.0pt
+* \hoffset=0.0pt
+* \voffset=0.0pt
+* \mag=1000
+* \@twocolumnfalse
+* \@twosidefalse
+* \@mparswitchfalse
+* \@reversemarginfalse
+* (1in=72.27pt=25.4mm, 1cm=28.453pt)
+
+[1
+
+{/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map}]
+LaTeX Font Info: Try loading font information for OMS+cmr on input line 217.
+
+
+(/usr/share/texlive/texmf-dist/tex/latex/base/omscmr.fd
+File: omscmr.fd 2014/09/29 v2.5h Standard LaTeX font definitions
+)
+LaTeX Font Info: Font shape `OMS/cmr/m/n' in size <10> not available
+(Font) Font shape `OMS/cmsy/m/n' tried instead on input line 217.
+ [2] [3] [4]
+(./compute_degree.aux) )
+Here is how much of TeX's memory you used:
+ 5407 strings out of 494283
+ 64833 string characters out of 6169691
+ 184730 words of memory out of 5000000
+ 8655 multiletter control sequences out of 15000+600000
+ 15245 words of font info for 62 fonts, out of 8000000 for 9000
+ 497 hyphenation exceptions out of 8191
+ 27i,16n,24p,3246b,313s stack positions out of 5000i,500n,10000p,200000b,80000s
+</usr/share/texlive/texmf-dist/fonts/type1/public/amsfo
+nts/cm/cmbx10.pfb></usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm
+/cmbx12.pfb></usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmcsc
+10.pfb></usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmex10.pfb
+></usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi10.pfb></usr
+/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi12.pfb></usr/share
+/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi5.pfb></usr/share/texliv
+e/texmf-dist/fonts/type1/public/amsfonts/cm/cmmi7.pfb></usr/share/texlive/texmf
+-dist/fonts/type1/public/amsfonts/cm/cmr10.pfb></usr/share/texlive/texmf-dist/f
+onts/type1/public/amsfonts/cm/cmr12.pfb></usr/share/texlive/texmf-dist/fonts/ty
+pe1/public/amsfonts/cm/cmr7.pfb></usr/share/texlive/texmf-dist/fonts/type1/publ
+ic/amsfonts/cm/cmsy10.pfb></usr/share/texlive/texmf-dist/fonts/type1/public/ams
+fonts/cm/cmsy5.pfb></usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/c
+m/cmsy7.pfb></usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/cm/cmti1
+0.pfb></usr/share/texlive/texmf-dist/fonts/type1/public/amsfonts/symbols/msbm10
+.pfb>
+Output written on compute_degree.pdf (4 pages, 176578 bytes).
+PDF statistics:
+ 81 PDF objects out of 1000 (max. 8388607)
+ 58 compressed objects within 1 object stream
+ 0 named destinations out of 1000 (max. 500000)
+ 1 words of extra memory for PDF output out of 10000 (max. 10000000)
+
diff --git a/tex/old/compute_degree.pdf b/tex/old/compute_degree.pdf
Binary files differ.
diff --git a/tex/old/compute_degree.synctex.gz b/tex/old/compute_degree.synctex.gz
Binary files differ.
diff --git a/tex/old/compute_degree.tex b/tex/old/compute_degree.tex
@@ -0,0 +1,320 @@
+\documentclass[10pt,a4paper]{article}
+\usepackage[utf8]{inputenc}
+\usepackage{amsmath}
+\usepackage{amsthm}
+\usepackage[all]{xy}
+\usepackage{amsfonts}
+\usepackage{color}
+\usepackage{amssymb}
+\usepackage{float}
+\usepackage[a4paper, top=3cm, bottom=3cm, left=2.5cm, right=2.5cm]{geometry}
+
+\DeclareMathOperator{\alg}{alg}
+\DeclareMathOperator{\obj}{Obj}
+\DeclareMathOperator{\Hom}{Hom}
+\DeclareMathOperator{\End}{End}
+\DeclareMathOperator{\hol}{Hol}
+\DeclareMathOperator{\aut}{Aut}
+\DeclareMathOperator{\gal}{Gal}
+\DeclareMathOperator{\id}{id}
+\DeclareMathOperator{\res}{res}
+\DeclareMathOperator{\im}{Im}
+\DeclareMathOperator{\Id}{Id}
+\DeclareMathOperator{\fib}{Fib}
+\DeclareMathOperator{\spec}{Spec}
+\DeclareMathOperator{\proj}{Proj}
+\DeclareMathOperator{\trdeg}{trdeg}
+\DeclareMathOperator{\car}{char}
+\DeclareMathOperator{\Frac}{Frac}
+\DeclareMathOperator{\reduced}{red}
+\DeclareMathOperator{\real}{Re}
+\DeclareMathOperator{\imag}{Im}
+\DeclareMathOperator{\vol}{vol}
+\DeclareMathOperator{\den}{den}
+\DeclareMathOperator{\rank}{rank}
+\DeclareMathOperator{\lcm}{lcm}
+\DeclareMathOperator{\rad}{rad}
+\DeclareMathOperator{\ord}{ord}
+\DeclareMathOperator{\Br}{Br}
+\DeclareMathOperator{\inv}{inv}
+\DeclareMathOperator{\Nm}{Nm}
+\DeclareMathOperator{\Tr}{Tr}
+\DeclareMathOperator{\an}{an}
+\DeclareMathOperator{\op}{op}
+\DeclareMathOperator{\sep}{sep}
+\DeclareMathOperator{\unr}{unr}
+\DeclareMathOperator{\et}{\acute et}
+\DeclareMathOperator{\ev}{ev}
+\DeclareMathOperator{\gl}{GL}
+\DeclareMathOperator{\SL}{SL}
+\DeclareMathOperator{\mat}{Mat}
+\DeclareMathOperator{\ab}{ab}
+\DeclareMathOperator{\tors}{tors}
+\DeclareMathOperator{\ed}{ed}
+
+\newcommand{\grp}{\textsc{Grp}}
+\newcommand{\set}{\textsc{Set}}
+\newcommand{\x}{\mathbf{x}}
+\newcommand{\naturalto}{\overset{.}{\to}}
+\newcommand{\qbar}{\overline{\mathbb{Q}}}
+\newcommand{\zbar}{\overline{\mathbb{Z}}}
+
+\newcommand{\pro}{\mathbb{P}}
+\newcommand{\aff}{\mathbb{A}}
+\newcommand{\quat}{\mathbb{H}}
+\newcommand{\rea}{\mathbb{R}}
+\newcommand{\kiu}{\mathbb{Q}}
+\newcommand{\F}{\mathbb{F}}
+\newcommand{\zee}{\mathbb{Z}}
+\newcommand{\ow}{\mathcal{O}}
+\newcommand{\mcx}{\mathcal{X}}
+\newcommand{\mcy}{\mathcal{Y}}
+\newcommand{\mcs}{\mathcal{S}}
+\newcommand{\mca}{\mathcal{A}}
+\newcommand{\mcb}{\mathcal{B}}
+\newcommand{\mcf}{\mathcal{F}}
+\newcommand{\mcg}{\mathcal{G}}
+\newcommand{\mct}{\mathcal{T}}
+\newcommand{\mcq}{\mathcal{Q}}
+\newcommand{\mcr}{\mathcal{R}}
+\newcommand{\adl}{\mathbf{A}}
+\newcommand{\mbk}{\mathbf{k}}
+\newcommand{\m}{\mathfrak{m}}
+\newcommand{\p}{\mathfrak{p}}
+
+\newcommand{\kbar}{\overline{K}}
+
+\newtheorem{lemma}{Lemma}
+\newtheorem{proposition}[lemma]{Proposition}
+\newtheorem{conjecture}[lemma]{Conjecture}
+\newtheorem{corollary}[lemma]{Corollary}
+\newtheorem{definition}[lemma]{Definition}
+\newtheorem{theorem}[lemma]{Theorem}
+\newtheorem{cond-thm}[lemma]{Conditional Theorem}
+\theoremstyle{definition}
+\newtheorem{remark}[lemma]{Remark}
+
+\author{Sebastiano Tronto}
+
+
+\begin{document}
+
+\begin{lemma}
+\label{lemma_zero}
+Let $H\leq \mathbb{Q}^\times$ be a finitely generated subgroup. Assume that $H$ does not contain minus a square of $\mathbb{Q}^\times$ or that $m=1$. Then we have
+\begin{align*}
+\left[\mathbb{Q}_{2^m}\left(\sqrt{H}\right):\mathbb{Q}_{2^m}\right]=\begin{cases}
+\#\overline H/2 & \text{ if }m\geq 3\text{ and }\exists b\in H\text{ with }b\equiv\pm2\pmod{\mathbb{Q}^{\times 2}},\\
+\#\overline H&\text{ otherwise}.
+\end{cases}
+\end{align*}
+where $\overline{H}$ is the image of $H\cdot \mathbb{Q}^{\times 2}$ in $\mathbb{Q}^\times/\mathbb{Q}^{\times 2}$.
+\begin{proof}
+Clearly we may assume that $H$ is generated by suqarefree integers $\{g_1,\dots, g_r\}$, where $r=\#\overline H$. In fact, we have that $\mathbb{Q}_{2^m}(\sqrt{H})=\mathbb{Q}_{2^m}(\sqrt{H'})$ for any $H'$ such that $(H\cdot \mathbb{Q}^{\times 2})/\mathbb{Q}^{\times 2}=(H'\cdot \mathbb{Q}^{\times 2})/\mathbb{Q}^{\times 2}$. Recall moreover that by {\color{red}Lemma 13} if there is $\pm2$ times a square in $H$ we can assume that, say, $g_1=\pm 2$.
+
+Assume first that $m\geq 2$, so that $-1\not\in H$ by assumption. In this case we can work over $\mathbb Q_4$ and use Theorem 18 of \cite{DebryPerucca}. We just need to compute the divisibility parameters over $\mathbb{Q}_4$:
+\begin{align*}
+d_1=\begin{cases}
+0&\text{ if }g_1\neq\pm2\\
+1&\text{ if }g_1=\pm2
+\end{cases},
+&&
+d_i=0
+\quad \text{ for $i=2,\dots, r$},\\
+h_1=\begin{cases}
+0&\text{ if } 0\leq g_1\neq2\\
+1&\text{ if } -2\neq g_1<0\\
+2&\text{ if } g_1=\pm 2
+\end{cases}, &&
+h_i=\begin{cases}
+0&\text{ if }g_i>0\\
+1&\text{ if }g_i<0
+\end{cases}
+\quad \text{ for $i=2,\dots, r$}.
+\end{align*}
+Thus, keeping the notation of the aformentioned Theorem, we get
+\begin{align*}
+n_1=\min(1,d_1)=\begin{cases}
+0&\text{ if }g_1\neq\pm2\\
+1&\text{ if }g_1=\pm2
+\end{cases},&& n_i=0\quad \text{ for $i=2,\dots, r$}.
+\end{align*}
+Thus we get
+\begin{align*}
+v_2\left[\mathbb{Q}_{2^m}(\sqrt{H}):\mathbb Q_{2^m}\right]&=\max(h_1+n_1,\dots, h_r+n_r,m)-m+r-\sum_{i=1}^rn_i=\\
+&=\begin{cases}
+\max(3,m)-m+r-\sum_{i=1}^rn_i&\text{ if }\pm2\in H\\
+r-\sum_{i=1}^rn_i&\text{ if }\pm2\not \in H
+\end{cases}\\
+&=\begin{cases}
+1+r-1&\text{ if }m=2\text{ and }\pm2\in H\\
+r-1&\text{ if }m\geq3\text{ and }\pm2\in H\\
+r&\text{ if }\pm2\not\in H
+\end{cases}
+\end{align*}
+which is what we want.
+
+Assume now that $m=1$. If $-1\not\in H$, we get the desired result directly from Lemma 19 of \cite{DebryPerucca} applied with $G=H$, using the computations that we did in the previous case. In case $-1\in H$, let $H'$ be any subgroup of $H$ such that $H=H'\oplus\langle-1\rangle$. Notice that we have $\#\overline {H'}=r-1$, so that Lemma 19 with $G=H'$ again gives our result, and the Proposition is proved.
+\end{proof}
+\end{lemma}
+
+Let $G\leq \mathbb{Q}^\times$ be a finitely generated torsion-free subgroup of rank $r$ and let $M$ and $n$ be integers such that $2^n\,|\,M$. We want to compute the degree
+\begin{align}
+\label{degree}
+\left[\mathbb{Q}_{2^n}\left(G^{1/2^n}\right)\cap \mathbb{Q}_M:\mathbb{Q}_{2^n}\right].
+\end{align}
+
+We will use the same notation as that of Remark 17 of Pietro's file.
+
+\section{Case $G\leq \mathbb{Q}_+^\times$}
+
+Assume that $G\leq \mathbb{Q}_+^\times$. In this case, by Remark 17, we have that
+\begin{align*}
+\mathbb{Q}_{2^n}\left(G^{1/2^n}\right)\cap \mathbb{Q}_M =\mathbb{Q}_{2^n}\left(\sqrt{H}\right).
+\end{align*}
+
+Let $\overline{H}$ be the image of $H$ in $\mathbb{Q^\times}/\mathbb{Q}^{\times 2}$. By Remark 17 and Lemma \ref{lemma_zero} above, the degree (\ref{degree}) is given by
+\begin{align*}
+\left[\mathbb{Q}_{2^n}\left(G^{1/2^n}\right)\cap \mathbb{Q}_M:\mathbb{Q}_{2^n}\right]=
+\begin{cases}
+\#\overline H/2 & \text{if }n\geq 3\text{ and }2\in H,\\
+\#\overline H&\text{ otherwise}.
+\end{cases}
+\end{align*}
+
+\section{General case}
+
+Let $\mathcal{B}$ be a basis for $G$ and let $\mathcal{B}_i\subseteq \mathcal{B}$ be the subset of basis elements of $2$-divisibility $i$. Call also $L=\max d_i$ the largest $2$-divisiblity parameter. In this way $\mathcal{B}_0,\dots,\mathcal{B}_L$ is a partition of $\mathcal{B}$.
+
+As explained in ({\color{red}ref}) we may assume that there is at most one negative basis element. Since we have dealt with the $G\subseteq \mathbb{Q}_+$ case in the previous section, we assume that such an element exists and that it has $2$-divisibility $d$. We call this element $g_0$.
+
+It is (or will be?) clear ({\color{red}but we should explain it}) that it actually does not matter if we have negative elements of divisibility $0$: that case is treated exactly as the case $G\subseteq \mathbb{Q}_+$. In conclusion, we assume that:
+\begin{align*}
+\mathcal{B}_1,\dots,\mathcal{B}_{d-1},\mathcal{B}_{d+1},\dots,\mathcal{B}_L\subseteq \mathbb{Q}_+,\\
+g_0<0 \text{ and }\mathcal{B}_d\setminus \{g_0\}\subseteq \mathbb{Q}_+,\\
+d\geq 1.
+\end{align*}
+
+We also let
+\begin{align*}
+N=\begin{cases}
+\max(3,L)&\text{if }d\neq L,\\
+\max(3,L+1)&\text{if }d=L.
+\end{cases}
+\end{align*}
+
+\subsection{General case, $n=1(\leq d)$}
+This case can be treated as follows: let $\mathcal{S}'=\mathcal{S}\cup \{-1\}$ and let $H'$ be constructed from $\mathcal{S}'$ in the exact same way as $H$ is constructed from $\mathcal{S}$. Then it's easy to check ({\color{red}it follows from the ``torsion case'' for $G$, it is for sure in some other file}) that $\mathbb{Q}_{2^n}\left(\sqrt{H'}\right)=\mathbb{Q}_{2^{w'}}\left(\sqrt{H}\right)$, where $w'=\min(v_2(M),n+1)$ (as in Remark 17). Then we can again use Lemma \ref{lemma_zero} and conclude that
+\begin{align*}
+\left[\mathbb{Q}_{2^n}\left(G^{1/2^n}\right)\cap \mathbb{Q}_M:\mathbb{Q}_{2^n}\right]=
+\#\overline{H'},
+\end{align*}
+where $\#\overline{H'}$ is the image of $H'$ in $\mathbb{Q}^\times/\mathbb{Q}^{\times 2}$.
+
+\subsection{General case, $n=2\leq d$}
+We consider two cases:
+\begin{itemize}
+\item If $v_2(M)=2$ we have $\left[\mathbb{Q}_{2^n}\left(G^{1/2^n}\right)\cap \mathbb{Q}_M:\mathbb{Q}_{2^n}\right]=\left[\mathbb{Q}_4\left(\sqrt{H}\right):\mathbb{Q}_4\right]=\#\overline{H}$ by Lemma \ref{lemma_zero}.
+\item If $v_2(M)\geq 3$ we have
+\begin{align*}
+\left[\mathbb{Q}_{2^n}\left(G^{1/2^n}\right)\cap \mathbb{Q}_M:\mathbb{Q}_{2^n}\right]&=\left[\mathbb{Q}_8\left(\sqrt{H}\right):\mathbb{Q}_4\right]=\left[\mathbb{Q}_8\left(\sqrt{H}\right):\mathbb{Q}_8\right]\cdot \left[\mathbb{Q}_8:\mathbb{Q}_4\right]=\\&=2\left[\mathbb{Q}_8\left(\sqrt{H}\right):\mathbb{Q}_8\right],
+\end{align*}
+which, by Lemma \ref{lemma_zero}, is given by $\#\overline{H}$ if $2 \in H$ and by $2\#\overline{H}$ otherwise.
+\end{itemize}
+
+\subsection{General case, $3\leq n\leq d$}
+We consider two cases:
+\begin{itemize}
+\item If $v_2(M)=3$, by lemma \ref{lemma_zero} we have
+\begin{align*}
+\left[\mathbb{Q}_{2^n}\left(G^{1/2^n}\right)\cap \mathbb{Q}_M:\mathbb{Q}_{2^n}\right]=\left[\mathbb{Q}_8\left(\sqrt{H}\right):\mathbb{Q}_8\right]=\begin{cases}
+\#\overline H/2 & \text{ if }\pm 2\in H,\\
+\#\overline H&\text{ otherwise}.
+\end{cases}
+\end{align*}
+\item If $v_2(M)\geq 4$ we have
+\begin{align*}
+\left[\mathbb{Q}_{2^n}\left(G^{1/2^n}\right)\cap \mathbb{Q}_M:\mathbb{Q}_{2^n}\right]&=\left[\mathbb{Q}_{16}\left(\sqrt{H}\right):\mathbb{Q}_8\right]=\left[\mathbb{Q}_{16}\left(\sqrt{H}\right):\mathbb{Q}_{16}\right]\cdot \left[\mathbb{Q}_{16}:\mathbb{Q}_8\right]=\\&=2\left[\mathbb{Q}_{16}\left(\sqrt{H}\right):\mathbb{Q}_{16}\right],
+\end{align*}
+which, by Lemma \ref{lemma_zero}, is given by $\#\overline{H}$ if $2 \in H$ and by $2\#\overline{H}$ otherwise.
+\end{itemize}
+
+\subsection{General case, $n\geq d+2$}
+By the corresponding case in Remark 17, we simply have
+\begin{align*}
+\left[\mathbb{Q}_{2^n}\left(G^{1/2^n}\right)\cap \mathbb{Q}_M:\mathbb{Q}_{2^n}\right]=\begin{cases}
+\#\overline {H'}/2 & \text{ if }\pm 2\in H,\\
+\#\overline {H'}&\text{ otherwise}.
+\end{cases}
+\end{align*}
+where $H'$ is constructed from $\mathcal{S}'=\mathcal{S}\cup\{B_0\}$ and $\overline{H'}$ is the image of $H'$ in $\mathbb{Q}^\times/\mathbb{Q}^{\times 2}$.
+
+\subsection{General case, $n=d+1$}
+We distinguish between some cases.
+\begin{itemize}
+\item Assume $n=2$ (thus $d=3$) and $v_2(g_0)=2$ (i.e. $2$ divides the square-free part of $B_0$, where $g_0=-B_0^{2^d}$). Then we write the square-free part of $B_0$ as $2s$ for some odd square-free $s\in\mathbb{Z}$. Then letting $\mathcal{S}':=\mathcal{S}\cup \{s\}$ and construct $H'$ from $\mathcal{S}'$ in the usual way. By Remark 17 we have
+\begin{align*}
+\left[\mathbb{Q}_{2^n}\left(G^{1/2^n}\right)\cap \mathbb{Q}_M:\mathbb{Q}_{2^n}\right]=\left[\mathbb{Q}_{2^n}\left(\sqrt{H'}\right):\mathbb{Q}_{2^n}\right]=\#\overline{H'}.
+\end{align*}
+But we can be more precise and say that
+\begin{align*}
+\#\overline{H'}=\begin{cases}
+2\#\overline{H}&\text{if }\sqrt{xs}\in\mathbb{Q}_M\text{ for some }x\in\mathcal{S}\text{ and }s\not\in \mathcal{S},\\
+\#\overline{H}&\text{otherwise}.
+\end{cases}
+\end{align*}
+%\item Assume $n=2$, $2^{n+1}\nmid M$ and either $v_2(g_0)>2$ or $g_0$ is odd. Then $\left[\mathbb{Q}_{2^n}\left(G^{1/2^n}\right)\cap \mathbb{Q}_M:\mathbb{Q}_{2^n}\right]=\#\overline H$.
+%\item Assume $n=2$, $2^{n+1}\,|\,M$ and either $v_2(g_0)>2$ or $g_0$ is odd. ({\color{red}TODO})
+\item Assume $n\geq 2$ and $2^{n+1}\nmid M$. Then
+\begin{align*}
+\left[\mathbb{Q}_{2^n}\left(G^{1/2^n}\right)\cap \mathbb{Q}_M:\mathbb{Q}_{2^n}\right]=\begin{cases}
+\#\overline H/2 & \text{ if }\pm 2\in H\text{ and }n\geq 3,\\
+\#\overline H&\text{ otherwise}.
+\end{cases}
+\end{align*}
+\item Assume $n\geq 2$ and $2^{n+1}\,|\,M$. Following the notation of Remark 17, we have
+\begin{align*}
+\mathbb{Q}_{2^n}\left(G^{1/2^n}\right)\cap \mathbb{Q}_M=\mathbb{Q}_{2^n}\left(\sqrt{\langle H, H'\rangle}\right)
+\end{align*}
+hence
+\begin{align*}
+\left[\mathbb{Q}_{2^n}\left(G^{1/2^n}\right)\cap \mathbb{Q}_M:\mathbb{Q}_{2^n}\right]&=\left[\mathbb{Q}_{2^n}\left(\sqrt{\langle H, H'\rangle}\right):\mathbb{Q}_{2^n}\right]=\\
+&=\left[\mathbb{Q}_{2^n}\left(\sqrt{\langle H, H'\rangle}\right):\mathbb{Q}_{2^n}\left(\sqrt{H}\right)\right]\cdot \left[\mathbb{Q}_{2^n}\left(\sqrt{H}\right):\mathbb{Q}_{2^n}\right].
+\end{align*}
+We claim that
+\begin{align*}
+\left[\mathbb{Q}_{2^n}\left(\sqrt{\langle H, H'\rangle}\right):\mathbb{Q}_{2^n}\left(\sqrt{H}\right)\right]=\begin{cases}
+1&\text{ if }H'=\emptyset\text{ or }H'=\{2\zeta_4\},\\
+2&\text{ otherwise}.
+\end{cases}
+\end{align*}
+To see this, notice that $\sqrt{2\zeta_4}=\zeta_8\sqrt{2}\in\mathbb{Q}_4\subseteq\mathbb{Q}_{2^n}\left(\sqrt{H}\right)$, so the first case is settled. Assume now that there is $x=\zeta_{2^n}b\in H'$ with $x\neq 2\zeta_4$. If $y=\zeta_{2^n}c$ is any other element of $H'$, then we have $\sqrt{x/y}=\sqrt{b/c}$. So if $x,y\in \mathbb{Q}_{2^n}\left(\sqrt{\langle H, H'\rangle}\right)$ we have also $\sqrt{b/c}\in \mathbb{Q}_{2^n}\left(\sqrt{\langle H, H'\rangle}\right)$, which by Kummer theory implies $bc\in H$. But then $y\in \mathbb{Q}_{2^n}\left(\sqrt{H}\right)\left(x\right)$. So we have $\mathbb{Q}_{2^n}\left(\sqrt{\langle H, H'\rangle}\right)=\mathbb{Q}_{2^n}\left(\sqrt{H}\right)(x)$, and the sought degree is $\left[\mathbb{Q}_{2^n}\left(\sqrt{H}\right)(x):\mathbb{Q}_{2^n}\left(\sqrt{H}\right)\right]$, which is in fact $2$ ({\color{red}Do we need to explain this better?}).
+
+We conclude that
+\begin{align*}
+\left[\mathbb{Q}_{2^n}\left(G^{1/2^n}\right)\cap \mathbb{Q}_M:\mathbb{Q}_{2^n}\right]=\begin{cases}
+\#\overline{H}/2&\text{ if } n\geq 3,\,\pm2 \in H\text{ and }H'\subseteq\{2\zeta_4\},\\
+\#\overline{H}&\text{ if }(n<3\text{ or }\pm2\not\in H)\text{ and }H'\subseteq \{2\zeta_4\},\\
+\#\overline{H}&\text{ if } n\geq 3,\,\pm2 \in H\text{ and }H'\not\subseteq\{2\zeta_4\},\\
+2\cdot \#\overline{H}&\text{ if }(n<3\text{ or }\pm2\not\in H)\text{ and }H'\not\subseteq \{2\zeta_4\}.
+\end{cases}
+\end{align*}
+%Let $s$ as in the first subcase of this section and let $\mathcal{C}'$ and $H'$ be as in the last case of Remark 17. We have
+%\begin{align*}
+%\left[\mathbb{Q}_{2^n}\left(G^{1/2^n}\right)\cap \mathbb{Q}_M:\mathbb{Q}_{2^n}\right]=&\left[\mathbb{Q}_{2^n}\left(\sqrt{\langle H,\zeta_{2^n}H'\rangle}\right):\mathbb{Q}_{2^n}\right]=\\
+%=&\left[\mathbb{Q}_{2^n}\left(\sqrt{\langle H,\zeta_{2^n}H'\rangle}\right):\mathbb{Q}_{2^n}\left(\sqrt{H}\right)\right]\cdot \left[\mathbb{Q}_{2^n}\left(\sqrt{H}\right):\mathbb{Q}_{2^n}\right].
+%\end{align*}
+%Notice that, by construction of $H$ and $H'$, the degree $\left[\mathbb{Q}_{2^n}\left(\sqrt{\langle H,\zeta_{2^n}H'\rangle}\right):\mathbb{Q}_{2^n}\left(\sqrt{H}\right)\right]$ is either $1$
+\end{itemize}
+
+\begin{thebibliography}{10} \expandafter\ifx\csname url\endcsname\relax \def\url#1{\texttt{#1}}\fi \expandafter\ifx\csname urlprefix\endcsname\relax\def\urlprefix{URL }\fi
+
+\bibitem{DebryPerucca}
+\textsc{Debry, C. - Perucca, A.}: \emph{Reductions of algebraic integers}, J. Number Theory, {\bf 167} (2016), 259--283.
+
+\bibitem{PeruccaSgobba}
+\textsc{Perucca, A. - Sgobba, P.}: \emph{Kummer Theory for Number Fields}, preprint.
+
+\end{thebibliography}
+
+\end{document}
+\ No newline at end of file
diff --git a/tex/preprint.pdf b/tex/preprint.pdf
Binary files differ.