10 Polynomials and numerical semigroups 10.1 Generating functions or Hilbert series Let S be a numerical semigroup. The Hilbert series or generating function associated to S is H_S(x)=∑_s∈ Sx^s (actually it is the Hilbert function of the ring K[S] with K a field). See for instance [Mor14]. 10.1-1 NumericalSemigroupPolynomial NumericalSemigroupPolynomial( s, x )  function s is a numerical semigroups and x a variable (or a value to evaluate in). The output is the polynomial 1+(x-1)∑_s∈ N∖ S x^s, which equals (1-x)H_S(x).  Example  gap> x:=X(Rationals,"x");; gap> s:=NumericalSemigroup(5,7,9);; gap> NumericalSemigroupPolynomial(s,x); x^14-x^13+x^12-x^11+x^9-x^8+x^7-x^6+x^5-x+1  10.1-2 IsNumericalSemigroupPolynomial IsNumericalSemigroupPolynomial( f )  function f is a polynomial in one variable. The output is true if there exists a numerical semigroup S such that f equals (1-x)H_S(x), that is, the polynomial associated to S (false otherwise).  Example  gap> x:=X(Rationals,"x");; gap> s:=NumericalSemigroup(5,6,7,8);; gap> f:=NumericalSemigroupPolynomial(s,x); x^10-x^9+x^5-x+1 gap> IsNumericalSemigroupPolynomial(f); true  10.1-3 NumericalSemigroupFromNumericalSemigroupPolynomial NumericalSemigroupFromNumericalSemigroupPolynomial( f )  function f is a polynomial associated to a numerical semigroup (otherwise yields error). The output is the numerical semigroup S such that f equals (1-x)H_S(x).  Example  gap> x:=X(Rationals,"x");; gap> s:=NumericalSemigroup(5,6,7,8);; gap> f:=NumericalSemigroupPolynomial(s,x); x^10-x^9+x^5-x+1 gap> NumericalSemigroupFromNumericalSemigroupPolynomial(f)=s; true  10.1-4 HilbertSeriesOfNumericalSemigroup HilbertSeriesOfNumericalSemigroup( s, x )  function s is a numerical semigroup and x a variable (or a value to evaluate in). The output is the series ∑_s∈ S x^s. The series is given as a rational function.  Example  gap> x:=X(Rationals,"x");; gap> s:=NumericalSemigroup(5,7,9);; gap> HilbertSeriesOfNumericalSemigroup(s,x); (x^14-x^13+x^12-x^11+x^9-x^8+x^7-x^6+x^5-x+1)/(-x+1)  10.1-5 GraeffePolynomial GraeffePolynomial( p )  function p is a polynomial. Computes the Graeffe polynomial of p. Needed to test if p is a cyclotomic polynomial (see [BD89]).  Example  gap> x:=Indeterminate(Rationals,1);; SetName(x,"x"); gap> GraeffePolynomial(x^2-1); x^2-2*x+1  10.1-6 IsCyclotomicPolynomial IsCyclotomicPolynomial( p )  function p is a polynomial. Detects if p is a cyclotomic polynomial using the procedure given in [BD89].  Example  gap> CyclotomicPolynomial(Rationals,3); x^2+x+1 gap> IsCyclotomicPolynomial(last); true  10.1-7 IsKroneckerPolynomial IsKroneckerPolynomial( p )  function p is a polynomial. Detects if p is a Kronecker polynomial, that is, a monic polynomial with integer coefficients having all its roots in the unit circumference, or equivalently, a product of cyclotomic polynomials. The current implementation has been done with A. Herrera-Poyatos, following [BD89].  Example  gap> x:=X(Rationals,"x");; gap>  s:=NumericalSemigroup(3,5,7);; gap>  t:=NumericalSemigroup(4,6,9);; gap> p:=NumericalSemigroupPolynomial(s,x); x^5-x^4+x^3-x+1 gap> q:=NumericalSemigroupPolynomial(t,x); x^12-x^11+x^8-x^7+x^6-x^5+x^4-x+1 gap> IsKroneckerPolynomial(p); false gap> IsKroneckerPolynomial(q); true  10.1-8 IsCyclotomicNumericalSemigroup IsCyclotomicNumericalSemigroup( s )  function s is a numerical semigroup. Detects if the polynomial associated to s is a Kronecker polynomial.  Example  gap> l:=CompleteIntersectionNumericalSemigroupsWithFrobeniusNumber(21);; gap> ForAll(l,IsCyclotomicNumericalSemigroup); true  10.1-9 IsSelfReciprocalUnivariatePolynomial IsSelfReciprocalUnivariatePolynomial( p )  function p is a univariate polynomial. Detects if p is selfreciprocal. A numerical semigroup is symmetric if and only if it is selfreciprocal, [Mor14]. The current implementation is due to A. Herrera-Poyatos.  Example  gap> l:=IrreducibleNumericalSemigroupsWithFrobeniusNumber(13);; gap> x:=X(Rationals,"x");; gap> ForAll(l, s-> > IsSelfReciprocalUnivariatePolynomial(NumericalSemigroupPolynomial(s,x))); true  10.2 Semigroup of values of algebraic curves Let f(x,y)∈ K[x,y], with K an algebraically closed field of characteristic zero. Let f(x,y)=y^n+a_1(x)y^n-1+dots+a_n(x) be a nonzero polynomial of K[x][y]. After possibly a change of variables, we may assume that, that deg_x(a_i(x))le i-1 for all i∈{1,..., n}. For g∈ K[x,y] that is not a multiple of f, define mathrmint(f,g)=dim_ K frac K[x,y](f,g). If f has one place at infinity, then the set {mathrmint(f,g)∣ g∈ K[x,y]∖(f)} is a free numerical semigroup (and thus a complete intersection). 10.2-1 SemigroupOfValuesOfPlaneCurveWithSinglePlaceAtInfinity SemigroupOfValuesOfPlaneCurveWithSinglePlaceAtInfinity( f )  function f is a polynomial in the variables X(Rationals,1) and X(Rationals,2). Computes the semigroup {mathrmint(f,g)∣ g∈ K[x,y]∖(f)}, where mathrmint(f,g)=dim_ K ( K[x,y]/(f,g)). The algorithm checks if f has one place at infinity. If the extra argument "all" is given, then the output is the δ-sequence and approximate roots of f. The method is explained in [AGS16].  Example  gap> x:=Indeterminate(Rationals,1);; SetName(x,"x"); gap> y:=Indeterminate(Rationals,2);; SetName(y,"y"); gap> f:=((y^3-x^2)^2-x*y^2)^4-(y^3-x^2);; gap> SemigroupOfValuesOfPlaneCurveWithSinglePlaceAtInfinity(f,"all"); [ [ 24, 16, 28, 7 ], [ y, y^3-x^2, y^6-2*x^2*y^3+x^4-x*y^2 ] ]  10.2-2 IsDeltaSequence IsDeltaSequence( l )  function l is a list of positive integers. Assume that l equals a_0,a_1,dots,a_h. Then l is a δ-sequence if gcd(a_0,..., a_h)=1, ⟨ a_0,⋯, a_s⟩ is free, a_kD_k > a_k+1D_k+1 and a_0> a_1 > D_2 > D_3 > ... > D_h+1, where D_1=a_0, D_k=gcd(D_k-1,a_k-1). Every δ-sequence generates a numerical semigroup that is the semigroup of values of a plane curve with one place at infinity.  Example  gap> IsDeltaSequence([24,16,28,7]); true  10.2-3 DeltaSequencesWithFrobeniusNumber DeltaSequencesWithFrobeniusNumber( f )  function f is a positive integer. Computes the set of all δ-sequences generating numerical semigroups with Frobenius number f.  Example  gap> DeltaSequencesWithFrobeniusNumber(21); [ [ 8, 6, 11 ], [ 10, 4, 15 ], [ 12, 8, 6, 11 ], [ 14, 4, 11 ],  [ 15, 10, 4 ], [ 23, 2 ] ]  10.2-4 CurveAssociatedToDeltaSequence CurveAssociatedToDeltaSequence( l )  function l is a δ-sequence. Computes a curve in the variables X(Rationals,1) and X(Rationals,2) whose semigroup of values is generated by the l.  Example  gap> CurveAssociatedToDeltaSequence([24,16,28,7]); y^24-8*x^2*y^21+28*x^4*y^18-56*x^6*y^15-4*x*y^20+70*x^8*y^12+24*x^3*y^17-56*x^\ 10*y^9-60*x^5*y^14+28*x^12*y^6+80*x^7*y^11+6*x^2*y^16-8*x^14*y^3-60*x^9*y^8-24\ *x^4*y^13+x^16+24*x^11*y^5+36*x^6*y^10-4*x^13*y^2-24*x^8*y^7-4*x^3*y^12+6*x^10\ *y^4+8*x^5*y^9-4*x^7*y^6+x^4*y^8-y^3+x^2 gap> SemigroupOfValuesOfPlaneCurveWithSinglePlaceAtInfinity(last,"all"); [ [ 24, 16, 28, 7 ], [ y, y^3-x^2, y^6-2*x^2*y^3+x^4-x*y^2 ] ]  10.2-5 SemigroupOfValuesOfPlaneCurve SemigroupOfValuesOfPlaneCurve( f )  function f is a polynomial in the variables X(Rationals,1) and X(Rationals,2). The singular package is mandatory. Either by loading it prior to numerical semigroups or by using NumSgpsUseSingular(). If f is irreducible, computes the semigroup {mathrmint(f,g)∣ g∈ K[x,y]∖(f)}, where mathrmint(f,g)=dim_ K ( K[[x,y]]/(f,g)). If it has two components, the output is the value semigroup in two variables, and thus a good semigroup. If there are more components, then the output is that of semigroup in the alexpoly singular library.  Example  gap> x:=X(Rationals,"x");; y:=X(Rationals,"y");; gap> f:= y^4-2*x^3*y^2-4*x^5*y+x^6-x^7; -x^7+x^6-4*x^5*y-2*x^3*y^2+y^4 gap> SemigroupOfValuesOfPlaneCurve(f);  gap> MinimalGenerators(last); [ 4, 6, 13 ] gap> f:=(y^4-2*x^3*y^2-4*x^5*y+x^6-x^7)*(y^2-x^3);; gap> SemigroupOfValuesOfPlaneCurve(f);  gap> MinimalGenerators(last); [ [ 4, 2 ], [ 6, 3 ], [ 13, 15 ], [ 29, 13 ] ]  10.2-6 SemigroupOfValuesOfCurve_Local SemigroupOfValuesOfCurve_Local( arg )  function The function admits one or two parameters. In any case, the first is a list of polynomials pols. And the second can be the string "basis" or an integer val. If only one argument is given, the output is the semigroup of all possible orders of K[[pols]] provided that K[[x]]/K[[pols]] has finite length. If the second argument "basis" is given, then the output is a (reduced) basis of the algebra K[[pols]] such that the orders of the basis elements generate minimally the semigroup of orders of K[[pols]]. If an integer val is the second argument, then the output is a polynomial in K[[pols]] with order val (fail if there is no such polynomial, that is, val is not in the semigroup of values). The method is explained in [AGSM17].  Example  gap> x:=Indeterminate(Rationals,"x");; gap> SemigroupOfValuesOfCurve_Local([x^4,x^6+x^7,x^13]);  gap> MinimalGeneratingSystem(last); [ 4, 6, 13, 15 ] gap> SemigroupOfValuesOfCurve_Local([x^4,x^6+x^7,x^13], "basis"); [ x^4, x^7+x^6, x^13, x^15 ] gap> SemigroupOfValuesOfCurve_Local([x^4,x^6+x^7,x^13], 20); x^20  10.2-7 SemigroupOfValuesOfCurve_Global SemigroupOfValuesOfCurve_Global( arg )  function The function admits one or two parameters. In any case, the first is a list of polynomials pols. And the second can be the string "basis" or an integer val. If only one argument is given, the output is the semigroup of all possible degrees of K[pols] provided that K[x]/K[pols] has finite length. If the second argument "basis" is given, then the output is a (reduced) basis of the algebra K[pols] such that the degrees of the basis elements generate minimally the semigroup of degrees of K[pols]. If an integer val is the second argument, then the output is a polynomial in K[pols] with degree val (fail if there is no such polynomial, that is, val is not in the semigroup of values). The method is explained in [AGSM17].  Example  gap> x:=Indeterminate(Rationals,"x");; gap> SemigroupOfValuesOfCurve_Global([x^4,x^6+x^7,x^13]);  gap> MinimalGeneratingSystem(last); [ 4, 7, 13 ] gap> SemigroupOfValuesOfCurve_Global([x^4,x^6+x^7,x^13],"basis"); [ x^4, x^7+x^6, x^13 ] gap> SemigroupOfValuesOfCurve_Global([x^4,x^6+x^7,x^13],12); x^12 gap> SemigroupOfValuesOfCurve_Global([x^4,x^6+x^7,x^13],6); fail  10.2-8 GeneratorsModule_Global GeneratorsModule_Global( A, M )  function A and M are lists of polynomials in the same variable. The output is a basis of the ideal M K[A], that is, a set F such that deg(F) generates the ideal deg(M K[A]) of deg(K[A]), where deg stands for degree. The method is explained in [AAGS17].  Example  gap> t:=Indeterminate(Rationals,"t");; gap> A:=[t^6+t,t^4];; gap> M:=[t^3,t^4];; gap> GeneratorsModule_Global(A,M); [ t^3, t^4, t^5, t^6 ]  10.2-9 GeneratorsKahlerDifferentials GeneratorsKahlerDifferentials( A, M )  function A is a list of polynomials in the same variable. The output is GeneratorsModule_Global(A,M), with M the set of derivatives of the elements in A.  Example  gap> t:=Indeterminate(Rationals,"t");; gap> GeneratorsKahlerDifferentials([t^3,t^4]); [ t^2, t^3 ]  10.2-10 IsMonomialNumericalSemigroup IsMonomialNumericalSemigroup( S )  property S is a numerical semigroup. Tests whether S a monomial numerical semigroup. Let R a Noetherian ring such that K ⊆ R ⊆ K[[t]], K is a field of characteristic zero, the algebraic closure of R is K[[t]], and the conductor (R : K[[t]]) is not zero. If v : K((t))-> Z is the natural valuation for K((t)), then v(R) is a numerical semigroup. Let S be a numerical semigroup minimally generated by {n_1,...,n_e}. The semigroup ring associated to S is K[[S]]=K[[t^n_1,...,t^n_e]]. A ring is called a semigroup ring if it is of the form K[[S]], for some numerical semigroup S. We say that S is a monomial numerical semigroup if for any R as above with v(R)=S, R is a semigroup ring. See [Mic02] for details.  Example  gap> IsMonomialNumericalSemigroup(NumericalSemigroup(4,6,7)); true gap> IsMonomialNumericalSemigroup(NumericalSemigroup(4,6,11)); false