def test__solve__empty_list(self): q = MARing.q() pol_lst = [] var_lst = [q[i] for i in [0, 1, 2]] sol_dct = MARing.solve(pol_lst, var_lst) print(sol_dct) assert 'r0' in str(sol_dct)
def test__solve(self): q = MARing.q() pol_lst = [q[0] + 2 * q[1] + 3 * q[2] - 4] var_lst = [q[i] for i in [0, 1, 2]] sol_dct = MARing.solve(pol_lst, var_lst) print(sol_dct) assert 'r0' in str(sol_dct) # We call a second time so that sage internally # introduces new variable names. We undo this # in MARing.solve(), since we work in a # polynomial ring where we want to minimize # the number of variables. # sol_dct = MARing.solve(pol_lst, var_lst) print(sol_dct) assert 'r0' in str(sol_dct)
def get_invariant_qf(c_lst_lst, exc_idx_lst=[]): ''' Computes quadratic forms in the ideal of the double Segre surface that are invariant under a given subgroup of Aut(P^1xP^1). Parameters ---------- c_lst_lst : list<list<MARing.FF>> A list of "c_lst"-lists. A c_lst is a list of length 8 with elements c0,...,c7 in QQ(k), where QQ(k) is a subfield of "MARing.FF". If we substitute k:=0 in the entries of "c_lst" then we should obtain the list: [1,0,0,1,1,0,0,1]. A c_lst represents a pair of two matrices: ( [ c0 c1 ] [ c4 c5 ] ) ( [ c2 c3 ] , [ c6 c7 ] ) with the property that c0*c3-c1*c2!=0 and c4*c7-c5*c6!=0. If the two matrices are not normalized to have determinant 1 then the method should be taken with care (it should be checked that the tangent vectors at the identity generate the correct Lie algebra). exc_idx_lst : list<int> A list of integers in [0,8]. Returns ------- A list of quadratic forms in the ideal of (a projection of) the double Segre surface S: ".get_ideal_lst( exc_idx_lst )" such that the quadratic forms are invariant under the automorphisms of S as defined by "c_lst_lst" and such that the quadratic forms generate the module of all invariant quadratic forms. Note that Aut(S)=Aut(P^1xP^1). ''' # for verbose output # mt = MATools() sage_set_verbose(-1) # initialize vectors for indeterminates of "MARing.R" # x = MARing.x() q = MARing.q() r = MARing.r() # obtain algebraic conditions on q0,...,q19 # so that the associated quadratic form is invariant # wrt. the automorphism defined by input "c_lst_lst" # iq_lst = [] for c_lst in c_lst_lst: iq_lst += DSegre.get_invariant_q_lst(c_lst, exc_idx_lst) iq_lst = list(MARing.R.ideal(iq_lst).groebner_basis()) # solve the ideal defined by "iq_lst" # sol_dct = MARing.solve(iq_lst, q) # substitute the solution in the quadratic form # associated to the symmetric matrix qmat. # qmat = DSegre.get_qmat(exc_idx_lst) qpol = list(sage_vector(x).row() * qmat * sage_vector(x).column())[0][0] sqpol = qpol.subs(sol_dct) mt.p('sqpol =', sqpol) mt.p('r =', r) assert sqpol.subs({ri: 0 for ri in r}) == 0 iqf_lst = [] # iqf=invariant quadratic form for i in range(len(r)): coef = sqpol.coefficient(r[i]) if coef != 0: iqf_lst += [coef] mt.p('iqf_lst =', iqf_lst) return iqf_lst
def get_invariant_qf(c_lst_lst): ''' Parameters ---------- c_lst_lst : list A list of "c_lst"-lists. A c_lst is a list of length 9 with elements c0,...,c8 in the subring in QQ(k) of "MARing.FF". The matrix [ c0 c1 c2 ] M = [ c3 c4 c5 ] [ c6 c7 c8 ] represents---for each value of k---an automorphism of P^2. If we set k:=0 then "c_lst" must correspond to the identity matrix: [ 1,0,0, 0,1,0, 0,0,1 ]. If M is not normalized to have determinant 1 then the method should be taken with care (see doc. ".get_c_lst_lst_dct"). Returns ------- list<MARing.R> A list of quadratic forms in the ideal of the Veronese surface V (see ".get_ideal_lst()"), such that the quadratic forms are invariant under the automorphisms of V as defined by "c_lst_lst" and such that the quadratic forms generate the module of all invariant quadratic forms. Note that Aut(V)=Aut(P^2). ''' # for verbose output # mt = MATools() # initialize vectors for indeterminates of "MARing.R" # x = MARing.x()[:6] q = MARing.q()[:6] r = MARing.r()[:6] # obtain algebraic conditions on q0,...,q19 # so that the associated quadratic form is invariant # wrt. the automorphism defined by input "c_lst_lst" # iq_lst = [] for c_lst in c_lst_lst: iq_lst += Veronese.get_invariant_q_lst(c_lst) iq_lst = list(MARing.R.ideal(iq_lst).groebner_basis()) # solve the ideal defined by "iq_lst" # sol_dct = MARing.solve(iq_lst, q) # substitute the solution in the quadratic form # associated to the symmetric matrix qmat. # qmat = Veronese.get_qmat() qpol = list(sage_vector(x).row() * qmat * sage_vector(x).column())[0][0] sqpol = qpol.subs(sol_dct) mt.p('sqpol =', sqpol) mt.p('r =', r) assert sqpol.subs({ri: 0 for ri in r}) == 0 iqf_lst = [] # iqf=invariant quadratic form for i in range(len(r)): coef = sqpol.coefficient(r[i]) if coef != 0: iqf_lst += [coef] mt.p('iqf_lst =', iqf_lst) return iqf_lst