newPackage( "MatFac15", Version => "0.8", Date => "November 27, 2013", Authors => {{Name => "Frank-Olaf Schreyer", Email => "schreyer@math.uni-sb.de", HomePage => "http://www.math.uni-sb.de/ag/schreyer/"} }, Headline => "Matrix factorizations and curves of genus 15", DebuggingMode => true ) needsPackage("BoijSoederberg") export { -- "Ext0", "Hom0", "homomorphism0, "randomKRationalPoint", "matrixFactorizationFromModule", "curveFromMatrixFactorization", "isSmoothCurve", "tangentKernelDimension", "MCMapproximation", "constructEx1", "constructEx2", "constructEx3", "constructEx4", "constructEx5", "constructEx6", "randomCurveOfGenus15", "verifyAllAssertionsOfThePaper", "BSCandidates", "allCandidates", "certify", "attempts", "printTimings" } Ext0=method(Options=>{printTimings=>false}) Ext0(Module,Module) := opt->(M,N) -> ( --compute the degree 0 part of Ext^1(M,N) assert(ring M===ring N); m:=presentation M; n:=presentation N; n2:=syz n; m2:= syz m; -- commutative diagramms cD1:=Hom(n2,target m)|Hom(source n2,m); --<< (betti cD1, betti Hom(source n2, target m), betti Hom(target n2, target m), betti Hom(source n2, source m)) <0); << betti hom0 <0); -- betti Hom(target n2,source m),betti Hom(target n2,m), betti Hom(n2,source m) homotopies0:= Hom(n,target m)|| 0*Hom(n2,source m); --betti homotopies0 homotopies1:= Hom(target n2,m)||(-1)*Hom(n2,source m);--betti homotopies1 homotopies2:= 0*Hom(target n2,m)||Hom(source n2, m2);--betti homotopies2 homotopies := homotopies0|homotopies1|homotopies2;-- betti homotopies << cD1*homotopies <1)) <1)) <1); b=gens gb(hom0,DegreeLimit=>1)); ext10:=prune(image b/image a); if opt.printTimings then time truncate(0,ext10) else truncate(0,ext10) ) TEST /// kk=ZZ/10007 R=kk[y_0..y_2] m=transpose random(R^{1,2},R^2) E=annihilator coker m RE=R/E M= coker m**RE ring M N=M F=sheaf M time Ext^1(F,F) time betti Ext^1(M,M) time betti truncate(0, Ext^1(M,N)) time betti( E=Ext0(M,N)) kk=ZZ/10007 S=kk[x_0..x_4] time N=constructEx1(S); (M0,M1)=matrixFactorizationFromModule(N); betti M0, betti M1 M = coker M0; N1= N**ring M; N=prune N1; M'= coker M1; time betti Hom0(M',N) time betti Hom0(target M0,N) time betti Hom0(M,N) time betti Hom(M,N) time betti Hom(target M0,N) time betti Hom(M',N) time betti Ext^1(M,N) time betti Ext0(M,N) time N=constructEx2(S); (M0,M1)=matrixFactorizationFromModule(N); M = coker M0; N1= N**ring M; N=prune N1; time betti Ext^1(M,N) time N=constructEx3(S); (M0,M1)=matrixFactorizationFromModule(N); M = coker M0; N1= N**ring M; N=prune N1; time betti Ext^1(M,N) time N=constructEx4(S); (M0,M1)=matrixFactorizationFromModule(N); M = coker M0; N1= N**ring M; N=prune N1; time betti Ext^1(M,N) /// Hom0=method() Hom0(Module,Module) := (M,N) -> ( --compute the degree 0 part of Hom(M,N) assert(ring M===ring N); m:=presentation M; n:=presentation N; -- commutative diagramms cD1:=Hom(m,target n)|Hom(source m,n); hom0:=syz(cD1,DegreeLimit=>0); r:= rank Hom(target m,target n); -- homotopies betti Hom(m,target n); homotopies:=transpose (transpose Hom(target m, n)| (-1)*transpose Hom( m, source n)); hom0 = mingens image transpose (transpose hom0)_{0..r-1}; homotopies =mingens image transpose (transpose homotopies)_{0..r-1}; -- a truncate(0 is needed for the general case -- hom0 = mingens image(hom0% homotopies); hom0 = mingens image( gens truncate(0, image hom0) % gens gb(homotopies,DegreeLimit=>0)); hom0) homomorphism0=method() homomorphism0(Module,Module,Matrix) := (M,N,phi) -> ( m:=presentation M; n:=presentation N; rm:=rank target m;rn:=rank target n; psi:=map(target n,target m,matrix apply(rn,i-> apply(rm ,j-> phi_(i+rn*j,0)))); --isHomogeneous psi inducedMap(N,M,psi,Verify=>true) ) randomKRationalPoint=method() randomKRationalPoint(Ideal):=I->( R:=ring I; if char R == 0 then error "expected a finite ground field"; if not class R === PolynomialRing then error "expected an ideal in a polynomial ring"; if not isHomogeneous I then error "expected a homogenous ideal"; n:=dim I; if n<=1 then error "expected a positive dimensional scheme"; c:=codim I;Rs:=R;Re:=R;f:=I; if not c==1 then ( -- projection onto a hypersurface parametersystem:=ideal apply(n,i->R_(i+c)); if not dim(I+parametersystem)== 0 then ( print "make coordinate change" return null); kk:=coefficientRing R; Re=kk[apply(dim R,i->R_i),MonomialOrder => Eliminate (c-1)]; rs:=(entries selectInSubring(1,vars Re))_0; Rs=kk[rs]; f=ideal sub(selectInSubring(1, gens gb sub(I,Re)),Rs); if not degree I == degree f then return print "make coordinate change"); H:=0;pts:=0;pts1:=0;trial:=1;pt:=0;ok:=false; while ( H=ideal random(Rs^1,Rs^{dim Rs-2:-1}); pts=decompose (f+H); pts1=select(pts,pt-> degree pt==1 and dim pt ==1); ok=( #pts1>0); if ok then (pt=saturate(sub(pts1_0,R)+I);ok==(degree pt==1 and dim pt==0)); not ok) do (trial=trial+1); pt) TEST /// p=10007,kk=ZZ/p R=kk[x_0..x_2] I=ideal(random(4,R)); time randomKRationalPoint(I) R=kk[x_0..x_4] I=minors(3,random(R^5,R^{3:-1})); codim I time randomKRationalPoint(I) /// ------------------------------------------------------ -- the main functions specific to this package --- ------------------------------------------------------ matrixFactorizationFromModule=method() matrixFactorizationFromModule(Module) := N -> ( S := ring N; gIE := gens annihilator N; X := ideal(gIE * random(source gIE,S^{ -3})); SX := S/X; fNX:= res (N**SX); return (fNX.dd_5**SX^{6},fNX.dd_6**SX^{6}) ) TEST /// kk=ZZ/10007 S=kk[x_0..x_4] time N=constructEx1(S); time (M0,M1) = matrixFactorizationFromModule(N); betti M0, betti M1 IX =ideal ring M0 S===ring IX /// curveFromMatrixFactorization=method() curveFromMatrixFactorization(Matrix,Matrix) := (M0,M1) -> ( SX:= ring M0; bSX:=SX.baseRings; S:=last bSX; X:=ideal SX; m0:=M0;m1:=M1; --<< (betti m0, betti m1) < d_0); d0:=min degs; --<< (betti m0,betti m1) <d==d0)==15 then ( (m0,m1) = (transpose m1,transpose m0); degs=apply(degrees source m1, d-> d_0); d0=min degs); --<< (betti m0, betti m1) << endl; d0s:=select(rank source m1,i-> degs_i==d0); sm1:=syz(transpose m1_d0s,DegreeLimit=>-d0+1); sms:=syz transpose (sm1|transpose m0); C:=ideal mingens ((sub(ideal((transpose syz transpose sms_{0..2})*sms_{3}),S)+X)); --<<(dim C,degree C, genus C) << endl; return C) TEST /// kk=ZZ/10007 S=kk[x_0..x_4] time N=constructEx3(S); time (M0,M1) = matrixFactorizationFromModule(N); betti M0, betti M1 time C=curveFromMatrixFactorization(M0,M1); betti C assert((dim C, degree C, genus C)==(2,16,15)) /// isSmoothCurve=method(TypicalValue=>Boolean) isSmoothCurve(Ideal) := C -> ( S:= ring C; if not (dim C == 2) then error "expected the ideal of a curve"; -- if embedded points then n:=dim S; if n<=4 then ( -- check for no associated points if not dim Ext^(codim C)(C,S) <=0 then (use S;<<"there are associated points" <4 then ( projectionCenter:=ideal(apply(4,i->S_i)); if not dim(projectionCenter+C) ==0 then (use S; <<"bad projection center" <S_(i+4)))); if not degree C1 == degree C then (use S; <<"bad projection center" < ( SX := ring M0; NX := prune (N**SX); MX := coker M0; hom0:=Hom0(MX,NX); --betti hom0 --hom0 assert( rank source hom0 ==1 ); psi:=homomorphism0(MX,NX,hom0_{0}); P0:=ker psi; -- now we prune P:= coker syz ((transpose syz transpose presentation MX)*mingens P0); homPN:=Hom0(P,NX); rank source homPN ) TEST /// kk=ZZ/10007 S=kk[x_0..x_4] time N=constructEx2(S); time (M0,M1) = matrixFactorizationFromModule(N); time cd=tangentKernelDimension(N,M0) assert(cd==3) /// MCMapproximation=method() MCMapproximation(Module) := N -> ( SX:=ring N; X:=ideal SX; if not (numgens X == 1) then error "expected a module over a hypersurface ring"; d:=degree X; n:=dim SX; if n % 2 == 0 then n=n+1; fN:= res(N,LengthLimit=> n); dualfN:=(dual fN)[-n]; g:=res(coker dualfN.dd_1,LengthLimit=>n); gdf:=extend(g,dualfN,map(g_0,dualfN_0,id_(g_0))); M:=coker transpose g.dd_n; phi:=map(N,M,transpose gdf_n); Q:=coker phi; -- add code to cover the case when a free summnad is needed if Q==0 then return phi else (print "needs free summand"; return phi)) TEST /// kk=ZZ/10007 S=kk[x_0..x_4] N=constructEx1(S); E=annihilator N; X=ideal(gens E*random(source gens E,S^{ -3})); SX=S/X ideal SX N=N**SX phi=MCMapproximation N P=ker phi; betti res P /// ---------------------------------------------------------------------- -- constructions of Examples from Thm 4.1 , 4.3, Prop 4.4, Thm 4.6, -- -- from Thm 4.7 and 4.8, Thm 4.9 and 4.10, and from Remark 5.4 -- ---------------------------------------------------------------------- constructEx1=method() -- 0 1 2 3 -- total: 6 13 12 5 -- 0: 6 13 3 . -- 1: . . 9 5 constructEx1(PolynomialRing) := S -> ( -- construct a module N as in Thm 3.6 kk:=coefficientRing S; y:=symbol y; R:=kk[y_0..y_2]; -- construction of a plane 5 nodal septic E with 10 additional points pts:=apply(15,i->ideal random(R^1,R^{2:-1})); betti(Hs:=gens truncate(3,intersect(apply(5,i->pts_i)))); -- HS is the linear system of cubics through 5 points betti(Es:=gens truncate(7,intersect(intersect(apply(5,i->(pts_i)^2)),intersect apply(10,i->pts_(5+i))))); betti(E:=ideal(Es*random(source Es,R^{ -7}))); --the plane septic R1:=R/E; --re-embeds E in to P^4 = Proj S phi:=map(R1,S,sub(Hs,R1)); betti(IE:=ideal mingens ker phi); -- re-embed the 10 points p10:=apply(10,i->(R1=R/pts_(5+i);ideal mingens ker map(R1,S,sub(Hs,R1)))); --6=degL+1-10 => degL=15 -- 15=11+7-3 betti(p7:=intersect apply(7,i->p10_i)); betti(p3:=intersect apply(3,i->p10_(i+7))); H:=gens p3*random(source gens p3,S^{ -1}); D8:=ideal H+IE:p3; D15:=intersect(D8,p7); G:=gens D15*random(source gens D15,S^{ -3}); residualD15:=(ideal G+IE:D15); betti(L1:=mingens ideal (gens residualD15%IE)); SE:=S/IE; betti(N:=coker sub(syz(L1**SE),S)**S^{ 3}); return N) TEST /// -- Example from Thm 4.1 kk=ZZ/10007 S=kk[x_0..x_4] time N=constructEx1(S); beta=new BettiTally from {(0,{0},0) => 6, (1,{1},1) => 13, (2,{2},2) => 3, (2,{3},3) => 9, (3,{4},4) => 5}; beta assert(betti(fN= res N) == beta) (M0,M1)=matrixFactorizationFromModule(N); time IC=curveFromMatrixFactorization(transpose M1,transpose M0); assert((dim IC,degree IC,genus IC)==(2,16,15)) time tangentKernelDimension(N,M0)==3 /// constructEx2=method() -- 0 1 2 3 4 0 1 2 3 -- (total: 4 10 13 8 1, 11, 10, total: 1 4 6 3) -- 0: 1 . . . . 0: 1 . . . -- 1: 3 10 1 . . 1: . 2 . . -- 2: . . 12 8 1 2: . 1 1 . -- 3: . 1 5 3 constructEx2(PolynomialRing) := S -> ( -- construct a module N as in Thm 4.3 kk:=coefficientRing S; y:=symbol y; R:=kk[y_0..y_2]; -- construction of a plane 5 nodal septic E with 7 additional points pts:=apply(5+7,i->ideal random(R^1,R^{2:-1})); betti(Hs:=gens truncate(3,intersect(apply(5,i->pts_i)))); betti(Es:=gens truncate(7,intersect(intersect(apply(5,i->(pts_i)^2)),intersect apply(7,i->pts_(5+i))))); betti(E:=ideal(Es*random(source Es,R^{ -7}))); RE:=R/E; -- we do not need to re-embeds E in to P^4 = Proj S --phi:=map(RE,S,sub(Hs,RE)); --betti(IE:=ideal mingens ker phi); -- Construction of L: -- we start with the 3 section generating K_E(-(q_1+...+q_7) betti (L0:=gens intersect apply(5+7,i->pts_i)); -- next we compute the linear and quadratic syzygies in terms of Hs betti (sL1:=syz(sub(L0**Hs,RE),DegreeLimit=>7)); betti (sL2:=syz(sub(L0**symmetricPower(2,Hs),RE),DegreeLimit=>10)); -- now we transport these syzygies to S RS:=R**S; betti (L2:=map(S^3,S^{21:-2},sub(contract(sub(transpose vars R,RS),(sub(vars R,RS)**symmetricPower(2,sub(vars S,RS)))*sub(sL2,RS)),S))); betti (L1:=map(S^3,S^{2:-1},sub(contract(sub(transpose vars R,RS),(sub(vars R,RS)**sub(vars S,RS))*sub(sL1,RS)),S))); -- L3 is the bundle K_E-L L3:=coker(L1|L2); betaKminusL:=new BettiTally from {(0,{0},0) => 3, (1,{1},1) => 2, (1,{2},2) => 11, (2,{3},3) => 15, (3,{4},4) => 4, (3,{5},5) => 1}; fL3:=res L3; assert( betti fL3 == betaKminusL); betti(L4:= transpose fL3.dd_3**S^{ -5}); -- presentation matrix of L -- now remove a section of L(1) betti(L5:=random(S^{ -1},target L4)*L4); -- betti(L6:=L4*syz(L5,(DegreeLimit =>2))); betti(N:=coker transpose syz transpose syz L6); return N) TEST /// -- Example from Thm 4.3 kk=ZZ/10007 S=kk[x_0..x_4] time N=constructEx2(S); time constructEx1(S); fN=res N beta=new BettiTally from {(0,{0},0) => 1, (0,{1},1) => 3, (1,{2},2) => 10, (2,{3},3) => 1, (2,{4},4) => 12,(3,{5},5) => 8, (4,{6},6) => 1}; assert(betti fN == beta) (M0,M1)=matrixFactorizationFromModule(N); time IC=curveFromMatrixFactorization(M0,M1); assert((dim IC,degree IC,genus IC)==(2,16,15)) time tangentKernelDimension(N,M0)==6 betti res N, degree N, genus annihilator N, betti res annihilator N /// constructEx3=method() constructEx3(PolynomialRing) := S -> ( -- construct a module N as in Prop 4.4 kk:=coefficientRing S; y:=symbol y; R:=kk[y_0..y_2]; -- construction of a plane 5 nodal septic E with 10 additional points pts:=apply(15,i->ideal random(R^1,R^{2:-1})); betti(Hs:=gens truncate(3,intersect(apply(5,i->pts_i)))); betti(Es:=gens truncate(7,intersect(intersect(apply(5,i->(pts_i)^2)),intersect apply(10,i->pts_(5+i))))); betti(E:=ideal(Es*random(source Es,R^{ -7}))); R1:=R/E; --re-embeds E and the 10 points into P^4 = Proj S phi:=map(R1,S,sub(Hs,R1)); betti(IE:=ideal mingens ker phi); p10:=apply(10,i->(R1=R/pts_(5+i);ideal mingens ker map(R1,S,sub(Hs,R1)))); -- Construction of L: betti(p8:=intersect apply(8,i->p10_i)); betti(p2:=intersect apply(2,i->p10_(i+8))); H:=gens p2*random(source gens p2,S^{ -1}); D9:=ideal H+IE:p2; D17:=intersect(D9,p8); G:=gens D17*random(source gens D17,S^{ -3}); residualD17:=(ideal G+IE:D17); betti(L0:=mingens ideal (gens residualD17%IE)); SE:=S/IE; betti(L:=coker sub(syz(L0**SE),S)**S^{ 3}); betaL := new BettiTally from {(0,{0},0) => 8, (1,{1},1) => 21, (2,{2},2) => 15, (2,{3},3) => 1, (3,{4},4) => 3}; assert (betti(fL := res L) == betaL); -- L has the desired betti table line:=ideal fL.dd_3^{15}; betti(RaoT:=ideal mingens(line+(ideal vars S)^2)); betti(fRaoT := res RaoT); betti(Rao:=coker transpose fRaoT.dd_5**S^{ -6}); homLRao:=Hom0(L,Rao); assert(rank source homLRao==1); psi:= homomorphism0(L,Rao,homLRao); N := prune ker psi; return N) TEST /// -- Example from Prop 4.4 kk=ZZ/10007 S=kk[x_0..x_4] time N=constructEx3(S); fN=res N betti fN betaN=new BettiTally from {(0,{0},0) => 6, (1,{1},1) => 12, (2,{3},3) => 11, (3,{4},4) => 3,(3,{5},5) => 3, (4,{6},6) => 1}; assert(betti fN == betaN) (M0,M1)=matrixFactorizationFromModule(N); betti M0, betti M1 time IC=curveFromMatrixFactorization(M0,M1); assert((dim IC,degree IC,genus IC)==(2,16,15)) time tangentKernelDimension(N,M0)==3 /// constructEx4=method() -- 0 1 2 3 4 -- total: 3 9 14 9 1 -- 0: 2 . . . . -- 1: 1 9 . . . -- 2: . . 14 9 1 -- dE=14, gE=11 constructEx4(PolynomialRing) := S -> ( kk:=coefficientRing S; y:= symbol y; R:=kk[y_0..y_3]; -- the Chang-Ran construction of a degree 12 and genus 11 curve in P^3: HRao:=coker random(R^3,R^{6:-1,2:-2}); betti( fRao:=res HRao); betti (syzE:=fRao.dd_2*random(fRao_2,R^{6:-3})); E:=ideal syz syzE; assert((dim E, degree E,genus E) == (2,12,11)); -- now the non-unirational step of selecting 6 points on E pts:=apply(6,i->randomKRationalPoint E); D6:=intersect pts; omegaE:=Ext^1(E,R^{ -4}); betti (K1:=presentation omegaE|random(target presentation omegaE,R^1)); K:=annihilator coker K1; -- a canonical divisor on E assert((dim K, degree K)==(1,20)); H5:=ideal(gens K*random(source gens K,R^{ -5})); H := mingens ideal (gens intersect(H5+E:K,D6)%E) ; assert (rank source H ==5 ); -- re-embed E into P^4 RE:=R/E; phi:=map(RE,S,sub(H,RE)); IE:=ker phi; assert((dim IE, degree IE, genus IE)==(2,14,11)); betti (L1:=presentation omegaE|random(target presentation omegaE,R^{1})); D:=saturate annihilator coker L1; RD:=R/D; D8:=ideal mingens ker map(RD,S,sub(H,RD)); assert((dim D8,degree D8) == (1,8)); H5':=ideal(gens D8*random(source gens D8,S^{ -5})); residual:=(H5'+IE):D8; assert(degree residual == 5*14-8); betti (A:=saturate residual); betti(A1:=syz gens A); betti(N1:=(transpose(transpose A1_{24..37})_{12..15})**S^{5}); betti(N2:=N1*syz(random(S^{ -1},target N1)*N1,DegreeLimit=>2)); N:= coker transpose syz transpose syz N2; return N) TEST /// -- Example from Thm 4.6 kk=ZZ/10007 S=kk[x_0..x_4] time N=constructEx4(S); betti res N beta= new BettiTally from {(0,{0},0) => 2, (0,{1},1) => 1, (1,{2},2) => 9, (2,{4},4) => 14, (3,{5},5) => 9, (4,{6},6) => 1} assert(betti(fN= res N) == beta) (M0,M1)=matrixFactorizationFromModule(N); time IC=curveFromMatrixFactorization(M0,M1); assert((dim IC,degree IC,genus IC)==(2,16,15)) time tangentKernelDimension(N,M0)==0 M=coker M0; SX=ring M NX=N**SX time betti Ext^1(NX,NX) time betti Ext^1(M,NX) time Ext^1(sheaf M, sheaf NX) /// constructEx5=method() -- 0 1 2 3 -- total: 6 13 12 5 -- 3: 6 11 . . -- 4: . 2 12 4 -- 5: . . . 1 constructEx5(PolynomialRing) := S -> ( -- goal: -- 0 1 2 3 -- (total: 6 13 12 5, 14, 15) -- 3: 6 11 . . -- 4: . 2 12 4 -- 5: . . . 1 -- 41-dimensional unirational pt:=ideal(random(S^1,S^{4:-1})); D:=minors(2,matrix(apply(2,i->apply(4,j->S_(i+j))))); D1:=intersect(D,pt); Q:=ideal(gens D1*random(source gens D1,S^{ -2})); pts8:=intersect apply(8,i-> (L:=gens pt*random(source gens pt,S^{3:-1}); ideal L+Q:pt)); pts9:=intersect(pts8,pt); G:=intersect(D1,pts8); ci:=ideal(gens G*random(source gens G,S^{ -2,2:-3})); E:=ci:D; --KE=prune(truncate(3,saturate(D+E))/E) is dualizing sheaf on E L1:=intersect(truncate(3,saturate(D+E)),pts9); N:=prune(L1/E); return N) randomDegree4Curve=method() randomDegree4Curve(PolynomialRing,List) := (S,L) -> ( if L=={(4,1)} then return ideal random(S^1, S^{2:-2,-1}); if L=={(4,0)} then return minors(2,matrix apply(2,i->apply(4,j->S_(i+j) ))); if L=={(3,1),(1,0)} then return intersect(ideal random(S^1, S^{2:-1,-3}),ideal random(S^1,S^{3:-1})); if L=={(3,0),(1,0)} then return intersect(ideal S_4+minors(2,matrix apply(2,i->apply(3,j->S_(i+j)))),ideal random(S^1,S^{3:-1})); if L=={(2,0),(2,0)} then return intersect(ideal random(S^1, S^{2:-1,-2}),ideal random(S^1, S^{2:-1,-2})); if L=={(2,0),(1,0),(1,0)} then return intersect(ideal random(S^1, S^{2:-1,-2}), ideal random(S^1, S^{3:-1}), ideal random(S^1, S^{3:-1})); if L=={(1,0),(1,0),(1,0),(1,0)} then return intersect apply(4,i->ideal random(S^1,S^{3:-1})); return null) TEST /// kk=ZZ/10007 S=kk[x_0..x_4] cases={ {(4,1)}, {(4,0)}, {(3,1),(1,0)}, {(3,0),(1,0)}, {(2,0),(2,0)}, {(2,0),(1,0),(1,0)}, {(1,0),(1,0),(1,0),(1,0)} } curves=apply(cases, c-> randomDegree4Curve(S,c)); dgRs=apply(curves,c->(degree c, genus c)) dgEs=apply(curves,c->(ci=ideal (gens c*random(source gens c,S^{2:-3,-2}));E=ci:c;(degree E,genus E))) apply(7,i->(dgEs_i_1,dgRs_i_1)) /// constructEx5(PolynomialRing,ZZ):= (S,gE) -> ( if not member(gE,{15,14}) then error "expected gE=14 or 15, no method implemented"; if gE==15 then return constructEx5(S,{(4,0)}); --now the case gE=14 construction --Goal: -- 0 1 2 3 -- total: 5 12 13 6 -- 0: 1 . . . -- 1: 4 12 2 . -- 2: . . 11 6 -- (degree E, genus E)==(14,14) -- betti res E -- 0 1 2 3 -- total: 1 6 9 4 -- 0: 1 . . . -- 1: . . . . -- 2: . 6 3 . -- 3: . . 6 4 -- model in P^3, non-unirational dominant construction kk:= coefficientRing S; y:=symbol y; R:=kk[y_0..y_3] ; Rao:=coker random(R^{ -2},R^{1:-3,6:-4}); betti( fRao:= res Rao); A:=fRao.dd_2*random(fRao_2,R^{5:-5}); E1:=annihilator coker transpose A; RE:=R/E1; H:=transpose ( syz (A**RE))_{0}; --the morphism E1 -> P^4 E:=prune ker map(RE,S,H); p8:=intersect apply(8,i->randomKRationalPoint(E)); Q:=ideal (gens p8*random(source gens p8,(ring E)^{ -2})); residual:=(Q+E):p8; N:=coker sub(presentation prune(residual/E),S)**S^{2}; return N) TEST /// kk=ZZ/10007 S=kk[x_0..x_4] N=constructEx5(S,14); betti res N codim N, degree N E=annihilator N; betti res E assert( (degree E, genus E)==(14,14)) (M0,M1)=matrixFactorizationFromModule(N); C=curveFromMatrixFactorization(M0,M1); assert((dim C,degree C,genus C)==(2,16,15)) NX=N**ring M0; --time betti Ext^1(NX,NX) -- used 170.35 seconds -- 0 1 -- total: 36 120 -- 0: 36 120 tangentKernelDimension(N,M0)==4 36+10-4==42 ci=ideal(gens E*random(source gens E,S^{3:-3})); D=ci:E; betti D (degree D, genus D)==(13,12) betti res D /// constructEx5(PolynomialRing,List) := (S,L) -> ( pt:=ideal(random(S^1,S^{4:-1})); D:= randomDegree4Curve(S,L); D1:=intersect(D,pt); Q:=ideal(gens D1*random(source gens D1,S^{ -2})); gE:=15+genus D; dL:=gE+6-2; k:=2*gE-2-dL-1; -* L={(4,1)} betti D ci=ideal(gens D*random(source gens D,S^{2:-3,-2})); E=ci:D; betti res E genus E==gE 6-1==dL+1-gE 2*gE-2-dL==k *- ptsk:=intersect apply(k,i-> (L:=gens pt*random(source gens pt,S^{3:-1}); ideal L+Q:pt)); pts:=intersect(ptsk,pt); G:=intersect(D1,ptsk); ci:=ideal(gens G*random(source gens G,S^{ -2,2:-3})); E:=ci:D; --KE=prune(truncate(3,saturate(D+E))/E) is dualizing sheaf on E L1:=intersect(truncate(3,saturate(D+E)),pts); N:=prune(L1/E); return N) TEST /// kk=ZZ/10007 S=kk[x_0..x_4] cases={ {(4,1)}, {(4,0)}, {(3,1),(1,0)}, {(3,0),(1,0)}, {(2,0),(2,0)}, {(2,0),(1,0),(1,0)}, {(1,0),(1,0),(1,0),(1,0)} } time Ns=apply(cases,c->constructEx5(S,c)); -- used 20.0278 seconds time Es=apply(Ns,N->(E = annihilator N; (degree E,genus E))) -- used 0.738067 seconds time M01s=apply(Ns,N->matrixFactorizationFromModule(N)); -- used 5.36683 seconds time Cs=apply(M01s,c->curveFromMatrixFactorization(c)); -- used 29.8472 seconds time assert((tally apply(Cs,C->((dim C,degree C,genus C)==(2,16,15))))_true==7) -- used 0.331878 seconds -* bNs=apply(7,i->( NX=Ns_i**ring M01s_i_0; time betti Ext^1(NX,NX))) -- 0 1 0 1 0 1 0 1 0 1 0 1 0 1 -- {total: 39 133, total: 37 127, total: 38 130, total: 36 121, total: 36 121, total: 35 116, total: 34 112} -- 0: 39 133 0: 37 124 0: 37 125 0: 36 120 0: 36 120 0: 35 116 0: 34 112 -- 1: . 3 1: 1 5 1: . 1 1: . 1 time tKDs=apply(7,i->tangentKernelDimension(Ns_i,M01s_i_0)) -- {10, 6, 8, 6, 7, 6, 6} apply(7,i->(bNs_i)_(0,{0},0)+10-tKDs_i) -- {39, 41, 39, 40, 39, 39, 38} *- /// constructEx6=method() -- 0 1 2 3 -- total: 7 15 12 4 -- 3: 7 15 4 . -- 4: . . 8 3 -- 5: . . . 1 constructEx6(PolynomialRing) := S -> ( --(dE,gE)=(14,15) pt:=ideal(random(S^1,S^{4:-1})); D:=minors(2,matrix(apply(2,i->apply(4,j->S_(i+j))))); D1:=intersect(D,pt); Q:=ideal(gens D1*random(source gens D1,S^{ -2})); pts7:=intersect apply(7,i-> (L:=gens pt*random(source gens pt,S^{3:-1}); ideal L+Q:pt)); pts8:=intersect(pts7,pt); G:=intersect(D1,pts7); ci:=ideal(gens G*random(source gens G,S^{ -2,2:-3})); E:=ci:D; --KE=prune(truncate(3,saturate(D+E))/E) is dualizing sheaf on E L1:=intersect(truncate(3,saturate(D+E)),pts8); N:=prune(L1/E)**S^{3}; return N) TEST /// kk=ZZ/10007 S=kk[x_0..x_4] N=constructEx6(S); betti res N -* 0 1 2 3 o7 = total: 7 15 12 4 0: 7 15 4 . 1: . . 8 3 2: . . . 1 *- E=annihilator N; betti res E betti res N, degree N, genus E (M0,M1)=matrixFactorizationFromModule(N); C=curveFromMatrixFactorization(M0,M1); assert((dim C,degree C,genus C)==(2,16,15)) NX=N**ring M0; --time betti Ext^1(NX,NX) -- used 83.8632 seconds -- 0 1 --o31 = total: 36 122 -- 0: 36 119 -- 1: . 3 tangentKernelDimension(N,M0)==7 36-7+10==39 -- => 39-dimensional unirational /// constructEx6(PolynomialRing,List) := (S,L) -> ( pt:=ideal(random(S^1,S^{4:-1})); D:= randomDegree4Curve(S,L); D1:=intersect(D,pt); Q:=ideal(gens D1*random(source gens D1,S^{ -2})); gE:=15+genus D; dL:=gE+7-2; k:=2*gE-2-dL-1; -* L={(4,1)} betti D ci=ideal(gens D*random(source gens D,S^{2:-3,-2})); E=ci:D; betti res E genus E==gE 7-1==dL+1-gE 2*gE-2-dL==k *- ptsk:=intersect apply(k,i-> (L:=gens pt*random(source gens pt,S^{3:-1}); ideal L+Q:pt)); pts:=intersect(ptsk,pt); G:=intersect(D1,ptsk); ci:=ideal(gens G*random(source gens G,S^{ -2,2:-3})); E:=ci:D; --KE=prune(truncate(3,saturate(D+E))/E) is dualizing sheaf on E L1:=intersect(truncate(3,saturate(D+E)),pts); N:=prune(L1/E); return N) TEST /// kk=ZZ/10007 S=kk[x_0..x_4] cases={ {(4,1)}, {(4,0)}, {(3,1),(1,0)}, {(3,0),(1,0)}, {(2,0),(2,0)}, {(2,0),(1,0),(1,0)}, {(1,0),(1,0),(1,0),(1,0)} } time Ns=apply(cases,c->constructEx6(S,c)); -- used 18.4833 seconds tally apply(Ns,n-> betti res N) time Es=apply(Ns,N->(E = annihilator N; (degree E,genus E))) -- used 0.738067 seconds time M01s=apply(Ns,N->matrixFactorizationFromModule(N)); -- used 5.36683 seconds time Cs=apply(M01s,c->curveFromMatrixFactorization(c)); -- used 21.2528 seconds time assert((tally apply(Cs,C->((dim C,degree C,genus C)==(2,16,15))))_true==7) -- used 0.134251 seconds -* time bNs=apply(7,i->( NX=Ns_i**ring M01s_i_0; time betti Ext^1(NX,NX))) -- used 572.099 seconds -- 0 1 0 1 0 1 0 1 0 1 0 1 0 1 -- {total: 38 128, total: 36 122, total: 37 125, total: 35 116, total: 35 116, total: 34 111, total: 33 107} -- 0: 38 128 0: 36 119 0: 36 120 0: 35 115 0: 35 115 0: 34 111 0: 33 107 -- 1: . 3 1: 1 5 1: . 1 1: . 1 time tKDs=apply(7,i->tangentKernelDimension(Ns_i,M01s_i_0)) -- used 21.0207 seconds -- {9, 7, 9, 7, 7, 7, 7} apply(7,i->(bNs_i)_(0,{0},0)+10-tKDs_i) -- {39, 39, 37, 38, 38, 37, 36} *- /// constructEx6(PolynomialRing,ZZ) := (S,gE) -> ( if not member(gE,{15,14}) then error "expected gE=14 or 15, no method implemented"; if gE==15 then return constructEx5(S,{(4,0)}); --now the case gE=14 construction --Goal -- 0 1 2 3 -- total: 7 15 12 4 -- 3: 7 15 4 . -- 4: . . 8 3 -- 5: . . . 1 -- (degree E, genus E)==(14,14) -- gE=14,dL=7, 1-7==dL+1-gE -- 1-7 =dL+1-ge -- betti res E -- 0 1 2 3 -- total: 1 6 9 4 -- 0: 1 . . . -- 1: . . . . -- 2: . 6 3 . -- 3: . . 6 4 -- model in P^3, non-unirational dominant construction kk:= coefficientRing S; y:=symbol y; R:=kk[y_0..y_3] ; Rao:=coker random(R^{ -2},R^{1:-3,6:-4}); betti( fRao:= res Rao); A:=fRao.dd_2*random(fRao_2,R^{5:-5}); E1:=annihilator coker transpose A; RE:=R/E1; H:=transpose ( syz (A**RE))_{0}; --the morphism E1 -> P^4 E:=prune ker map(RE,S,H); p7:=intersect apply(7,i->randomKRationalPoint(E)); Q:=ideal (gens p7*random(source gens p7,(ring E)^{ -2})); residual:=(Q+E):p7; N':=coker sub(presentation prune(residual/E),S)**S^{2}; fN':= res N'; N:=(coker transpose fN'.dd_3)**S^{1:-5}; return N) /// kk=ZZ/10007 S=kk[x_0..x_4] N=constructEx6(S,14); betti res N codim N, degree N E=annihilator N; betti res E assert( (degree E, genus E)==(14,14)) (M0,M1)=matrixFactorizationFromModule(N); C=curveFromMatrixFactorization(M0,M1); assert((dim C,degree C,genus C)==(2,16,15)) tangentKernelDimension(N,M0)==3 NX=N**ring M0; time betti Ext^1(NX,NX) -- used 72.2325 seconds -- 0 1 -- total: 35 115 -- 0: 35 115 -- generically reduced family time betti(ext10=truncate(0,Ext^1(N,N))) betti E 64+5-24==35+10 35+10-3==42 /// randomSmallDegreeCurve=method() randomSmallDegreeCurve(PolynomialRing,List) :=(S,L) -> ( if L=={(2,0)} then return ideal random(S^1,S^{2:-1,-2}); if L=={(1,0),(1,0)} then return intersect apply(2,i->ideal random(S^1,S^{3:-1})); return null) constructEx7=method() -- goal: -- 0 1 2 3 4 0 1 2 3 --total: 4 13 14 5 1, total: 4 18 22 8 -- 0: 2 . . . . 0: 2 . . . -- 1: 2 13 12 . . 1: 2 18 22 8 -- 2: . . 2 5 1 -- -- dE=10, gE = 8 or constructEx7(PolynomialRing) := (S) -> ( -- L={(2,0)} pt:=ideal random(S^1,S^{4:-1}); D:=ideal random(S^1,S^{2:-1,-2}); D1:=intersect(D,pt); Q:=ideal(gens D1*random(source gens D1,S^{ -2})); gE:=8+genus D; dL:=2+gE-1; k:=gE-1; -* ci:= ideal(gens D*random(source gens D,S^{2:-2,-3})); E:=ci:D; degree E, genus E *- ptsk:=intersect apply(k,i-> (L:=gens pt*random(source gens pt,S^{3:-1}); ideal L+Q:pt)); pts:=intersect(ptsk,pt); G:=intersect(D1,ptsk); ci:=ideal(gens G*random(source gens G,S^{2:-2,1:-3})); E:=ci:D; pt2:=saturate(pt^2+E); L1:=intersect(pt2,ptsk); H2:=ideal(gens L1*random(source gens L1,S^{ -2})); L2:=E+H2:L1; N1:=presentation prune(L2/E)**S^{2}; N2:=random(S^{ -1},target N1)*N1; N3:=(N1*syz(N2,DegreeLimit=>2)); N:= transpose syz transpose syz N3; -- betti res coker N, betti res coker N1 return coker N) TEST /// kk=ZZ/10007 S=kk[x_0..x_4] N=constructEx7(S); betti res N codim N,degree N E=annihilator N; betti res E betti res N, degree N, genus E (M0,M1)=matrixFactorizationFromModule(N); C=curveFromMatrixFactorization(M0,M1); assert((dim C,degree C,genus C)==(2,16,15)) NX=N**ring M0; time betti Ext^1(NX,NX) -- used 136.211 seconds -- 0 1 --total: 29 101 -- 0: 29 101 tangentKernelDimension(N,M0)==0 29+10-0==39 /// --------------------------------------------- -- Is a Betti diagram up to multiples -- --------------------------------------------- --input: list of rational numbers --output true if the list is strictly increasing, else false. isStrictlyIncreasing=L->( t:=true; for i from 0 to #L-2 do t=(t and (L_i( L:=lowestDegrees B; if not isStrictlyIncreasing L then return false; C:=pureBettiDiagram L; ratio:=min apply(#L, i->(B#(i,{L_i}, L_i))/(C#(i,{L_i},L_i))); (C,ratio,merge(B,C, (i,j)->i-ratio*j)) ) isInBoijSoederbergCone=method(TypicalValue=>Boolean) --input: a BettiTally --output: Boolean isInBoijSoederbergCone(BettiTally) := B-> ( Components:={}; B1:= new MutableHashTable from B; while min values B1 >= 0 and max values B1 > 0 do ( X:=decompose2(new BettiTally from B1); if class X===Boolean then return false; B1=new MutableHashTable from X_2; --change the type of the values in X_0 to ZZ Y:=new BettiTally from apply(pairs X_0, i->{first i, lift(last i, ZZ)}); Components = append(Components, hold(X_1) * Y)); if min values B1 <0 then return false else return true; ) BSCandidates= method() --Input: beta, a BettiTally of matrix factorization of a form of -- degree d --Output: A List of possible Betti tables of modules, whose syzygies -- could lead to the desired matrix factorization without cancelations BSCandidates(BettiTally,ZZ) := (beta,d) -> ( b01:=apply(keys beta,c->(c_0,c_2)); b0:=select(b01,c->c_0==0); b1:=select(b01,c->c_0==1); b2:=apply(b0,c->(c_0+2,c_1+d)); b3:=apply(b1,c->(c_0+2,c_1+d)); b4:=apply(b2,c->(c_0+2,c_1+d)); b5:=apply(b3,c->(c_0+2,c_1+d)); bs:=b0|b1|b2|b3|b4; bb:=symbol bb; Rb:=ZZ[apply(bs,c->bb_c)]; eqs:=apply(b0,c->sum(3,i->bb_(c_0+2*i,c_1+d*i))-beta_((select(keys beta,cc->(cc_0,cc_2)==c))_0))| apply(b1,c->sum(2,i->bb_(c_0+2*i,c_1+d*i))-beta_((select(keys beta,cc->(cc_0,cc_2)==c))_0)); mapList:=apply(eqs,eq->( coef:=coefficients eq; bound:=-sub(eq,ZZ); coef1:=(entries coef_0)_0; maps:=apply(#coef1-1,j->apply(bound+1,i->(coef1_j-i))); maps0:=set (maps_0); i:=1; while (i< #coef1-1) do (maps0=maps0**set(maps_i);i=i+1); mapss:=toList maps0; mapss1:=apply(toList maps0,c->apply(flatten toList c,d-> d)); mapss2:=apply(mapss1,c->sum(c,d->ideal d)); mapss3:=apply(mapss2, c->vars Rb% c); mapss4:=select(mapss3,c->sub(eq, c)==0); mapss4)); ell:=#mapList-1;newLast:={}; --apply(ell+1,i->#mapList_i) --#mapList_(ell),#mapList_(ell-1) while ell>0 do ( newLast=flatten apply(mapList_ell,m2->apply(mapList_(ell-1),m1->sub(m1,m2))); mapList=if ell>1 then (mapList_{0..ell-2}|{newLast}) else newLast; ell=ell-1 ); mapList=apply(mapList,mapL->sub(mapL,ZZ)); TList:=apply(mapList,mapL->( fs:=apply(5,i-> directSum(apply(select(bs,ij->ij_0==i) ,ij->Rb^{sub(bb_ij,mapL):-ij_1}))); T:=betti chainComplex(apply(4,i->map(fs_i,fs_(i+1),0))); T)); TList1:=select(TList,b->( #select(pdim b+1,i->( ki:=select(keys b,k->k_0==i);sum(ki,k->b_k)==0))==0 )); BScands:=select(TList1,b->isInBoijSoederbergCone(b)); return BScands) TEST /// S=ZZ/101[x_0..x_4] beta=betti random(S^3,S^{3:-1}) cands=BSCandidates(beta,3) /// allCandidates=method() allCandidates(ZZ) := g -> ( if g==15 then << "-- This takes about 1566 seconds = 26 minutes " << endl; if g==0 then return candidateList(); if not member(g,{0,15}) then error "expected 0 or 15" ; x:= symbol x; S:=ZZ/101[x_0..x_4]; beta:=betti random(S^18,S^{15:-1,3:-2}); cand1s:=BSCandidates(beta,3); cands1a:=select(cand1s,b->codim b>2); beta=betti random(S^18,S^{3:-1,15:-2}); cands2:=BSCandidates(beta,3); cands2a:=select(cands2,b->codim b>2); beta=betti random(S^{3:0,15:-1},S^{18:-2}); cands3:=BSCandidates(beta,3); cands3a:=select(cands3,b->codim b>2); beta=betti random(S^{15:0,3:-1},S^{18:-2}); cands4:=BSCandidates(beta,3); cands4a:=select(cands4,b->codim b>2); cands:=cands1a|cands2a|cands3a|cands4a; assert(#cands==39); degs:=unique sort apply(cands,b->degree b); cands=flatten apply(degs,d->select(cands,b-> degree b==d)); return cands) TEST /// time cands=allCandidates(0); --toString cands tally apply(cands,beta-> degree beta) acm=select(cands,beta-> codim beta==pdim beta) #select(cands,beta->codim beta ==3)==39 /// candidateList=() -> return {new BettiTally from {(0,{0},0) => 2, (1,{1},1) => 2, (1,{2},2) => 8, (2,{3},3) => 13, (3,{4},4) => 1, (3,{5},5) => 7, (4,{6},6) => 3}, new BettiTally from {(0,{0},0) => 1, (0,{1},1) => 1, (1,{2},2) => 10, (2,{3},3) => 11, (2,{4},4) => 2, (3,{5},5) => 8, (4,{6},6) => 3}, new BettiTally from {(0,{0},0) => 1, (0,{1},1) => 2, (1,{2},2) => 13, (2,{3},3) => 14, (3,{5},5) => 5, (4,{7},7) => 1}, new BettiTally from {(0,{0},0) => 4, (1,{1},1) => 9, (2,{3},3) => 12, (3,{4},4) => 6, (3,{5},5) => 3, (4,{6},6) => 2}, new BettiTally from {(0,{0},0) => 3, (1,{1},1) => 6, (1,{2},2) => 3, (2,{3},3) => 14, (3,{4},4) => 9, (4,{6},6) => 1}, new BettiTally from {(0,{1},1) => 4, (1,{2},2) => 10, (2,{3},3) => 3, (2,{4},4) => 10, (3,{5},5) => 8, (4,{7},7) => 1}, new BettiTally from {(0,{0},0) => 1, (0,{1},1) => 1, (1,{2},2) => 7, (2,{3},3) => 1, (2,{4},4) => 13, (3,{5},5) => 11, (4,{6},6) => 1, (4,{7},7) => 1}, new BettiTally from {(0,{1},1) => 3, (1,{2},2) => 7, (2,{4},4) => 12, (3,{5},5) => 11, (4,{6},6) => 3}, new BettiTally from {(0,{0},0) => 2, (1,{1},1) => 1, (1,{2},2) => 10, (2,{3},3) => 14, (3,{4},4) => 2, (3,{5},5) => 5, (4,{6},6) => 2}, new BettiTally from {(0,{0},0) => 1, (0,{1},1) => 2, (1,{2},2) => 12, (2,{3},3) => 12, (2,{4},4) => 1, (3,{5},5) => 6, (4,{6},6) => 2}, new BettiTally from {(0,{0},0) => 2, (1,{2},2) => 12, (2,{3},3) => 13, (2,{4},4) => 2, (3,{5},5) => 6, (4,{7},7) => 1}, new BettiTally from {(0,{0},0) => 4, (1,{1},1) => 8, (1,{2},2) => 2, (2,{3},3) => 13, (3,{4},4) => 7, (3,{5},5) => 1, (4,{6},6) => 1}, new BettiTally from {(0,{0},0) => 1, (0,{1},1) => 2, (1,{2},2) => 9, (2,{3},3) => 2, (2,{4},4) => 12, (3,{5},5) => 9, (4,{7},7) => 1}, new BettiTally from {(0,{1},1) => 4, (1,{2},2) => 9, (2,{3},3) => 1, (2,{4},4) => 11, (3,{5},5) => 9, (4,{6},6) => 2}, new BettiTally from {(0,{0},0) => 3, (1,{1},1) => 3, (1,{2},2) => 9, (2,{3},3) => 13, (3,{5},5) => 6, (4,{6},6) => 2}, new BettiTally from {(0,{0},0) => 2, (1,{2},2) => 12, (2,{3},3) => 15, (3,{4},4) => 3, (3,{5},5) => 3, (4,{6},6) => 1}, new BettiTally from {(0,{0},0) => 2, (1,{2},2) => 11, (2,{3},3) => 11, (2,{4},4) => 3, (3,{5},5) => 7, (4,{6},6) => 2}, new BettiTally from {(0,{0},0) => 1, (0,{1},1) => 3, (1,{2},2) => 14, (2,{3},3) => 13, (3,{5},5) => 4, (4,{6},6) => 1}, new BettiTally from {(0,{0},0) => 5, (1,{1},1) => 10, (1,{2},2) => 1, (2,{3},3) => 12, (3,{4},4) => 5, (3,{5},5) => 2, (4,{6},6) => 1}, new BettiTally from {(0,{1},1) => 5, (1,{2},2) => 11, (2,{3},3) => 2, (2,{4},4) => 10, (3,{5},5) => 7, (4,{6},6) => 1}, new BettiTally from {(0,{0},0) => 1, (0,{1},1) => 2, (1,{2},2) => 8, (2,{4},4) => 13, (3,{5},5) => 10, (4,{6},6) => 2}, new BettiTally from {(0,{0},0) => 2, (1,{2},2) => 8, (2,{3},3) => 1, (2,{4},4) => 14, (3,{5},5) => 10, (4,{7},7) => 1}, new BettiTally from {(0,{0},0) => 3, (1,{1},1) => 2, (1,{2},2) => 11, (2,{3},3) => 14, (3,{4},4) => 1, (3,{5},5) => 4, (4,{6},6) => 1}, new BettiTally from {(0,{0},0) => 2, (0,{1},1) => 1, (1,{2},2) => 13, (2,{3},3) => 12, (2,{4},4) => 2, (3,{5},5) => 5, (4,{6},6) => 1}, new BettiTally from {(0,{0},0) => 6, (1,{1},1) => 12, (2,{3},3) => 11, (3,{4},4) => 3, (3,{5},5) => 3, (4,{6},6) => 1}, new BettiTally from {(0,{0},0) => 5, (1,{1},1) => 9, (1,{2},2) => 3, (2,{3},3) => 13, (3,{4},4) => 6}, new BettiTally from {(0,{0},0) => 1, (0,{1},1) => 3, (1,{2},2) => 10, (2,{3},3) => 1, (2,{4},4) => 12, (3,{5},5) => 8, (4,{6},6) => 1}, new BettiTally from {(0,{1},1) => 6, (1,{2},2) => 13, (2,{3},3) => 3, (2,{4},4) => 9, (3,{5},5) => 5}, new BettiTally from {(0,{0},0) => 3, (1,{1},1) => 1, (1,{2},2) => 13, (2,{3},3) => 15, (3,{4},4) => 2, (3,{5},5) => 2}, new BettiTally from {(0,{0},0) => 2, (0,{1},1) => 2, (1,{2},2) => 15, (2,{3},3) => 13, (2,{4},4) => 1, (3,{5},5) => 3}, new BettiTally from {(0,{0},0) => 6, (1,{1},1) => 11, (1,{2},2) => 2, (2,{3},3) => 12, (3,{4},4) => 4, (3,{5},5) => 1}, new BettiTally from {(0,{0},0) => 2, (0,{1},1) => 1, (1,{2},2) => 9, (2,{4},4) => 14, (3,{5},5) => 9, (4,{6},6) => 1}, new BettiTally from {(0,{0},0) => 1, (0,{1},1) => 4, (1,{2},2) => 12, (2,{3},3) => 2, (2,{4},4) => 11, (3,{5},5) => 6}, new BettiTally from {(0,{0},0) => 4, (1,{1},1) => 3, (1,{2},2) => 12, (2,{3},3) => 14, (3,{5},5) => 3}, new BettiTally from {(0,{0},0) => 3, (1,{2},2) => 14, (2,{3},3) => 12, (2,{4},4) => 3, (3,{5},5) => 4}, new BettiTally from {(0,{0},0) => 7, (1,{1},1) => 13, (1,{2},2) => 1, (2,{3},3) => 11, (3,{4},4) => 2, (3,{5},5) => 2}, new BettiTally from {(0,{0},0) => 2, (0,{1},1) => 2, (1,{2},2) => 11, (2,{3},3) => 1, (2,{4},4) => 13, (3,{5},5) => 7}, new BettiTally from {(0,{0},0) => 8, (1,{1},1) => 15, (2,{3},3) => 10, (3,{5},5) => 3}, new BettiTally from {(0,{0},0) => 3, (1,{2},2) => 10, (2,{4},4) => 15, (3,{5},5) => 8}} verifyAllAssertionsOfThePaper = () -> ( print " /// -------------------------------------------- -- Proposition 3.1 -- -------------------------------------------- cands=allCandidates(0) -- a pre-computed list time cands1=allCandidates(15) -- needs about 26 minutes cands1== cands #cands select(cands,b->degree b == 11) select(cands,b->degree b == 13) ACMTables=apply(select(cands,b-> codim b==pdim b),b->(codim b,degree b,b)) #ACMTables==2*6 ---------------------------------------------------------------- -- Families and their tangent computation -- ---------------------------------------------------------------- kk=ZZ/10007 S=kk[x_0..x_4] ---------------------------------------------------------------- -- Thm 4.1 and part of Prop 5.1 and Cor 5.2 -- ---------------------------------------------------------------- N=constructEx1(S); betti (fN= res N) E=annihilator N; betti res E (codim E, degree E, genus E)==(3,11,10) isSmoothCurve sub(E,random(S^1,S^{5:-1})) (M0,M1) = matrixFactorizationFromModule(N); M=coker M0; betti M0, betti M1 C=curveFromMatrixFactorization(M0,M1); (codim C,degree C,genus C)==(3,16,15) time isSmoothCurve C omegaC=Ext^2(C,S^{ -5}); betti res omegaC -- => O_C(1) in W^4_{16}(C) is a smooth point. SX = ring M0; X=ideal SX; codim ideal jacobian X == 5 NX=N**SX; N'=coker transpose fN.dd_3**S^{ -4}; betti N' betti res NX N'X=N'**SX; betti res N'X tangentKernelDimension(N,M0)==3 time betti Ext^1(M,NX) -- used 53.4604 seconds -- 0 1 --total: 32 159 -- 0: 32 159 42==32+10 -- => 42 dimensional tangent space time betti truncate(0, Ext^1(N,N)) -- used 11.6519 seconds betti truncate(3,E) 42+5^2-1-(11-1)==56 39==42-3 -- 39-dimensional family ---------------------------------------------------------------- -- Thm 4.3 and part of Prop 5.1 and Cor 5.2 -- ---------------------------------------------------------------- N=constructEx2(S); betti res N E=annihilator N; betti res E (codim E, degree E, genus E)==(3,11,10) (M0,M1) = matrixFactorizationFromModule(N); M=coker M0; betti M0, betti M1 C=curveFromMatrixFactorization(M0,M1); (codim C,degree C,genus C)==(3,16,15) time isSmoothCurve C omegaC=Ext^2(C,S^{ -5}); betti res omegaC -- => O_C(1) in W^4_{16}(C) is a smooth point. SX = ring M0; NX=N**SX; betti res NX tangentKernelDimension(N,M0)==6 42==32+10 time betti Ext^1(NX,NX) -- used 31.1409 seconds -- 0 1 -- total: 32 115 -- 0: 32 113 -- 1: . 2 36==42-6 -- 36-dimensional family ---------------------------------------------------------------- -- Prop 4.4 and part of Prop 5.1 and Cor 5.2 -- ---------------------------------------------------------------- N=constructEx3(S); betti res N E=annihilator N; betti res E (codim E, degree E, genus E)==(3,11,10) (M0,M1) = matrixFactorizationFromModule(N); M=coker M0; betti M0, betti M1 C=curveFromMatrixFactorization(M0,M1); (codim C,degree C,genus C)==(3,16,15) isSmoothCurve C omegaC=Ext^2(C,S^{ -5}); betti res omegaC -- => O_C(1) in W^4_{16}(C) is a smooth point. SX = ring M0; NX=N**SX; betti res NX tangentKernelDimension(N,M0)==3 42==32+10 time betti tuncate(0,Ext^1(NX,NX)) -- used 45.6245 seconds -- => 32+10=42 dimensional 39==42-3 -- 39-dimensional family ---------------------------------------------------------------- -- Remark 4.5 -- ---------------------------------------------------------------- time tally apply(10,i->betti res constructEx3(S)) -- used 3.42376 seconds --------------------------------------------------------------- -- Thm 4.6 and part of Prop 5.1 and Cor 5.2 -- --------------------------------------------------------------- N=constructEx4(S); betti res N E=annihilator N; betti res E (codim E, degree E, genus E)==(3,14,11) (M0,M1) = matrixFactorizationFromModule(N); betti M0, betti M1 C=curveFromMatrixFactorization(M0,M1); betti res C omegaC=Ext^2(C,S^{ -5}); betti res omegaC -- => O_C(1) in W^4_{16}(C) is a smooth point. (codim C,degree C,genus C)==(3,16,15) isSmoothCurve C SX = ring M0; NX=N**SX; betti res NX tangentKernelDimension(N,M0)==0 time betti truncate(0,Ext^1(NX,NX)) -- used 188.208 seconds -- 0 1 -- total: 32 101 -- 0: 32 101 42==42-0 --=> dominat family ---------------------------------------------------------------- -- Thm 4.7 and part of Prop 5.1 and Cor 5.2 -- ---------------------------------------------------------------- N=constructEx5(S); betti res N E=annihilator N; betti res E (codim E, degree E, genus E)==(3,14,15) (M0,M1) = matrixFactorizationFromModule(N); betti M0, betti M1 C=curveFromMatrixFactorization(M0,M1); (codim C,degree C,genus C)==(3,16,15) isSmoothCurve C omegaC=Ext^2(C,S^{ -5}); betti res omegaC -- => O_C(1) in W^4_{16}(C) is a smooth point. SX = ring M0; NX=N**SX; betti res NX tangentKernelDimension(N,M0)==6 time betti truncate(0,Ext^1(NX,NX)) -- used 81.1106 seconds -- -- 0 1 --total: 37 127 -- 0: 37 124 -- 1: . 3 -- -- => 47 dimensional generically reduced family 41==47-6 -- => gives a divisor in M_15 ---------------------------------------------------------------- -- Thm 4.8 and part of Prop 4.1 and Cor 4.2 -- ---------------------------------------------------------------- N=constructEx5(S,14); betti res N E=annihilator N; betti res E (codim E, degree E, genus E)==(3,14,15) (M0,M1) = matrixFactorizationFromModule(N); betti M0, betti M1 C=curveFromMatrixFactorization(M0,M1); (codim C,degree C,genus C)==(3,16,15) isSmoothCurve C betti res C omegaC=Ext^2(C,S^{ -5}); betti res omegaC -- => O_C(1) in W^4_{16}(C) is a smooth point. SX = ring M0; NX=N**SX; betti res NX tangentKernelDimension(N,M0)==4 time betti truncate(0,Ext^1(NX,NX)) -- used 204.82 seconds -- 0 1 --total: 36 120 -- 0: 36 120 46==36+10 -- => 46 dimensional generically reduced family 42==46-4 -- => dominant family ---------------------------------------------------------------- -- Thm 4.9 and part of Prop 5.1 and Cor 5.2 -- ---------------------------------------------------------------- N=constructEx6(S); betti res N E=annihilator N; betti res E (codim E, degree E, genus E)==(3,14,15) (M0,M1) = matrixFactorizationFromModule(N); betti M0, betti M1 C=curveFromMatrixFactorization(M0,M1); (codim C,degree C,genus C)==(3,16,15) isSmoothCurve C betti res C omegaC=Ext^2(C,S^{ -5}); betti res omegaC -- => O_C(1) in W^4_{16}(C) is a smooth point. SX = ring M0; NX=N**SX; betti res NX tangentKernelDimension(N,M0)==7 time betti truncate(0,Ext^1(NX,NX)) -- used 91.4395 seconds -- 0 1 --total: 36 122 -- 0: 36 119 -- 1: . 3 46==36+10 -- => 46 dimensional generically reduced family 39==46-7 ---------------------------------------------------------------- -- Thm 4.10 and part of Prop 5.1 and Cor 5.2 -- ---------------------------------------------------------------- N=constructEx6(S,14); betti res N E=annihilator N; betti res E (codim E, degree E, genus E)==(3,14,14) (M0,M1) = matrixFactorizationFromModule(N); betti M0, betti M1 C=curveFromMatrixFactorization(M0,M1); (codim C,degree C,genus C)==(3,16,15) isSmoothCurve C betti res C omegaC=Ext^2(C,S^{ -5}); betti res omegaC -- => O_C(1) in W^4_{16}(C) is a smooth point. SX = ring M0; NX=N**SX; betti res NX tangentKernelDimension(N,M0)==3 time betti truncate(0,Ext^1(NX,NX)) -- used 70.8162 seconds -- 0 1 -- total: 35 115 -- 0: 35 115 45==35+10 -- => 45 dimensional generically reduced family 42==45-3 -- => a dominant family --------------------------------------------------------- -- The proof of Prop. 5.1 and Cor. 5.2 in now complete -- --------------------------------------------------------- ----------------------------------------------------------------- -- Section 5: all MCM approximations are without free summands -- ----------------------------------------------------------------- Ns={ constructEx1(S), constructEx2(S), constructEx3(S), constructEx4(S), constructEx5(S), constructEx5(S,14), constructEx6(S), constructEx6(S,14)}; Es= apply(Ns,N->annihilator N); tally apply(Es,E->betti res E) Xs= apply(Es,E->ideal(gens E*random(source gens E,S^{ -3}))); NXs=apply(8,i->(SX=S/(Xs_i);Ns_i**SX)); time phis=apply(NXs,N->MCMapproximation N); -- used 17.8561 seconds apply(phis,phi->betti source phi) apply(phis,phi->betti target phi) apply(phis,phi->prune coker phi) -- => no free summnands needed in the MCM approximation hom0s=apply(phis, phi-> Hom0(source phi, target phi)); apply(hom0s,h-> betti h) morphs=apply(8,i->homomorphism0(source phis_i, target phis_i,hom0s_i_{0})); Ps=apply(morphs, m-> ker m); apply(Ps,P->betti res(P,LengthLimit=>2)) Ps=apply(phis,phi->ker phi); fast={0,2,4,6,7} time apply(8,i->(betti res source phis_i, betti res target phis_i)) -- used 27.6224 seconds time apply(fast,i-> betti res prune Ps_i) ---------------------------------------------------------------- -- Remark 5.4 -- ---------------------------------------------------------------- cases={ {(4,1)}, {(4,0)}, {(3,1),(1,0)}, {(3,0),(1,0)}, {(2,0),(2,0)}, {(2,0),(1,0),(1,0)}, {(1,0),(1,0),(1,0),(1,0)} } time Ns=apply(cases,c->constructEx5(S,c)); -- used 20.0278 seconds time Es=apply(Ns,N->(E = annihilator N; (degree E,genus E,betti res E))) -- used 0.738067 seconds time M01s=apply(Ns,N->matrixFactorizationFromModule(N)); -- used 5.36683 seconds time Cs=apply(M01s,c->curveFromMatrixFactorization(c)); -- used 29.8472 seconds time apply(Cs,C->((codim C,degree C,genus C)==(3,16,15))) -- used 0.331878 seconds time tally apply(Cs,C->(omegaC=Ext^2(C,S^{ -5});(betti res C, betti res omegaC ))) -- used 0.437617 seconds time tally apply(Cs,C->isSmoothCurve C) -- used 39.9205 seconds time ts=apply(7,i->tangentKernelDimension(Ns_i,M01s_i_0)) -- used 17.9886 seconds, ts=={10, 6, 8, 6, 7, 6, 6} time fs=apply(7,i->(NX=Ns_i**ring M01s_i_0;extPres=gens truncate(0,Ext^1(NX,NX)); #select(degrees target extPres,d->d=={0}))) -- used 560.471 seconds fs=={39, 37, 37, 36, 36, 35, 34} apply(7,i->(fs_i+10-ts_i))=={39, 41, 39, 40, 39, 39, 38} time Ns=apply(cases,c->constructEx6(S,c)); -- -- used 18.2754 seconds time Es=apply(Ns,N->(E = annihilator N; (degree E,genus E,betti res E))) -- used 0.909422 seconds time M01s=apply(Ns,N->matrixFactorizationFromModule(N)); -- used 5.10335 seconds time Cs=apply(M01s,c->curveFromMatrixFactorization(c)); -- used 19.2328 seconds time apply(Cs,C->((codim C,degree C,genus C)==(3,16,15))) -- used 0.112117 second time tally apply(Cs,C->(omegaC=Ext^2(C,S^{ -5});(betti res C, betti res omegaC ))) -- used 0.644183 seconds time tally apply(Cs,C->isSmoothCurve C) -- used 41.7314 seconds time ts=apply(7,i->tangentKernelDimension(Ns_i,M01s_i_0)) --- used 17.0099 seconds ts=={9, 7, 9, 7, 7, 7, 7} time fs=apply(7,i->(NX=Ns_i**ring M01s_i_0;extPres=gens truncate(0,Ext^1(NX,NX)); #select(degrees target extPres,d->d=={0}))) -- used 582.124 seconds fs=={38, 36, 36, 35, 35, 34, 33} apply(7,i->(fs_i+10-ts_i))=={39, 39, 37, 38, 38, 37, 36} /// " ) randomCurveOfGenus15=method(Options=>{certify=>true,attempts=>1}) randomCurveOfGenus15(PolynomialRing) := opt -> S -> ( kk:=coefficientRing S; y:=symbol y; R:=kk[y_0..y_3];att:=0; while ( -- singular curve attempts while ( -- curveFromMatrixFactorization while ( -- matrixFactorizationFromModule while ( -- 8 points Rao:=coker random(R^{ -2},R^{1:-3,6:-4}); while not (dim Rao,degree Rao)==(0,4) do (Rao=coker random(R^{ -2},R^{1:-3,6:-4});<<"Rao" <2)); A:=fRao.dd_2*random(fRao_2,R^{5:-5}); E1:=annihilator coker transpose A; while not (dim E1,degree E1)==(2,12) do ( A=fRao.dd_2*random(fRao_2,R^{5:-5});E1=annihilator coker transpose A; << "E" <randomKRationalPoint(E)); Q:=ideal (gens p8*random(source gens p8,(ring E)^{ -2})); residual:=(Q+E):p8; not (dim residual, degree residual)==(1,20)) do (<< "8 points" <true,attempts=>2); isSmoothCurve C, degree C, genus C /// beginDocumentation() document { Key => MatFac15, Headline => "Constructions of curves of genus 15", "Using the method of ", HREF("http://arxiv.org/abs/1311.6962","Matrix factorizations and families of curves of genus 15") , " we construct via matrix factorization on cubics 3-folds in P^4 families of curves of genus 15.", PARA{}, SUBSECTION "Up to degree zero computations of Hom groups", UL{ -- TO Ext0, TO Hom0, TO homomorphism0, }, SUBSECTION "Main steps in the computation", UL{ TO matrixFactorizationFromModule, TO curveFromMatrixFactorization, TO isSmoothCurve, TO tangentKernelDimension, TO MCMapproximation }, SUBSECTION "Construction of families", UL{ TO constructEx1, TO constructEx2, TO constructEx3, TO constructEx4, TO constructEx5, TO constructEx6, TO randomKRationalPoint, TO randomCurveOfGenus15 }, SUBSECTION "All assertions of the paper", UL{ TO verifyAllAssertionsOfThePaper }, SUBSECTION "Creation of candidate modules", UL{ TO BSCandidates, TO allCandidates } } -* document{ Key => {Ext0,(Ext0,Module,Module)}, Headline => "compute the degree 0 part of an Ext^1 module, currently buggy", Usage => "Ext0(M,N)", Inputs => { "M"=>Module, "N"=>Module }, Outputs => {"Ext^1(M,N)_0" => Module}, "The function computes Ext^1(M,N)_0 without computing the whole Ext^1 -module. Some timing of steps in the computation is printed.", PARA{}, EXAMPLE lines /// kk=ZZ/10007;R=kk[y_0..y_2]; m=coker transpose random(R^{1,2},R^2);E=annihilator m; RE=R/E; M= m**RE; N=M; F=sheaf M; time Ext^1(F,F) time betti Ext^1(M,M) time betti truncate(0, Ext^1(M,N)) time betti( E=Ext0(M,N)) /// } *- doc /// Key Hom0 (Hom0,Module,Module) Headline compute the degree 0 part of a Hom group Usage Hom0(M,N) Inputs M: Module N: Module Outputs : Matrix corresponding to a basis of Hom(M,N)_0 Description Text Computes the degree 0 part of the module Hom(M,N) without computing the whole module Example kk=ZZ/10007;R=kk[y_0..y_2]; m=coker transpose random(R^{1,2},R^2);E=annihilator m; RE=R/E; M= m**RE; N=M; time betti Hom0(M,M) time betti Hom(M,N) /// doc /// Key homomorphism0 (homomorphism0,Module,Module,Matrix) Headline compute the homomorphism corresponding to an element in Hom0 Usage homomorphism0(M,N,phi) Inputs M: Module N: Module phi: Matrix Outputs : Matrix Description Text compute the homomorphism corresponding to the element phi Example kk=ZZ/10007;R=kk[y_0..y_2]; m=transpose random(R^{1,2},R^2);E=annihilator coker m; (degree E, genus E) ==(3,1) RE=R/E; M= coker m**RE; N=coker transpose m**RE; betti(phi'= Hom0(M,N)) phi=homomorphism0(M,N,phi'_{1}) degree coker phi betti M, betti N, betti Hom(M,N) apply(4,i->hilbertFunction(i-2,Hom(M,N))) /// doc /// Key randomKRationalPoint (randomKRationalPoint,Ideal) Headline Pick a random K rational point on the scheme X defined by I Usage randomKRationalPoint(I) Inputs I: Ideal in a polynomial ring over a finite ground field K Outputs : Ideal of a K-rational point on V(I) Description Text If X has codimension 1, then we intersect X with a randomly choosen line, and hope that the decomposition of the the intersection contains a K-rational point. If n=degree X then the probabilty P that this happens, is the proportion of permutations in $S_n$ with a fix point on $\{1,\ldots,n \}$, i.e. $$P=\sum_{j=1}^n (-1)^{j-1} binomial(n,j)(n-j)!/n! = 1-1/2+1/3! + \ldots $$ which arroaches $1-exp(-1) = 0.63\ldots$. Thus a probabilistic approach works. For higher codimension we first project X birationally onto a hypersurface Y, and find a point on Y. Then we take the preimage of this point. Example p=10007 kk=ZZ/p;R=kk[x_0..x_3]; I=minors(4,random(R^5,R^{4:-1})); codim I, degree I time randomKRationalPoint(I) R=kk[x_0..x_5]; I=minors(3,random(R^5,R^{3:-1})); codim I, degree I time randomKRationalPoint(I) Text The claim that 63 % of the intersections contain a K-rational point can be experimentally tested: Example p=10007,kk=ZZ/p,R=kk[x_0..x_2] n=5; sum(1..n,j->(-1)^(j-1)*binomial(n,j)*(n-j)!/n!)+0.0 I=ideal random(n,R); time (#select(apply(100,i->(degs=apply(decompose(I+ideal random(1,R)),c->degree c); #select(degs,d->d==1))),f->f>0)) /// doc /// Key matrixFactorizationFromModule (matrixFactorizationFromModule,Module) Headline compute a matrix factorization from a module Usage (M0,M1)=matrixFactorizationFromModule(N) Inputs N: Module Outputs : Sequence a pair of matrices corresponding to the differentials in the 2-peroidic resolution Description Text Given a module N over the coordinate ring S of P^4 which is annihilated by a cubic f, the function returns the matrix of f obtained from the eventual periodic resolution of N as an S/f module. Example kk=ZZ/10007;S=kk[x_0..x_4]; N=constructEx1(S); betti res N (M0,M1) = matrixFactorizationFromModule(N); betti M0, betti M1 IX =ideal ring M0 S===ring IX /// doc /// Key curveFromMatrixFactorization (curveFromMatrixFactorization,Matrix,Matrix) Headline compute the curve C associated to the matrix factorization Usage C=curveFromMatrixFactorization(M0,M1) Inputs M0: Matrix M1: Matrix a matrix factorization of a cubic f Outputs : Ideal of a curve of genus 15 and degree 16 in P^4 Description Text Given a matrix factorization (M0,M1) of a cubic f of format as indicarted in o5 below (or transposed,interchained or twisted) the ideal defined from the monad $$ 0 \leftarrow \oplus^3 O_X \leftarrow F \leftarrow \oplus^3 O_X(-1) \leftarrow 0 $$ where $F =coker M0(-3)$ is a rank 7 vectorbundle on the cubic hypersurface $X=V(f)$ will be computed. Example kk=ZZ/10007;S=kk[x_0..x_4]; N=constructEx3(S); (M0,M1) = matrixFactorizationFromModule(N); betti M0, betti M1 C = curveFromMatrixFactorization(M0,M1); codim C, degree C, genus C /// doc /// Key isSmoothCurve (isSmoothCurve,Ideal) Headline check whether the ideal defines a smooth curve Usage isSmoothCurve(C) Inputs C: Ideal the ideal of a curve in P^n, n >= 3 Outputs : Boolean true means the curve is smooth, false means that the projected curve in P^3 is singular Description Text The function checks for smoothness with the jacobian criterion. So in a first step, we check for associated points. In case of n > 3 we project to P^3 from the center defined by the first 4 variables of the coordinate ring of P^n. Then we check for smoothness of the projected curve. We might be unluck that the projection introduces a singularity as in the example of i17-o19 below. Example kk=ZZ/101;S=kk[x_0..x_2]; C=ideal(x_0^2,x_0*x_1);isSmoothCurve C C=ideal(x_0*x_2^2-x_1^3);isSmoothCurve C S=kk[x_0..x_3]; C=intersect(ideal(x_0,x_1), ideal( x_1,x_2,x_3)) isSmoothCurve C C=ideal(x_0,x_1*x_2);isSmoothCurve C S=kk[x_0..x_4] C=ideal(x_0,x_1,x_2*x_3);isSmoothCurve C C=ideal(x_4,x_1,x_2*x_3);isSmoothCurve C m=matrix{{x_0,x_4,x_2,x_3},{x_4,x_2,x_3,x_1}} C=minors(2,m);isSmoothCurve C -- only the projected curve is singular C=minors(2,random(S^2,S^{4:-1}));isSmoothCurve C /// doc /// Key tangentKernelDimension (tangentKernelDimension,Module,Matrix) Headline compute the dimension of the kernel of the tangent map Usage tangentKernelDimension(N,M0) Inputs N: Module M0: Matrix Outputs : ZZ the dimension of the kernel of the natural map Ext_X^1(N,N)_0 -> Ext_X^1(M,M)_0 Description Text The module M =coker M_0 is a syzygy module of N over the coordinate ring of a cubic hypersurface. Using some exact sequences we compute the kernel of map from the firt order deformation space of N as an S_X module and to the first order deformations of M. Example kk=ZZ/10007 S=kk[x_0..x_4] N=constructEx1(S); (M0,M1) = matrixFactorizationFromModule(N); time cd=tangentKernelDimension(N,M0) /// doc /// Key MCMapproximation (MCMapproximation,Module) Headline compute the MCM approximation Usage M=MCMapproximation(N) Inputs N: Module an arbitrary module over an hypersurface ring Outputs phi: Matrix a map phi: M-> N, where M is the MCM approximation. Description Text The MCM approximation $ M=M'\oplus F $ of the module N is upto twist a sufficientls high even syzygy module M' of N plus possibly a free summand F together with an epimorphism $\phi: M -> N$. The kernel P in the short exact sequence $$ 0 \to P \to M \to N \to 0$$ has finite projective dimension. Current implementation works only in case no free summand is needed. Example kk=ZZ/10007;S=kk[x_0..x_4] N=constructEx1(S);E=annihilator N; X=ideal(gens E*random(source gens E,S^{ -3}));SX=S/X; NX=N**SX; phi=MCMapproximation NX; M=source phi; P=ker phi; betti res NX betti res M betti res P /// doc /// Key constructEx1 (constructEx1,PolynomialRing) Headline randomly choose a module N with Betti table as indicated in o4 below Usage constructEx1(S) Inputs S: PolynomialRing coordinate ring of P^4 Outputs : Module an S-module with desired betti numbers Description Text We follow the construction of an element of the family from Thm 4.1 as explained in @ HREF("http://arxiv.org/abs/1311.6962","Matrix factorizations and families of curves of genus 15") @ Example kk=ZZ/10007;S=kk[x_0..x_4] N=constructEx1(S); betti res N (M0,M1)=matrixFactorizationFromModule(N); tangentKernelDimension(N,M0)==3 /// doc /// Key constructEx2 (constructEx2,PolynomialRing) Headline randomly choose a module N with Betti table as indicated in o4 below Usage constructEx2(S) Inputs S: PolynomialRing coordinate ring of P^4 Outputs : Module an S-module with desired betti numbers Description Text We follow the construction of an elemnt of the family Thm 4.3 as explained in @ HREF("http://arxiv.org/abs/1311.6962","Matrix factorizations and families of curves of genus 15") @ Example kk=ZZ/10007;S=kk[x_0..x_4] N=constructEx2(S); betti res N (M0,M1)=matrixFactorizationFromModule(N); tangentKernelDimension(N,M0)==6 /// doc /// Key constructEx3 (constructEx3,PolynomialRing) Headline randomly choose a module N with Betti table as indicated in o4 below Usage constructEx3(S) Inputs S: PolynomialRing coordinate ring of P^4 Outputs : Module an S-module with desired betti numbers Description Text We follow the construction of an element of the family from Prop 4.4 as explained in @ HREF("http://arxiv.org/abs/1311.6962","Matrix factorizations and families of curves of genus 15") @ Example kk=ZZ/10007;S=kk[x_0..x_4] N=constructEx3(S); betti res N (M0,M1)=matrixFactorizationFromModule(N); tangentKernelDimension(N,M0)==3 /// doc /// Key constructEx4 (constructEx4,PolynomialRing) Headline randomly choose a module N with Betti table as indicated in o4 below Usage constructEx4(S) Inputs S: PolynomialRing coordinate ring of P^4 Outputs : Module an S-module with desired betti numbers Description Text We follow the random construction of an element of the family from Thm 4.6 as explained in @ HREF("http://arxiv.org/abs/1311.6962","Matrix factorizations and families of curves of genus 15") @ Example kk=ZZ/10007;S=kk[x_0..x_4] N=constructEx4(S); betti res N (M0,M1)=matrixFactorizationFromModule(N); tangentKernelDimension(N,M0)==0 /// doc /// Key constructEx5 (constructEx5,PolynomialRing) (constructEx5,PolynomialRing,List) (constructEx5,PolynomialRing,ZZ) Headline randomly choose a module N with Betti table as indicated in o4 below Usage constructEx5(S) constructEx5(S,L) constructEx5(S,gE) Inputs S: PolynomialRing coordinate ring of P^4, and possibly L: List a list of pairs (d,g) of degree and genera of the components of a reducible reduced curve of degree 4, or gE: ZZ the genus of the desired auxiliar curve, gE=14 or gE=15. Outputs : Module an S-module with desired betti numbers Description Text We follow the random construction of an element of the family from Thm 4.7 or Thm 4.8 as explained in @ HREF("http://arxiv.org/abs/1311.6962","Matrix factorizations and families of curves of genus 15") @ Example kk=ZZ/10007;S=kk[x_0..x_4]; N=constructEx5(S); betti res N E=annihilator N; (degree E,genus E)==(14,15) (M0,M1)=matrixFactorizationFromModule(N); tangentKernelDimension(N,M0)==6 betti res annihilator N Example N=constructEx5(S,{(4,1)}); betti res N E=annihilator N; (degree E,genus E)==(14,16) (M0,M1)=matrixFactorizationFromModule(N); tangentKernelDimension(N,M0)==10 betti res annihilator N Example N=constructEx5(S,14); betti res N E=annihilator N; (degree E,genus E)==(14,14) (M0,M1)=matrixFactorizationFromModule(N); tangentKernelDimension(N,M0)==4 betti res annihilator N /// doc /// Key constructEx6 (constructEx6,PolynomialRing) (constructEx6,PolynomialRing,List) (constructEx6,PolynomialRing,ZZ) Headline randomly choose a module N with Betti table as indicated in o4 below Usage constructEx6(S) ConstructEx6(S,L) ConstructEx6(S,gE) Inputs S: PolynomialRing coordinate ring of P^4, and possibly L: List a list of pairs (d,g) of degree and genera of the components of a reducible reduced curve of degree 4, or gE: ZZ the genus of the desired auxiliar curve, gE=14 or gE=15. Outputs : Module an S-module with desired betti numbers Description Text We follow the random construction of an element of the family from Thm 4.9 and 4.10 as explained in @ HREF("http://arxiv.org/abs/1311.6962","Matrix factorizations and families of curves of genus 15") @ Example kk=ZZ/10007;S=kk[x_0..x_4]; N=constructEx6(S); betti res N (M0,M1)=matrixFactorizationFromModule(N); tangentKernelDimension(N,M0)==7 Example N=constructEx6(S,{(4,1)}); betti res N (M0,M1)=matrixFactorizationFromModule(N); tangentKernelDimension(N,M0)==9 Example N=constructEx6(S,14); betti res N E=annihilator N; (degree E,genus E)==(14,14) (M0,M1)=matrixFactorizationFromModule(N); tangentKernelDimension(N,M0)==3 betti res E /// doc /// Key randomCurveOfGenus15 (randomCurveOfGenus15,PolynomialRing) Headline choose randomly a curve of genus 15 Usage randomCurveOfGenus15(S) Inputs S: PolynomialRing coordinate ring of P^4 over a finite prime field kk Outputs : Ideal of curve of genus 15 and degree 16 in P^4 Description Text Theorem 0.4 of @ HREF("http://arxiv.org/abs/1311.6962","Matrix Factorizations and families of curves of genus 15") @ descibes a dominant construction of curves of genus 15. The only non-unirational step is the choice of 6 points on a auxiliar curve E of genus 11, which actually is a Chang-Ran curve of degree 12 in P^3. We choose these points by decomposing a random hyperplane section into its irreducible components over kk. In about 63% of the cases, the hyperplane section contains a kk-rational point. Text If $B \to M^4_{15,16} \to M_{15}$ denotes the map from our construction space $B$ to $ M^4_{15,16}\ =\{ (C,L)\mid C \in M_{15}, L \in W^4_{16} \subset Pic^{16}(C) \}$ to the moduli space, then both maps are generically finite and we expect to cover about 0.63^2=0.39 percent of the kk-rational points $M_{15}(kk)$. There is no rigerous proof of this percentages given in the paper. Section 2 of @ HREF("http://arxiv.org/abs/1212.1841","Twenty points in P^3") @ contains a discussion of similar matters. Text For very small fields the auxiliar curve might not have enough kk-rational points. In that case the program might run into an infinite loop. However some printing will done for the various steps. "Rao" means that the random construction of the Hartshorne-Rao module of E in P^3 has to be repeated "E" means that the construction of E from the Hartshorne-Rao module has to be repeated "6 points" means that the selection of 6 distinct kk-rational points on E has to be repeated "matrixFactorizationFromModule" means that we fail at the step from N to the matrix factorization (M0,M1) "curveFromMatrixFactorization" means that we fail at the stage from (M0,M1) to C in sense that the curve has not the right dimension, degree or genus. In case of certify=>true we check for smoothness. "singular curve" means that we have to repeat the construction to get a smooth curve. We do this at most k times if attempts=>k. If we fail every time we return null. The default values of the options are certify=>true and attempts=>1. In a future release we will improve the construction of the 6 points to cover also very small fields. Example kk=ZZ/10007; S=kk[x_0..x_4] time C=randomCurveOfGenus15(S,certify=>false,attempts=>1); time (isSmoothCurve C, degree C, genus C)==(true,16,15) time C=randomCurveOfGenus15(S,certify=>true,attempts=>1); /// doc /// Key certify Headline optional argument in randomCurvesOfGenus15 Usage C=randomCurveOfGenus15(S,certify=>true) Description Text if certify==true then we check that the result C is the ideal of a smooth curve of desired degree and genus. Note that by construction $H^1(I_C)=0$, so the curve is connected. /// doc /// Key attempts Headline optional argument in randomCurvesOfGenus15 Usage C=randomCurveOfGenus15(S,attempts=>k) Description Text if attempts => k then we try k times to get a smooth curve. The default value is attempts=>1. /// doc /// Key BSCandidates (BSCandidates,BettiTally,ZZ) Headline compute Boij-Soederberg points in the cone of resolution which could lead to the given a matrix factorization Usage BSCandidates(beta,d) Inputs beta: BettiTally of a matrix factorization of hypersurface in P^4 d: ZZ degree of the hypersurface Outputs : List a list of Betti Tallies of hypothetical resolutions of modules Description Text Given the shape of the desired matrix facorization, we compute a list of hypothetical resolutions, which could lead to such a matrix factorization, as all integral points in the Boij-Soederberg cone. Example kk=ZZ/10007;S=kk[x_0..x_4]; beta=betti random(S^3,S^{3:-1}) BSCandidates(beta,3) beta=betti random(S^9,S^{9:-1}) cands=BSCandidates(beta,3) apply(select(cands,b->codim b>2),b->(codim b,degree b, betti b)) /// doc /// Key allCandidates (allCandidates,ZZ) Headline compute the 39 integral points in the Boij-Soederberg Usage allCandidates(0) allCandidates(15) Inputs : ZZ an integer = 0 or 15 Outputs : List the list of 39 Betti Tallies of hypothetical resolutions as in Propostion 3.1 of @ HREF("http://arxiv.org/abs/1311.6962","Matrix Factorizations and families of curves of genus 15") @ Description Text We compute all points in the Boij-Soederberg cone of resolution which would minimally lead to matrix factorization of format the (18x(15+3), (15+3)x18 of a cubic in P^4, its tranposed, its syzygy or the transpose of its syzygy. This trivial but lengthly computation takes a lot of time. The version allCandidates(0) reproduces a pre-calculated list. Example cands=allCandidates(0);#cands tally apply(cands,b->codim b) cands1=reverse apply(cands,b-> (degree b, b)); netList apply(13,i->apply(3,j->cands1_(j+3*i))) /// doc /// Key verifyAllAssertionsOfThePaper Headline print commands to verfy the assertions of the paper Usage verifyAllAssertionsOfThePaper Description Text Prints the commands needed to verify the assertions made in the paper @ HREF("http://arxiv.org/abs/1311.6962","Matrix Factorizations and families of curves of genus 15") @. Now (perhaps with copy and paste), you could run them. Example verifyAllAssertionsOfThePaper() /// end --%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% --%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% restart uninstallPackage("MatFac15") installPackage("MatFac15") viewHelp MatFac15 loadPackage("MatFac15") verifyAllAssertionsOfThePaper()