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