diff --git a/M2/Macaulay2/packages/=distributed-packages b/M2/Macaulay2/packages/=distributed-packages
index 87bc0f8ed10..41d18c5bd7e 100644
--- a/M2/Macaulay2/packages/=distributed-packages
+++ b/M2/Macaulay2/packages/=distributed-packages
@@ -250,3 +250,4 @@ JSON
ForeignFunctions
GeometricDecomposability
PseudomonomialPrimaryDecomposition
+PolyominoIdeals
diff --git a/M2/Macaulay2/packages/PolyominoIdeals.m2 b/M2/Macaulay2/packages/PolyominoIdeals.m2
new file mode 100644
index 00000000000..7d2550682d6
--- /dev/null
+++ b/M2/Macaulay2/packages/PolyominoIdeals.m2
@@ -0,0 +1,751 @@
+newPackage(
+ "PolyominoIdeals",
+ Version => "1.0",
+ Date => "December 22, 2022",
+
+ Authors => {
+ {
+ Name => "Carmelo Cisto",
+ Email => "ccisto@unime.it"
+ },
+ {
+ Name => "Francesco Navarra",
+ Email => "fnavarra@unime.it"
+ },
+ {
+ Name => "Rizwan Jahangir",
+ Email => "rizwan@sabanciuniv.edu",
+ HomePage => "https://myweb.sabanciuniv.edu/rizwan"
+ }
+ },
+ Headline => "binomial ideals of collections of cells",
+ Keywords => {"Binomial Ideals", "Inner 2-minor Ideals", "Polyomino Ideals"},
+ DebuggingMode => false,
+ Reload => true
+)
+
+export {
+ "polyoIdeal",
+ "polyoMatrix",
+ "polyoToric",
+
+ --options
+ "Field",
+ "TermOrder",
+ "RingChoice"
+}
+
+--------------------------------------------------------------------------------------------------
+-- Declaration of some variables
+--------------------------------------------------------------------------------------------------
+
+x:=vars(23);
+u:=vars(20);
+v:=vars(21);
+h:=vars(7);
+
+--------------------------------------------------------------------------------------------------
+-------------------------------------- polyoVertices ---------------------------------------------
+--------------------------------------------------------------------------------------------------
+--
+-- polyoVertices is a function which computes the set of the vertices of the collection of cells.
+--
+-- A collection of cells is encoded here by a list Q, whose elements are the lists of the
+-- diagonal corners of the cells.
+--
+-- For instance:
+--
+-- __
+-- __|__|
+-- __|__|
+-- |__|__| is encoded as Q={{{1,1},{2,2}},{{2,1},{3,2}},{{2,2},{3,3}},{{3,3},{4,4}}}
+--
+--------------------------------------------------------------------------------------------------
+
+polyoVertices=(Q)->(
+ for i from 0 to #Q-1 do(
+ if Q#i#1-Q#i#0 != {1,1} then error "The input list does not represent a collection of cells"
+ );
+ V:={};
+ for i from 0 to #Q-1 do(
+ V=join(V,toList ({Q#i#0#0,Q#i#0#1}..{Q#i#1#0,Q#i#1#1}));
+ );
+ V=set V;
+ V=toList(V);
+
+ return V;
+);
+
+
+--------------------------------------------------------------------------------------------------
+--------------------------------------- polyoRingDefault -----------------------------------------
+--------------------------------------------------------------------------------------------------
+--
+-- The function polyoRing defines the ring attached to a collection of cells, where the monomial
+-- order is given by the order defined in the option Term order, induced by the following order of
+-- the variables: x_a > x_b with a=(i,j) and b=(k,l), if i > k, or i = k and j > l.
+--
+--------------------------------------------------------------------------------------------------
+
+polyoRingDefault = method (Options=>{Field => QQ, TermOrder=>Lex})
+polyoRingDefault List := opts -> Q -> (
+
+ V:=reverse(sort(polyoVertices(Q)));
+ Gen:={};
+ for i from 0 to #V-1 do(
+ Gen=join(Gen,{x_(V#i#0,V#i#1)});
+ );
+ R:=(opts.Field)[Gen, MonomialOrder => opts.TermOrder];
+ return R;
+);
+
+
+--------------------------------------------------------------------------------------------------
+------------------------------------------ polyoMatrix -------------------------------------------
+--------------------------------------------------------------------------------------------------
+--
+-- The function polyoMatrix define the matrix attached to a collection of cells P, where the
+-- smallest intervall containing it is [(p,q),(r,s)]. The matrix has r-p rows and s-q columns
+-- and the (i,j)-th entry is x_(i,j) if (i,j) is a vertex of P, otherwise it is zero.
+--
+--------------------------------------------------------------------------------------------------
+
+-- Define two functions to compute p,q,r and s from the list Q enconding the collection of cells.
+-- The function Mv(Q) computes the list {p,r}:
+
+Mv=(Q)->(
+ V:={};
+ for i from 0 to #Q-1 do(
+ V=join(V,toList{Q#i#1#1});
+ );
+ return toList{min(V)-1,max(V)};
+ );
+
+-- The function Mh(Q) computes the list {q,s}:
+
+Mh=(Q)->(
+ V:={};
+ for i from 0 to #Q-1 do(
+ V=join(V,toList{Q#i#1#0});
+ );
+ return toList{min(V)-1,max(V)};
+ );
+
+-- Define the function polyoMatrix, to compute the matrix.
+
+polyoMatrix = method(TypicalValue=>Matrix)
+polyoMatrix List := Q ->(
+ R:=polyoRing(Q);
+ V:=polyoVertices(Q);
+ Corners:={};
+ for i from 0 to #V-1 do(
+ Corners=join(Corners,{(V#i#0,V#i#1)});
+ );
+ H:={};
+ Verti:=Mv(Q);
+ Orizon:=Mh(Q);
+ for j from Verti#0 to Verti#1 do(
+ L:={};
+ for i from Orizon#0 to Orizon#1 do(
+ if member((i,j),Corners) then
+ L=join(L,toList{x_(i,j)_R})
+ else L=join(L,{0});
+ );
+ H=append(H,L);
+ );
+ H=reverse(H);
+ return matrix(H);
+);
+
+
+------------------------------------------------------------------------------------------------------
+-------------------------------------------- polyoRingConvex -----------------------------------------
+------------------------------------------------------------------------------------------------------
+--
+-- The function polyoRingConvex returns the polynomial ring of a collection of cells P with a new
+-- monomial order. In particular, if P is a weakly connected and convex collections of cells then
+-- polyoRingConvex defines a polynomial ring in which the monomial order is defined as in the paper:
+-- H. Ohsugi and T. Hibi, "Koszul bipartite graphs ", Adv. Appl. Math. 22, 25-28, 1999.
+-- We know that the generators of the binomial ideal associated with a weakly connected and
+-- convex collections of cells forms the reduced Groebner basis with respect to this order, and
+-- so the initial ideal is squarefree and generated in degree two.
+-----------------------------------------------------------------------------------------------------
+
+
+-- vectorLessEqThan is a baby function which compares two vectors in N^d, defining A < B if the
+-- rightmost nonzero component of the vector A â B is negative.
+
+vectorLessEqThan=(A,B)->(
+ Ar:=reverse(A);
+ Br:=reverse(B);
+ if Ar==Br then return true else
+ for i from 0 to #A-1 do(
+ if Ar#i
Br#i then break return false;
+ );
+);
+
+-- Sub1 is a baby function which replaces 1 in the non-null entries of a generic vector.
+
+Sub1:=(M)->(
+ N:={};
+ for i from 0 to #M-1 do(
+ if M#i!=0 then N=join(N,{1})
+ else N=join(N,{0});
+ );
+ return N;
+);
+
+-- polyoMatrixReduced is a function which returns a new matrix from polyoMatrix(Q) by
+-- switching rows or columns as done in the paper:
+-- H. Ohsugi and T. Hibi, "Koszul bipartite graphs ", Adv. Appl. Math. 22, 25-28, 1999.
+
+polyoMatrixReduced=(Q)->(
+ PolyominoMat:=polyoMatrix(Q);
+ EntrateMat:=entries(PolyominoMat);
+ numberrow:=numgens(target(PolyominoMat));
+ MutMat:=mutableMatrix(PolyominoMat);
+ SubEntrateMat:={};
+ for k from 0 to numberrow-1 do(
+ SubEntrateMat=join(SubEntrateMat,{Sub1(EntrateMat#k)});
+ );
+ for i from 0 to numberrow-1 do(
+ for j from i to numberrow-1 do(
+ if vectorLessEqThan(SubEntrateMat#i,SubEntrateMat#j)==false then(
+ MutMat=rowSwap(MutMat,i,j);
+ SubEntrateMat=switch(i,j,SubEntrateMat);
+ );
+ );
+ );
+ rowMutMat:=matrix(MutMat);
+ TMutMat:=transpose(rowMutMat);
+ SecondEntrateMat:=entries(TMutMat);
+ nc:=numgens(source(rowMutMat));
+ MutarowMutMat:=mutableMatrix(rowMutMat);
+ Sos:={};
+ for c from 0 to nc-1 do(
+ Sos=join(Sos,{Sub1(SecondEntrateMat#c)});
+ );
+ for a from 0 to (nc-1) do(
+ for b from a to (nc-1) do(
+ if vectorLessEqThan(Sos#a,Sos#b)==false then(
+ MutarowMutMat=columnSwap(MutarowMutMat,a,b);
+ Sos=switch(a,b,Sos);
+ );
+ );
+ );
+ return matrix(MutarowMutMat);
+);
+
+-- polyoRingConvex defines a new polynomial ring.
+
+polyoRingConvex = method(Options=>{Field => QQ})
+polyoRingConvex List := opts -> Q -> (
+ PMR:=polyoMatrixReduced(Q);
+ EPMR:=entries(PMR);
+ numRow:=numgens(target(PMR));
+ numColumn:=numgens(source(PMR));
+ variables:={};
+ for i from 0 to numRow-1 do(
+ for j from 0 to numColumn-1 do(
+ if EPMR#i#j==0 then variables=join(variables,toList{})
+ else variables=join(variables,toList{EPMR#i#j});
+ );
+ );
+ Gens:=variables;
+ S:=(opts.Field)[Gens, MonomialOrder => RevLex, Global=> false];
+ return S;
+);
+
+
+---------------------------------------------------------------------------------------------------
+---------------------------------------------polyoRing---------------------------------------------
+---------------------------------------------------------------------------------------------------
+-- The function polyoRing defines the ring for polyoIdeal. Whether it is 1 or by default it
+-- returns the ideal computed by polyoIdeal in the ambient ring given by polyoRingDefault.
+-- With a value different by 1 it returns the ideal in the ambient ring given by polyoRingConvex.
+------------------------------------------------------------------------------------------------
+
+polyoRing = method (Options=>{Field => QQ, TermOrder=>Lex, RingChoice=>1})
+polyoRing List := opts -> Q ->(
+if opts.RingChoice==1 then
+ return polyoRingDefault(Q,Field=>opts.Field, TermOrder=>opts.TermOrder)
+else return polyoRingConvex(Q,Field=>opts.Field);
+);
+
+----------------------------------------------------------------------------------------------------
+------------------------------------------ polyoIdeal ----------------------------------------------
+----------------------------------------------------------------------------------------------------
+-- polyoIdeal is a function which returns the inner 2-minor ideal attached to a collection of cells.
+--
+-- The option RingChoice with value 1 and by default returns the ideal in the ambient ring given by
+-- polyoRingDefault. With a value different by 1 it returns the ideal in the ambient ring given
+-- by polyoRingConvex
+----------------------------------------------------------------------------------------------------
+
+--isInnerInterval is a function such that, if A and B are two cells, it returns true if [A,B] is
+--an inner interval of the collection of cells, otherwise it returns false.
+
+isInnerInterval=(A,B,Q)->(
+ C:=B-{1,1};
+ if C==A then return true;
+ if member({C,B},Q)==false then return false;
+ tag:=true;
+ for i from A#1+1 to B#1 do (
+ for j from A#0 to B#0-1 do (
+ if member({{j,i-1},{j+1,i}},Q)==false then return false;
+ );
+ );
+ return tag;
+);
+
+
+
+polyoIdeal = method (Options=>{Field => QQ, TermOrder=>Lex, RingChoice=>1})
+polyoIdeal List := opts -> Q ->(
+
+R:=polyoRing(Q,Field=>opts.Field, TermOrder=>opts.TermOrder, RingChoice=>opts.RingChoice);
+InnerBinomials:={};
+ for i from 0 to #Q-1 do(
+ lLowCorner := Q#i#0;
+ for j from 0 to #Q-1 do(
+ rUpCorner := Q#j#1;
+ if lLowCorner#0(
+ if A#0<=B#0 and A#1<=B#1 then return true;
+ return false;
+);
+
+polyoToric = method(TypicalValue=>Ideal)
+polyoToric(List, List) := (Q,H) -> (
+ V:=reverse(sort(polyoVertices(Q))); --IMPORTANT:V contains the vertices Q IN THE RIGHT ORDER with f:=map(S,T,Im);
+ Oriz:={};
+ Vert:={};
+ for i from 0 to #V-1 do(
+ Oriz=join(Oriz,{V#i#0});
+ Vert=join(Vert,{V#i#1});
+ );
+ Oriz=set Oriz;
+ Oriz=toList (Oriz);
+ Oriz=sort(Oriz); --Oriz is the sorted list the first coordinates of every cell
+ Vert=set Vert;
+ Vert=toList (Vert);
+ Vert=sort(Vert); --Vert is the sorted list the second coordinates of every cell
+ VerInt:={};
+ for i from min(Oriz) to max(Oriz) do( --bulding the vertical maxiamal intervals
+ j:=min(Vert);
+ while j Lex]; -- definition of the the "toric" ring
+ Im:={}; -- images of the variables in the "toric" ring
+ for i from 0 to #V-1 do(
+ m:=1;
+ for k from 0 to #OrInt-1 do(
+ if member(V#i,OrInt#k) then m=m*u_(k)_S;
+ );
+ for k from 0 to #VerInt-1 do(
+ if member(V#i,VerInt#k) then m=m*v_(k)_S;
+ );
+ for j from 0 to #H-1 do(
+ if Leq2(V#i,H#j) then m=m*h_(j)_S;
+ );
+ Im=join(Im,{m});
+ );
+ T:=polyoRing(Q);
+ f:=map(S,T,Im); -- It is VERY IMPORTANT TO PAY ATTENTION for the order of varibles in T, with V:=reverse
+ J:= kernel f;
+ return J;
+);
+
+---------------------------------------------------------------------------------------------------------
+ -- End of source code --
+---------------------------------------------------------------------------------------------------------
+
+
+---------------------------------------------------------------------------------------------------------
+----------------------------------------- DOCUMENTATION -------------------------------------------
+---------------------------------------------------------------------------------------------------------
+
+
+beginDocumentation()
+
+document {
+ Key => PolyominoIdeals,
+ Headline => "a package to work with binomial ideals associated with collections of cells",
+ EM "PolyominoIdeals", " is a package for making several computations with the inner 2-minor ideals attached to collections of cells.\n ",
+ BR{},BR{},
+ "In [AAQ2012] Ayesha Asloob Qureshi establishes a connection between Combinatorical Commutiative Algebra and collection of cells, assigning to every collection of cells the binomial ideal of its inner $2$-minors.\n",
+ BR{},BR{},
+ " Consider the natural partial order on $\\NN^2$ and let $a,b \\in \\N^2$ with $a\\leq b$. The set $[a, b] = \\{c \\in \\NN^2 : a \\leq c \\leq b\\}$ is called an interval of $\\NN^2$; moreover, if $b=a+(1,1)$, then $[a,b]$ is called a cell of $\\NN^2$. An interval $C=[a, b]$, where $a = (i, j)$ and $b = (k, l)$, is said to be a proper interval if $i < k$ and $j < l$. The elements $a, b$ are said the diagonal corners of $C$ and $c = (k, j)$ and $d = (i, l)$ the anti-diagonal ones. If $C$ is a cell, then $V(C)=\\{a,a+(1,1),a+(0,1),a+(1,0)\\}$ is the set of the corners of $C$.\n",
+ BR{},
+ " To each collection of cells $\\mathcal{P}$, we attach an ideal $I_{\\mathcal{P}}$ as following. Let $K$ be a field and $S=K[x_a: a \\in V (\\mathcal{P})$, where $V (\\mathcal{P})$ is the union of the vertices sets of all cells of $\\mathcal{P}$. A proper interval $[a, b]$ is called an inner interval of $\\mathcal{P}$ if all cells of $[a, b]$ belong to $\\mathcal{P}$. The binomial $f= x_ax_b â x_c x_d$ , where $c$ and $d$ are the anti-diagonal corners of $[a, b]$, is called an inner 2-minor of $\\mathcal{P}$, if $[a, b]$ is an inner interval of $\\mathcal{P}$. We denote by $I_{\\mathcal{P}}$ the ideal generated in $S$ by the inner 2-minors of $\\mathcal{P}$ and by $K [\\mathcal{P}]$ the quotient ring $S/I_{\\mathcal{P}}$, called the coordinate ring of $\\mathcal{P}$.\n",
+ BR{},
+ " The class of ideals attached to a collection of cells includes, for example, the ideals of 2-minors of two-sided ladders, but it is much more general. Interesting classes of collections of cells are the so-called polyominoes that are well studied in various combinatorial contexts. A collection of cells $\\mathcal{P}$ is called a polyomino if for any two cells $A, B \\in \\mathcal{P}$ there exists a sequence of cells $A=C_1,\\dots, C_m=B$ of $\\mathcal{P}$ such that $C_i$ and $C_{i+1}$ have an edge in common. In such a case, $I_{\\mathcal{P}}$ is called polyomino ideal of $\\mathcal{P}$. \n",
+ BR{},BR{},
+ "The aim of this package is to provide several tools to help mathematicians in the study of polyomino ideals. Every contribution is very welcome. \n",
+ BR{},BR{},
+ BOLD "Literature \n",
+ UL {
+ LI {"[AAQ2012] ", EM "Ideals generated by 2-minors, collections of cells and stack polyominoes ", "(A. A. Qureshi, 2012, J. Algebra).\n"}
+ },
+
+ Subnodes => {
+ TO "polyoIdeal",
+ TO "polyoToric",
+ TO "polyoMatrix",
+ TO "Field",
+ TO "TermOrder",
+ TO "RingChoice",
+ },
+ }
+
+
+----------------------------------------------------------------------------------------------------
+-------------------------------- Documentation for exported functions ------------------------------
+----------------------------------------------------------------------------------------------------
+
+
+document {
+ Key => {polyoIdeal,(polyoIdeal, List)},
+ Headline => "Ideal of inner 2-minors of a collection of cells",
+ Usage => "polyoIdeal Q",
+ Inputs => {
+ "Q" => { "a list of lists whose elements are the lists of diagonal corners of each cell."} },
+ Outputs => { {"The inner 2-minors ideal of the collection of cells encoding by Q"} },
+
+ "Let $\\mathcal{P}$ be a collection of cells. This routine returns the ideal $I_{\\mathcal{P}}$ of the inner 2-minors of $\\mathcal{P}$.\n",
+ BR{},
+ "Moreover, if $\\mathcal{P}$ is a polyomino, then it returns the polyomino ideal of $\\mathcal{P}$.\n",
+ BR{},BR{},
+ "If Q does not encod a collection of cells, that is in a list of Q the difference between the first sublist and the second one is different from {1,1}, then we get an error.\n",
+ BR{},BR{},
+ EXAMPLE {
+ "Q={{{1,1},{2,2}},{{2,1},{3,2}},{{2,2},{3,3}}}",
+ "I = polyoIdeal Q",
+ },
+ BR{},BR{},
+ EXAMPLE {
+ "Q={{{1, 1}, {2, 2}}, {{2, 1}, {3, 2}}, {{3, 1}, {4, 2}}, {{3, 2}, {4, 3}}, {{3, 3}, {4, 4}}, {{2, 3}, {3, 4}}, {{1, 3}, {2, 4}}, {{1, 2}, {2, 3}}};",
+ "I = polyoIdeal Q",
+ },
+ }
+
+document {
+ Key => {polyoMatrix, (polyoMatrix, List)},
+ Headline => "Matrix attached to a collection of cells",
+ Usage => "polyoMatrix Q",
+ Inputs => { "Q" => "a list of lists whose elements are the lists of diagonal corners of each cell." },
+ Outputs => {"The matrix attached to the collection of cells encoding by Q."},
+ "Let $\\mathcal{P}$ be a collection of cells and $[(p,q),(r,s)]$ be the smallest intervall of $\\NN^2$ containing $\\mathcal{P}$. The matrix $M(\\mathcal{P})$ is a matrix having $s-q$ rows and $r-q$ columns with $M(\\mathcal{P})_{i,j}=x_{(i,j)}$ if $(i,j)$ is a vertex of $\\mathcal{P}$, otherwise it is zero.\n",
+ BR{},
+ "This routine returns the matrix of the collection of cells encoding by Q. In the next example we assume for simplicity that the smallest interval containing $\\mathcal{P}$ is $[(1,1),(r,s)]$.",
+ BR{},BR{},
+ EXAMPLE {
+ "Q={{{1,1},{2,2}},{{2,1},{3,2}},{{2,2},{3,3}}}",
+ "M = polyoMatrix Q",
+ },
+ BR{},BR{},
+ EXAMPLE {
+ "Q={{{1, 3}, {2, 4}}, {{2, 2}, {3, 3}}, {{3, 1}, {4, 2}}, {{2, 4}, {3, 5}}, {{3, 5}, {4, 6}}, {{4, 4}, {5, 5}}, {{5, 3}, {6, 4}}, {{4, 2}, {5, 3}}, {{6, 4}, {7, 5}}, {{5, 1}, {6, 2}}, {{7, 5}, {8, 6}}, {{7, 1}, {8, 2}}, {{4, 6}, {5, 7}}, {{5, 7}, {6, 8}}, {{6, 6}, {7, 7}}};",
+ "M = polyoMatrix Q",
+ },
+ BR{},BR{},
+ EXAMPLE {
+ "Q={{{1, 1}, {2, 2}}, {{2, 2}, {3, 3}}, {{3, 3}, {4, 4}}, {{4, 3}, {5, 4}}};",
+ "M = polyoMatrix Q",
+ }
+ }
+
+document {
+ Key => {polyoToric, (polyoToric, List, List)},
+ Headline => "Toric ideal of a polyomino",
+ Usage => "polyoToric(Q,H)",
+ Inputs => { "Q" => {"a list of lists whose elements are the lists of diagonal corners of each cell."},
+ "H" => {"a list of the lower left corners of the holes."}
+ },
+ Outputs => {"A toric ideal attached to the polyomino encoded by Q."},
+
+ "Let $\\mathcal{P}$ be a polyomino. A finite collection $\\mathcal{H}$ of cells not in $\\mathcal{P}$ is called a hole of $\\mathcal{P}$, if any two cells in $\\mathcal{H}$ are connected by a path of cells in $\\mathcal{H}$ and $\\mathcal{H}$ is maximal with respect to the set inclusion. Consider the following total order on $V(\\mathcal{P})$: $a=(i,j)>b=(k, l)$, if $i > k$, or $i = k$ and $j > l$. If $\\mathcal{H}$ is a hole of $\\mathcal{P}$, then we call lower left corner $e$ of $\\mathcal{H}$ the minimum, with respect to <, of the vertices of $\\mathcal{H}$. Let $\\mathcal{H}_1,\\dots, \\mathcal{H}_r$ be the holes of $\\mathcal{P}$ and $e_k = (i_k, j_k)$ be the lower left corner of $\\mathcal{H}_k$. For $k \\in K =[r]$, we define the following subset $F_k = \\{(i, j) \\in V (\\mathcal{P}) : i \\leq i_k, j \\leq j_k\\}$. Denote by $\\{V_i\\}_{i\\in I}$ the set of all the maximal vertical edge intervals of $\\mathcal{P}$, and by $\\{H_j \\}_{j\\in J}$ the set of all the maximal horizontal edge intervals of $\\mathcal{P}$. Let $\\{v_i\\}_{i\\in I}$, $\\{H_j\\}_{j\\in J}$ , and $\\{w_k\\}_{kâK}$ be three sets of variables. We consider the map $$\\alpha : V (\\mathcal{P}) \\rightarrow K[{h_i, v_j , w_k } : i \\in I, j \\in J, k \\in K]$$ $$a \\rightarrow \\prod_{a\\in H_i \\cap V_j} h_iv_j \\prod_{a\\in F_k} w_k$$ The toric ring $T_{\\mathcal{P}}$ associated to $\\mathcal{P}$ is defined as $T_{\\mathcal{P}} = K[\\alpha(a):a \\in V (\\mathcal{P})]$. The homomorphism $\\psi : S \\rightarrow T_{\\mathcal{P}}$ with $x_a \\rightarrow \\alpha(a)$ is surjective and the toric ideal $J_{\\mathcal{P}}$ is the kernel of $\\psi$.\n",
+ BR{},
+ "Note that the homomorphism $\\psi$ defined before is a natural generalization of that given in [QSS2017] for simple polyominoes.\n",
+ BR{},BR{},
+ "Given the polyomino encoded by Q and the list H of the lower left corners of each hole of the polyomino, the function ", TT "polyoToric", " returns the toric ideal $J_{\\mathcal{P}}$ defined before.\n",
+
+
+ BR{},BR{},
+ BOLD "Literature \n",
+ UL {
+ LI {"[QSS2017] ", EM "Simple polyominoes are prime ", "(A.A. Qureshi, T. Shibuta, A. Shikama, 2017, J. Commut. Algebra 9(3), 413-422).\n"},
+ LI {"[MRR2020] ", EM "Primality of multiply connected polyominoes ", "(C. Mascia, G. Rinaldo, F. Romeo, 2020, Illinois J. Math. 64(3), 291-304).\n"},
+ LI {"[CNU2022] ", EM "Primality of weakly connected collections of cells and weakly closed path polyominoes ", "(C. Cisto, F. Navarra, R. Utano, 2022, Illinois J. Math. 66(4), 545-563).\n"},
+ },
+
+ BR{},
+ BOLD "Examples \n",
+ BR{},BR{},
+
+ EXAMPLE {
+ "Q={{{1, 1}, {2, 2}}, {{2, 1}, {3, 2}}, {{3, 1}, {4, 2}}, {{3, 2}, {4, 3}}, {{3, 3}, {4, 4}}, {{2, 3}, {3, 4}}, {{1, 3}, {2, 4}}, {{1, 2}, {2, 3}}};",
+ "J=polyoToric(Q,{{2,2}})",
+ },
+ BR{},BR{},
+
+ EXAMPLE {
+ "Q={{{3, 1}, {4, 2}}, {{4, 1}, {5, 2}}, {{5, 1}, {6, 2}}, {{5, 2}, {6, 3}}, {{5, 3}, {6, 4}}, {{5, 4}, {6, 5}}, {{5, 5}, {6, 6}}, {{4, 5}, {5, 6}}, {{3, 2}, {4, 3}}, {{3, 3}, {4, 4}}, {{2, 3}, {3, 4}}, {{1, 3}, {2, 4}}, {{1, 4}, {2, 5}}, {{1, 5}, {2, 6}}, {{2, 5}, {3, 6}}, {{3, 5}, {4, 6}}};",
+ "I=polyoIdeal(Q);",
+ "J=polyoToric(Q,{{2,4}});",
+ "R=ring I",
+ "J=substitute(J,R);",
+ "J==I",
+ } ,
+
+ BR{},BR{},
+ "Morevover, if $\\mathcal{P}$ is a simple polyomino, that is it has not any hole, then the function ", TT "polyoToric", " works setting ", TT "H={}", " and it returns the polyomino ideal of $\\mathcal{P}$ in according to [QSS2017].\n",
+ BR{},BR{},
+ EXAMPLE {
+ "Q={{{2, 1}, {3, 2}}, {{3, 1}, {4, 2}}, {{2, 2}, {3, 3}}, {{1, 2}, {2, 3}}, {{3, 2}, {4, 3}}, {{2, 3}, {3, 4}}};",
+ "I=polyoIdeal(Q);",
+ "J=polyoToric(Q,{});",
+ "R=ring I",
+ "J=substitute(J,R);",
+ "J==I",
+ } ,
+
+ BR{},BR{},
+ "In general, the function ", TT "polyoToric", " works also for weakly connected collection of cells. If $\\mathcal{P}$ is the non-simple collections of cells in Figure (A) of the Remark 3.4 in [CNU2022], we know that the inner 2-minor ideal of $\\mathcal{P}$ is not prime.\n",
+ BR{},BR{},
+ EXAMPLE {
+ "Q={{{2, 1}, {3, 2}}, {{3, 2}, {4, 3}}, {{1, 2}, {2, 3}}, {{2, 3}, {3, 4}}};",
+ "I=polyoIdeal(Q);",
+ "J=polyoToric(Q,{{2,2}});",
+ "R=ring I",
+ "J=substitute(J,R);",
+ "J==I",
+ "select(first entries gens J,f->first degree f>=3)",
+ }
+
+ }
+
+
+
+-----------------------------------------------------------------------------------------------------
+---------------------------------------- Options documentation --------------------------------------
+-----------------------------------------------------------------------------------------------------
+
+
+document {
+ Key => {RingChoice,[polyoIdeal,RingChoice]},
+ Headline => "optional argument for polyoIdeal",
+ "Let $\\mathcal{P}$ be a collection of cells and $[(1,1),(m,n)]$ be the smallest intervall of $\\NN^2$ containing $\\mathcal{P}$. Then we attach to $\\mathcal{P}$ the following polynomial ring $S_{\\mathcal{P}}=K[x_a:a\\in V(\\mathcal{P})$, where $K$ is a field.\n",
+ BR{},
+ "Whether it is 1 or by default it returns the ideal computed by ", TT "polyoIdeal ", "in the ambient ring given by ", TT "polyoRingDefault",". With a value different by 1 it returns the ideal in the ambient ring given by ", TT "polyoRingConvex",".",
+ BR{},BR{},
+ "Here we describe the using of the two options ", TT "polyoRingDefault"," and ", TT "polyoRingConvex",".\n",
+ BR{},BR{},
+ BOLD "PolyoRingDefault \n",
+ BR{},BR{},
+ "This option gives the ideal $I_{\\mathcal{P}}$ in the polynomial ring $S_{\\mathcal{P}}$ where the monomial order is defined by ", TT "Term order ", "induced by the following order of the variables: $x_a > x_b$ with $a=(i,j)$ and $b=(k, l)$, if $i > k$, or $i = k$ and $j > l$.",
+ BR{},BR{},
+ ITALIC "Examples \n",
+ BR{},BR{},
+ EXAMPLE {
+ "Q={{{1,1},{2,2}},{{2,1},{3,2}},{{2,2},{3,3}}};",
+ "I = polyoIdeal(Q);",
+ "R=ring I;",
+ "describe R",
+ },
+ BR{},
+ EXAMPLE {
+ "Q={{{1,1},{2,2}},{{2,1},{3,2}},{{2,2},{3,3}}};",
+ "I = polyoIdeal(Q,RingChoice=>1);",
+ "R=ring I;",
+ "describe R",
+ },
+ BR{},
+ EXAMPLE {
+ "Q={{{1,1},{2,2}},{{2,1},{3,2}},{{2,2},{3,3}}};",
+ "I = polyoIdeal(Q,RingChoice=>1,TermOrder=> GRevLex);",
+ "R=ring I;",
+ "describe R",
+ },
+
+ BR{},BR{},
+ BOLD "PolyoRingConvex \n",
+ BR{},BR{},
+ "A very interesting class of collections of cells which are studied from a combinatorial point of view is given by the weakly connected and convex ones.\n",
+ BR{},
+ "Let $\\mathcal{P}$ be a collection of cells. We say that $\\mathcal{P}$ is weakly connected if for any two cells $C$ and $D$ of $\\mathcal{P}$, there exist a sequence of cells of $\\mathcal{P}$ as $C = C_1,\\dots, C_m = D$ such that $C_i \\cap C_{i+1} \\neq \\emptyset$, for $i = 1,\\dots, m â 1$. Observe trivially that every polyomino is a weakly connected collection of cells. We say that a weakly connected collection $\\mathcal{P}$ of cells is row convex, if the horizontal cell interval $[A, B]$ is contained in $\\mathcal{P}$ for any two cells $A$ and $B$ of $\\mathcal{P}$ whose lower left corners are in horizontal position. Similarly one defines column convex. Hence $\\mathcal{P}$ is called convex if it is row and column convex.\n",
+ BR{},
+ "Assume that tha smallest intervall containing $\\mathcal{P}$ is $[(1,1),(m,n)]$. Consider the edge ring $R = K[s_it_j: (i, j) \\in V (\\mathcal{P})]$ associated to the bipartite graph $G$ with vertex set $\\{s_1,\\dots, s_m\\} \\cup\\{t_1,\\dots, t_n\\}$ to $\\mathcal{P}$ such that each vertex $(i, j) \\in V (\\mathcal{P})$ determines the edge $\\{s_i,t_j \\}$ in $G$. Let $S=K[x_a:a\\in V(\\mathcal{P})$ and $\\phi : S \\rightarrow R$ be the $K$-algebra homomorphism defined by $\\phi(x_{ij} ) = s_it_j$, for all $(i, j) \\in V (\\mathcal{P})$ and set $J_\\mathcal{P} = ker(\\phi)$. From Theorem 2.1 of [AAQ2012], we know that $I_{\\mathcal{P}}=J_{\\mathcal{P}}$, if $\\mathcal{P}$ is a weakly connected and convex collection of cells. In such a case, from [OH1999] we get that the generators of $I_{\\mathcal{P}}$ forms the reduced Groebner basis with respect to a suitable order <, and in particular the initial ideal $\\mathrm{in}_<(I_{\\mathcal{P}})$ is squarefree and generated in degree two. \n",
+ BR{},
+ "Following the proof in [OH1999], this routine implements an algorithm which gives the polynomial ring where the monomial order is <.",
+ BR{},BR{},
+ "If $\\mathcal{P}$ is a weakly connected and convex collection of cells (or in particular a convex polyomino), then the function", TT " polyoRingConvex ", "returns the polynomial ring attached to $\\mathcal{P}$ whose monomial order $<$ is such that $\\mathrm{in}_<(I_{\\mathcal{P}})$ is squarefree and generated in degree two.",
+ BR{},BR{},
+ ITALIC "Literature \n",
+ UL {
+ LI {"[AAQ2012] ", EM "Ideals generated by 2-minors, collections of cells and stack polyominoes ", "(A. A. Qureshi, 2012, J. Algebra).\n"},
+ LI {"[OH1999] ", EM "Koszul bipartite graphs ", "(H. Ohsugi and T. Hibi, 1999, Adv. Appl. Math. 22, 25-28)."}
+ },
+ BR{},
+ ITALIC "Examples \n",
+ BR{},BR{},
+ EXAMPLE {
+ "Q={{{1, 2}, {2, 3}}, {{2, 2}, {3, 3}}, {{1, 3}, {2, 4}}, {{2, 3}, {3, 4}}, {{2, 4}, {3, 5}}, {{3, 2}, {4, 3}}, {{3, 1}, {4, 2}}};",
+ "I = polyoIdeal(Q,RingChoice=>2);",
+ "R=ring I;",
+ "describe R",
+ },
+
+ BR{},BR{},
+ EXAMPLE {
+ "Q={{{1, 3}, {2, 4}}, {{2, 2}, {3, 3}}, {{2, 3}, {3, 4}}, {{2, 4}, {3, 5}}, {{3, 4}, {4, 5}}, {{3, 3}, {4, 4}}, {{3, 2}, {4, 3}}, {{3, 1}, {4, 2}}, {{3, 5}, {4, 6}}, {{4, 4}, {5, 5}}, {{4, 3}, {5, 4}}, {{5, 4}, {6, 5}}};",
+ "I = polyoIdeal(Q,RingChoice=>2);",
+ "In= monomialIdeal(leadTerm(I))",
+ } ,
+
+ SeeAlso =>{polyoIdeal}
+ }
+
+
+document {
+ Key => {Field, [polyoIdeal,Field]},
+ Headline => "optional argument for polyoIdeal",
+ "Change the base field for the ambient ring of the ideal returned by ", TT "polyoIdeal", ".",
+ BR{},BR{},
+ EXAMPLE {
+ "F = GF(81,Variable=>a)",
+ "Q={{{1,1},{2,2}},{{2,1},{3,2}},{{2,2},{3,3}}};",
+ "I = polyoIdeal(Q,Field=> F,RingChoice=>1,TermOrder=> GRevLex)",
+ },
+ SeeAlso =>{polyoIdeal}
+ }
+
+document {
+ Key => {TermOrder, [polyoIdeal,TermOrder]},
+ Headline => "optional argument for polyoIdeal",
+ "Change the term order for the ambient ring returned by ", TT "polyoIdeal ", "in the case that the option ", TT "RingChoice ", "is equal to 1.",
+ BR{},
+ "This option can be used just when ", TT "RingChoice => 1.",
+ BR{},BR{},
+ EXAMPLE {
+ "Q={{{1,1},{2,2}},{{2,2},{3,3}},{{3,3},{4,4}}};",
+ "I = polyoIdeal(Q,RingChoice=>1,TermOrder=> GRevLex);",
+ "R=ring I;",
+ "describe R",
+ },
+ SeeAlso =>{polyoIdeal, RingChoice}
+ }
+
+
+--------------------------------------------------------------------------------------------------
+---------------------------------- TEST -----------------------------------------------------
+--------------------------------------------------------------------------------------------------
+
+
+
+TEST ///
+
+--polyoIdeal test
+Q={{{1, 3}, {2, 4}}, {{2, 2}, {3, 3}}, {{2, 3}, {3, 4}}, {{2, 4}, {3, 5}}, {{3, 4}, {4, 5}}, {{3, 3}, {4, 4}}, {{3, 2}, {4, 3}}, {{3, 1}, {4, 2}}, {{3, 5}, {4, 6}}, {{4, 4}, {5, 5}}, {{4, 3}, {5, 4}}, {{5, 4}, {6, 5}}};
+I = polyoIdeal Q;
+J = ideal(x_(4,2)*x_(3,1)-x_(4,1)*x_(3,2), x_(5,4)*x_(1,3)-x_(5,3)*x_(1,4), x_(4,5)*x_(2,3)-x_(4,3)*x_(2,5), x_(6,5)*x_(5,4)-x_(6,4)*x_(5,5), x_(3,4)*x_(1,3)-x_(3,3)*x_(1,4), x_(4,3)*x_(3,1)-x_(4,1)*x_(3,3), x_(4,5)*x_(2,4)-x_(4,4)*x_(2,5), x_(6,5)*x_(3,4)-x_(6,4)*x_(3,5), x_(3,3)*x_(2,2)-x_(3,2)*x_(2,3), x_(4,4)*x_(3,1)-x_(4,1)*x_(3,4), x_(4,3)*x_(3,2)-x_(4,2)*x_(3,3), x_(3,4)*x_(2,2)-x_(3,2)*x_(2,4), x_(4,5)*x_(3,1)-x_(4,1)*x_(3,5), x_(4,4)*x_(3,2)-x_(4,2)*x_(3,4), x_(5,4)*x_(2,3)-x_(5,3)*x_(2,4), x_(5,4)*x_(4,3)-x_(5,3)*x_(4,4), x_(3,4)*x_(2,3)-x_(3,3)*x_(2,4), x_(3,5)*x_(2,2)-x_(3,2)*x_(2,5), x_(4,6)*x_(3,1)-x_(4,1)*x_(3,6), x_(4,5)*x_(3,2)-x_(4,2)*x_(3,5), x_(4,4)*x_(3,3)-x_(4,3)*x_(3,4), x_(5,5)*x_(2,3)-x_(5,3)*x_(2,5), x_(5,5)*x_(4,3)-x_(5,3)*x_(4,5), x_(3,5)*x_(2,3)-x_(3,3)*x_(2,5), x_(4,6)*x_(3,2)-x_(4,2)*x_(3,6), x_(4,5)*x_(3,3)-x_(4,3)*x_(3,5), x_(5,5)*x_(2,4)-x_(5,4)*x_(2,5), x_(5,5)*x_(4,4)-x_(5,4)*x_(4,5), x_(3,5)*x_(2,4)-x_(3,4)*x_(2,5), x_(4,6)*x_(3,3)-x_(4,3)*x_(3,6), x_(4,5)*x_(3,4)-x_(4,4)*x_(3,5), x_(2,4)*x_(1,3)-x_(2,3)*x_(1,4), x_(4,4)*x_(1,3)-x_(4,3)*x_(1,4), x_(6,5)*x_(2,4)-x_(6,4)*x_(2,5), x_(4,6)*x_(3,4)-x_(4,4)*x_(3,6), x_(6,5)*x_(4,4)-x_(6,4)*x_(4,5), x_(4,3)*x_(2,2)-x_(4,2)*x_(2,3), x_(4,6)*x_(3,5)-x_(4,5)*x_(3,6), x_(5,4)*x_(3,3)-x_(5,3)*x_(3,4), x_(4,4)*x_(2,2)-x_(4,2)*x_(2,4), x_(5,5)*x_(3,3)-x_(5,3)*x_(3,5), x_(4,5)*x_(2,2)-x_(4,2)*x_(2,5), x_(4,4)*x_(2,3)-x_(4,3)*x_(2,4), x_(5,5)*x_(3,4)-x_(5,4)*x_(3,5));
+assert(I==J);
+///
+
+
+
+TEST ///
+
+--polyoMatrix test
+Q={{{3, 1}, {4, 2}}, {{4, 1}, {5, 2}}, {{5, 1}, {6, 2}}, {{5, 2}, {6, 3}}, {{5, 3}, {6, 4}}, {{5, 4}, {6, 5}}, {{5, 5}, {6, 6}}, {{4, 5}, {5, 6}}, {{3, 2}, {4, 3}}, {{3, 3}, {4, 4}}, {{2, 3}, {3, 4}}, {{1, 3}, {2, 4}}, {{1, 4}, {2, 5}}, {{1, 5}, {2, 6}}, {{2, 5}, {3, 6}}, {{3, 5}, {4, 6}}};
+M = polyoMatrix Q;
+m = matrix({{x_(1,6), x_(2,6), x_(3,6), x_(4,6), x_(5,6), x_(6,6)}, {x_(1,5), x_(2,5), x_(3,5), x_(4,5), x_(5,5), x_(6,5)}, {x_(1,4), x_(2,4), x_(3,4), x_(4,4), x_(5,4), x_(6,4)}, {x_(1,3), x_(2,3), x_(3,3), x_(4,3), x_(5,3), x_(6,3)}, {0, 0, x_(3,2), x_(4,2), x_(5,2), x_(6,2)}, {0, 0, x_(3,1), x_(4,1), x_(5,1), x_(6,1)}});
+assert(m==M);
+///
+
+
+TEST ///
+
+--polyoToric test
+Q={{{1, 1}, {2, 2}}, {{2, 1}, {3, 2}}, {{3, 1}, {4, 2}}, {{3, 2}, {4, 3}}, {{3, 3}, {4, 4}}, {{2, 3}, {3, 4}}, {{1, 3}, {2, 4}}, {{1, 2}, {2, 3}}};
+J = polyoToric(Q,{{2,2}});
+K = ideal(-x_(2,2)*x_(1,1)+x_(2,1)*x_(1,2), -x_(3,2)*x_(1,1)+x_(3,1)*x_(1,2), -x_(4,2)*x_(1,1)+x_(4,1)*x_(1,2), -x_(2,3)*x_(1,1)+x_(2,1)*x_(1,3), -x_(2,3)*x_(1,2)+x_(2,2)*x_(1,3), -x_(2,4)*x_(1,1)+x_(2,1)*x_(1,4), -x_(2,4)*x_(1,2)+x_(2,2)*x_(1,4), -x_(2,4)*x_(1,3)+x_(2,3)*x_(1,4), -x_(3,4)*x_(1,3)+x_(3,3)*x_(1,4), -x_(4,4)*x_(1,3)+x_(4,3)*x_(1,4), -x_(3,2)*x_(2,1)+x_(3,1)*x_(2,2), -x_(4,2)*x_(2,1)+x_(4,1)*x_(2,2), -x_(3,4)*x_(2,3)+x_(3,3)*x_(2,4), -x_(4,4)*x_(2,3)+x_(4,3)*x_(2,4), -x_(4,2)*x_(3,1)+x_(4,1)*x_(3,2), -x_(4,3)*x_(3,1)+x_(4,1)*x_(3,3), -x_(4,3)*x_(3,2)+x_(4,2)*x_(3,3), -x_(4,4)*x_(3,1)+x_(4,1)*x_(3,4), -x_(4,4)*x_(3,2)+x_(4,2)*x_(3,4), -x_(4,4)*x_(3,3)+x_(4,3)*x_(3,4));
+assert(K == J);
+///
+
+
+TEST ///
+
+--polyoToric with polyoIdeal test
+Q={{{1, 2}, {2, 3}}, {{2, 2}, {3, 3}}, {{1, 3}, {2, 4}}, {{2, 3}, {3, 4}}, {{2, 4}, {3, 5}}, {{3, 2}, {4, 3}}, {{3, 1}, {4, 2}}};
+I = polyoIdeal Q;
+J = polyoToric(Q,{});
+R = ring I;
+J = substitute(J,R);
+assert(I == J);
+///
+
+end