Magma
Calabi-Yau complete intersections associated to good pairs of generalized nef partitions
Michela Artebani, Paola Comparin, Robin Guilbot
Calabi-Yau complete intersections associated to good pairs of generalized nef partitions
Michela Artebani, Paola Comparin, Robin Guilbot
The function Antpol computes the anticanonical polytope of a toric variety.
Antpol := function(Z)
F:=Fan(Z);
P:=&meet[HalfspaceToPolyhedron(Rays(F)[i],-1): i in [1..#Rays(F)]];
return P;
end function;
Observe that it allows non-lattice vertices, whereas the function RiemannRochPolytope(-CanonicalDivisor(Z));
always gives the convex hull of lattice points of the anticanonical polytope.
Given a toric variety Z and a list L of homogeneous elements in its Cox ring, the function IsQsCI verifies whether the variety defined by L in Z is a quasismooth complete intersection.
IsQsCI := function(Z,L)
R := CoordinateRing(Z);
n:=Rank(R);
A := Spec(R);
J := IrrelevantIdeal(Z);
barX := Scheme(A,[R!f: f in L]);
cond0:=Dimension(barX) eq n-#L;
S := SingularSubscheme(barX);
cond1:= J subset Ideal(ReducedSubscheme(S));
X:=Scheme(Z,L);
cond2:=Dimension(X)-Dimension(X meet SingularSubscheme(Z)) ge 2;
cond3:=IsIrreducible(X);
if cond0 and cond1 and cond2 and cond3 then return true;
else return false;
end if;
end function;
The function test checks if a pair of polynomials satisfies the necessary conditions of quasismoothness that can be found in Corollary 8.8, items (ii) and (iii) in the paper by Anthony R. Iano-Fletcher, Working with weighted complete intersections.
test:=function(p,r)
m:=Degree(p[1]);
n:=Degree(p[2]);
a:=[i:i in [1..r]| Derivative(p[1],i) ne 0 and Derivative(p[2],i) ne 0];
if #a le r-2 then return false;
else
a1:= [i: i in [1..r]| Derivative(p[1],i) eq 0];
a2:= [i: i in [1..r]| Derivative(p[2],i) eq 0];
if a1 ne [] then return x[a1[1]]^n in Monomials(p[2]);
else if a2 ne [] then
return x[a2[1]]^m in Monomials(p[1]);
else return true;
end if; end if; end if;
end function;
Given a toric variety Z and a partition L (sequence) of the set of primitive generators of the rays of its fan, the function GNP returns true, L and the anticanonical polytope of Z if L defines a generalized nef partition.
GNP:=function(Z,L)
R:=Rays(Fan(Z));
Delta:=Antpol(Z);
P:=[];
for i in [1..#L] do
P[i]:=&meet[HalfspaceToPolyhedron(n,-1): n in L[i]] meet
&meet[HalfspaceToPolyhedron(n,0): n in R| n notin L[i] ];
end for;
if Delta eq &+P then return true, L, P;
else return false;
end if;
end function;
The function AllGNP finds all generalized nef partitions of length s for the toric variety Z.
AllGNP:=function(Z, s)
R:=Rays(Fan(Z));
A:=SetToSequence(AllPartitions(Set(R)));
return [A[i]: i in [1..#A] | #A[i] eq s and GNP(Z, SetToSequence(A[i])) eq true];
end function;
The function IsIrreducibleGNP checks whether a given generalized nef partition Delta (a list of polytopes) is irreducible.
IsIrreducibleGNP:=function(Delta)
s:=#Delta;
return {true} eq {#InteriorPoints(&+[Delta[i]: i in E]) eq 0:
E in Subsets({1..s})| #E gt 0 and #E ne s };
end function;
The function IsGNP Checks whether a given collection Delta of polytopes defines a generalized nef partition. If this is the case it returns the corresponding partition of the vertices of the polar of &+Delta.
IsGNP := function(Delta)
s := #Delta;
M := Ambient(Delta[1]);
N:=Dual(M);
ZeroP := Polytope([Zero(M)]);
if false in {Delta[i] meet Delta[j] eq ZeroP: i,j in [1..s]|i ne j}
then return false;
end if;
L := [{}: i in [1..s]];
for F in Facets(Polar(&+Delta)) do
v := [v: v in Vertices(&+Delta)|{M!v*N!w: w in Vertices(F)} eq {-1}];
Cart :=[w: w in CartesianProduct([Vertices(Delta[i]): i in [1..s]])];
vdec :=[w: w in Cart|&+[w[j]: j in [1..s]] eq v[1]];
if false in {{M!vdec[1][i]*w: w in Vertices(F)} subset {0,-1}: i in [1..s]}
then return false;
end if;
L := [L[i] join {w: w in Vertices(F)|vdec[1][i]*w eq -1}: i in [1..s]] ;
end for;
return true, L;
end function;
Given a good pair of generalized nef partitions, the function Eqs finds the toric variety Z and the equations of the family of Calabi-Yau varieties as in Theorem 3.7 (where for simplicity all coefficients are put equal to one).
Eqs:=function(Delta1,Delta2)
s:=#Delta2;
M:=Ambient(Delta2[1]);
N:=Dual(M);
Z<[x]>:=ToricVariety(Rationals(), NormalFan(&+Delta2));
R :=Rays(Fan(Z));
Nabla:=Dual_partition(Delta2);
I:=[Exclude(Vertices(Nabla[j]), Zero(N)): j in [1..s]];
D:=[&+[Divisor(Z, k): k in [1..#R] | R[k] in I[i]] : i in [1..s]];
g:=[&+[LatticeElementToMonomial(D[j], p): p in Points(Delta1[j])]: j in [1..s]];
return Z,g;
end function;
Given a toric variety Z, a list f of polynomials in R(Z) and a partition L of the rays of the fan of Z defining a marked monomial for each f[i], the function Eqs_to_pol finds the list of the Newton polytopes of the corresponding dehomogenizations of the equations in f.
Eqs_to_pol:=function(Z, f, L)
s:=#f;
R:=Rays(Fan(Z));
Delta2:=[&meet[HalfspaceToPolyhedron(n,-1): n in L[i]] meet
&meet[HalfspaceToPolyhedron(n,0): n in R | n notin L[i]]: i in [1..s]];
M:=Ambient(Delta2[1]);
D:=[&+[Divisor(Z,i):i in [1..#R]|R[i] in L[j]]: j in [1..#L]];
mon:=[Monomials(f[j]): j in [1..s]];
Delta1:=[Polytope([p: p in Points(Delta2[j])|
LatticeElementToMonomial(D[j],p) in mon[j]]) : j in [1..s]];
if {Zero(M) in Points(Delta1[i]): i in [1..s]} eq {true} then
return Delta1;
else return false;
end if;
end function;
The function Goodpairs checks whether a pair of lists of polytopes Delta1,Delta2, with a given partition V of the vertices of the polar of &+Delta2, defines a good pair of generalized nef partitions.
Goodpairs:=function(Delta1,Delta2, V)
if #Delta1 eq #Delta2 then
c0:={true} eq {Points(Delta1[i]) subset Points(Delta2[i]): i in [1..#Delta1]};
Z:=ToricVariety(Rationals(),NormalFan(&+Delta2));
R:=Rays(Fan(Z));
L:=[[r: r in R|r in V[i]]: i in [1..#V]];
c1:=GNP(Z, L);
c2:=IsGNP(Delta1);
return c0 and c1 and c2;
else return 0;
end if;
end function;
The function IsCY check that the complete intersection defines a Calabi-Yau variety.
IsCY:=function(Z, f, gr)
c1:=IsQsCI(Z,f);
Delta:=eqs_to_pol(Z,f,gr);
c2:=Dimension(Z) eq Dimension(&+Delta);
c3:={Dimension(Delta[i]) gt 0: i in [1..#Delta]} eq {true};
c4:=#InteriorPoints(&+Delta) eq 1;
c5:=IsIrreducibleGNP(Z,Delta);
c6:= IsLinearlyEquivalent(&+[&+[Divisor(Z,g[i]): i in [1..#g]]: g in gr],
-CanonicalDivisor(Z));
c7:= Dimension(Z) ge #Delta+1;
return c1 and c2 and c3 and c4 and c5 and c6 and c7;
end function;
Given a generalized nef partition Pi (as a list of polytopes), the funciton Dual_partition finds its dual.
Dual_partition:=function(Pi)
Delta:=&+Pi;
M:=Ambient(Delta);
Nabla:=[];
for i in [1..#Pi] do
Nabla[i]:=&meet[HalfspaceToPolyhedron(m,-1): m in Vertices(Pi[i]) | m ne
Zero(M)]
meet &meet[HalfspaceToPolyhedron(m,0): m in &cat[Vertices(Pi[j]): j in [1..#Pi]|
j ne i] | m ne Zero(M)];
end for;
return Nabla;
end function;
-----------------
The following example shows that quasismooth is not preserved via duality, see Example 3.10:
X:=ProjectiveSpace(Rationals(),[1,1,1,2,3]);
R<[x]>:=CoordinateRing(X);
Delta2:=Antpol(X);
M:=Ambient(Delta2);
gr:=[{1,2,4},{3,5}];
r:=Rays(Fan(X));
I:=[[r[i]: i in gr[1]], [r[i]: i in gr[2]]];
D2:=[&meet[HalfspaceToPolyhedron(I[1][i],-1): i in [1..#I[1]]] meet
&meet[HalfspaceToPolyhedron(I[2][i],0): i in [1..#I[2]]], &meet[HalfspaceToPolyhedron(I[2][i],-1): i in [1..#I[2]]] meet
&meet[HalfspaceToPolyhedron(I[1][i],0): i in [1..#I[1]]]];
D1:=[Polytope(Points(D2[1])), Polytope(Points(D2[2]))];
IsGNP(D1);
a,V:=IsGNP(D2);
Goodpairs(D1, D2, V);
W,L:=Eqs(D1,D2);
IsQsCI(W,L);
N1:=Dual_partition(D1);
N2:=[Polytope([Zero(Dual(M))] cat SetToSequence(V[j])): j in [1..2]];
Y, g:=Eqs(N2,N1);
IsQsCI(Y, g);
-----------------
Example 3.19
Z<[x]>:=WeightedProjectiveSpace(Rationals(),[1,1,1,1,2]);
R:=Rays(Fan(Z));
f1:=x[2]^3+x[1]*x[2]*x[3]+x[4]^3+x[3]*x[5];
f2:=x[1]^3+x[2]*x[3]^2+x[4]*x[5]+x[1]*x[2]*x[4];
P:=[[1,2,3],[4,5]];
L:=[[R[i]: i in P[k]]: k in [1..#P]];
Delta:=Eqs_to_pol(Z,[f1,f2],L);
R1:=RiemannRochPolytope(&+[Divisor(Z,i): i in [1,2,3]]);
R2:=RiemannRochPolytope(&+[Divisor(Z,i): i in [4,5]]);
IsSimplex(Polytope(Points(R1) join Points(R2)));
Eqs(Dual_partition([R1,R2]),Dual_partition(Delta));
Pbis:=[[3,5],[1,2,4]];
Lbis:=[[R[i]: i in P[k]]: k in [1..#P]];
Deltabis:=Eqs_to_pol(Z,[f1,f2],Lbis);
R1bis:=RiemannRochPolytope(&+[Divisor(Z,i): i in [3,5]]);
R2bis:=RiemannRochPolytope(&+[Divisor(Z,i): i in [1,2,4]]);
IsSimplex(Polytope(Points(R1bis) join Points(R2bis)));
Eqs(Dual_partition([R1bis,R2bis]),Dual_partition(Deltabis));