Section 6
We first compute the set of elements of \(\Gamma^{\mathrm{even}}\) with a positive support of size \(\leq 4\). We do this by considering the equations defining \(\Gamma_{12}\).
[1]:
d = 12
def deg(i,j):
return i+j
Vd = [(i,j) for i in range(d+1) for j in range(d+1) if deg(i,j)<=d]
R = PolynomialRing(QQ,['x_'+str(i)+'_'+str(j) for i in range(d+1) for j in range(d+1) if deg(i,j)<=d])
xx = [[R('x_'+str(i)+'_'+str(j)) for j in range(d+1) if deg(i,j)<=d] for i in range(d+1)]
psi = [(-1)^k * sum([(-1)^j*binomial(i,k-j)*xx[i][j] for (i,j) in Vd]) for k in range(d+1)]
psibar = [(-1)^k * sum([(-1)^i*binomial(j,k-i)*xx[i][j] for (i,j) in Vd]) for k in range(d+1)]
varphi = [sum([binomial(d-deg(i,j),a-i)*xx[i][j] for (i,j) in Vd]) for a in range(d+1)]
eqns = psi[1:4]+psi[d-3:]+psibar[1:4]+psibar[d-3:]+varphi[1:4]+varphi[d-3:d]
def var2tup(var):
for (i,j) in Vd:
if var==xx[i][j]:
return (i,j)
def make_conds(eqn):
res = []
if eqn==0:
return res
elif eqn.coefficient(xx[0][0])==0:
pos = [var2tup(var) for var in R.gens() if eqn.coefficient(var)>0]
res.append(pos)
neg = [var2tup(var) for var in R.gens() if eqn.coefficient(var)<0]
res.append(neg)
elif eqn.coefficient(xx[0][0])>0:
pos = [var2tup(var) for var in R.gens() if (eqn.coefficient(var)>0 and var!=xx[0][0])]
res.append(pos)
else:
neg = [var2tup(var) for var in R.gens() if (eqn.coefficient(var)<0 and var!=xx[0][0])]
res.append(neg)
return res
conds = []
for eqn in eqns:
conds = conds + make_conds(eqn)
conds.sort()
def unique(lst):
res = []
for el in lst:
if el not in res:
res.append(el)
return res
conds = unique(conds)
def sublist(lst1, lst2):
intersection = [element for element in lst1 if element in lst2]
return lst1 == intersection
keep = [True for i in range(len(conds))]
for i in range(len(conds)):
for j in range(len(conds)):
if i!=j:
if sublist(conds[j], conds[i]):
keep[i] = False
conds = [conds[i] for i in range(len(conds)) if keep[i]]
xx = [['x'+str(i)+str(j) for j in range(4)] for i in range(4)]
yy = [['y'+str(i)+str(j) for j in range(4)] for i in range(4)]
zz = [['z'+str(i)+str(j) for j in range(4)] for i in range(4)]
bb = ['b'+str(j) for j in range(4)]
cc = ['c'+str(i) for i in range(4)]
dd = [['d'+str(bit)+str(k) for k in range(4)] for bit in [0,1]]
def contraction_cond(cond):
res = []
for i in range(4):
for j in range(4):
if (i,j) in cond:
res.append(xx[i][j])
for i in range(4):
for j in range(4):
if (i,d-3-i+j) in cond:
res.append(yy[i][j])
for i in range(4):
for j in range(4):
if (d-3-j+i,j) in cond:
res.append(zz[i][j])
for i in range(4):
if max([((i,j) in cond) for j in range(4,d-3-i)]):
res.append(cc[i])
for j in range(4):
if max([((i,j) in cond) for i in range(4,d-3-j)]):
res.append(bb[j])
for bit in [0,1]:
for k in range(4):
if max([((i,d-i-k) in cond) for i in range(4+bit,d-3-k) if i%2==bit]):
res.append(dd[bit][k])
return res
conds_even = []
for cond in conds:
conds_even.append(contraction_cond(cond))
conds_even.sort(key=len)
poss=[['x00']]
todo = [cond for cond in conds_even]
while len(todo)>0:
cond = todo[0]
todo.remove(cond)
poss_new = []
for supp in poss:
if len([True for pt in supp if pt in cond])>0:
poss_new.append(supp)
elif len(supp)<= 4:
for pt in cond:
poss_new.append(supp+[pt])
poss = poss_new
for pos in poss:
pos.sort()
poss_even = unique(poss)
len(poss_even)
[1]:
0
We next compute the set of elements of \(\Gamma^{\mathrm{odd}}\) with a positive support of size \(\leq 4\). We do this by considering the equations defining \(\Gamma_{13}\).
[2]:
d = 13
def deg(i,j):
return i+j
Vd = [(i,j) for i in range(d+1) for j in range(d+1) if deg(i,j)<=d]
R = PolynomialRing(QQ,['x_'+str(i)+'_'+str(j) for i in range(d+1) for j in range(d+1) if deg(i,j)<=d])
xx = [[R('x_'+str(i)+'_'+str(j)) for j in range(d+1) if deg(i,j)<=d] for i in range(d+1)]
psi = [(-1)^k * sum([(-1)^j*binomial(i,k-j)*xx[i][j] for (i,j) in Vd]) for k in range(d+1)]
psibar = [(-1)^k * sum([(-1)^i*binomial(j,k-i)*xx[i][j] for (i,j) in Vd]) for k in range(d+1)]
varphi = [sum([binomial(d-deg(i,j),a-i)*xx[i][j] for (i,j) in Vd]) for a in range(d+1)]
eqns = psi[1:4]+psi[d-3:]+psibar[1:4]+psibar[d-3:]+varphi[1:4]+varphi[d-3:d]
def var2tup(var):
for (i,j) in Vd:
if var==xx[i][j]:
return (i,j)
def make_conds(eqn):
res = []
if eqn==0:
return res
elif eqn.coefficient(xx[0][0])==0:
pos = [var2tup(var) for var in R.gens() if eqn.coefficient(var)>0]
res.append(pos)
neg = [var2tup(var) for var in R.gens() if eqn.coefficient(var)<0]
res.append(neg)
elif eqn.coefficient(xx[0][0])>0:
pos = [var2tup(var) for var in R.gens() if (eqn.coefficient(var)>0 and var!=xx[0][0])]
res.append(pos)
else:
neg = [var2tup(var) for var in R.gens() if (eqn.coefficient(var)<0 and var!=xx[0][0])]
res.append(neg)
return res
conds = []
for eqn in eqns:
conds = conds + make_conds(eqn)
conds.sort()
def unique(lst):
res = []
for el in lst:
if el not in res:
res.append(el)
return res
conds = unique(conds)
def sublist(lst1, lst2):
intersection = [element for element in lst1 if element in lst2]
return lst1 == intersection
keep = [True for i in range(len(conds))]
for i in range(len(conds)):
for j in range(len(conds)):
if i!=j:
if sublist(conds[j], conds[i]):
keep[i] = False
conds = [conds[i] for i in range(len(conds)) if keep[i]]
xx = [['x'+str(i)+str(j) for j in range(4)] for i in range(4)]
yy = [['y'+str(i)+str(j) for j in range(4)] for i in range(4)]
zz = [['z'+str(i)+str(j) for j in range(4)] for i in range(4)]
bb = ['b'+str(j) for j in range(4)]
cc = ['c'+str(i) for i in range(4)]
dd = [['d'+str(bit)+str(k) for k in range(4)] for bit in [0,1]]
def contraction_cond(cond):
res = []
for i in range(4):
for j in range(4):
if (i,j) in cond:
res.append(xx[i][j])
for i in range(4):
for j in range(4):
if (i,d-3-i+j) in cond:
res.append(yy[i][j])
for i in range(4):
for j in range(4):
if (d-3-j+i,j) in cond:
res.append(zz[i][j])
for i in range(4):
if max([((i,j) in cond) for j in range(4,d-3-i)]):
res.append(cc[i])
for j in range(4):
if max([((i,j) in cond) for i in range(4,d-3-j)]):
res.append(bb[j])
for bit in [0,1]:
for k in range(4):
if max([((i,d-i-k) in cond) for i in range(4+bit,d-3-k) if i%2==bit]):
res.append(dd[bit][k])
return res
conds_odd = []
for cond in conds:
conds_odd.append(contraction_cond(cond))
conds_odd.sort(key=len)
poss=[['x00']]
todo = [cond for cond in conds_odd]
while len(todo)>0:
cond = todo[0]
todo.remove(cond)
poss_new = []
for supp in poss:
if len([True for pt in supp if pt in cond])>0:
poss_new.append(supp)
elif len(supp)<= 4:
for pt in cond:
poss_new.append(supp+[pt])
poss = poss_new
for pos in poss:
pos.sort()
poss_odd = unique(poss)
len(poss_odd)
[2]:
0