Simple numerical semigroup
Definition
Let \(S\) be a numerical semigroup minimally generated by \(P = \{n_1, \ldots, n_e\}\) with \(n_1 < n_2 < \cdots < n_e\). For each \(i \in \{2, \ldots, e\}\), set
\[ c_i = \min \{k \in \mathbb{N} \setminus \{0\} ~ | ~ kn_i \in \langle P \setminus \{n_i\} \rangle\}. \]
It is said that \(S\) is simple if \(n_1 = (c_2 - 1) + \cdots + (c_e - 1)+1\).
Examples
\(\circ\) Let \(S = \langle 4, 5, 7 \rangle\). Then, \(5, 10 \not \in \langle 4, 7 \rangle\) and \(15 = 2 \cdot 4 + 7 \in \langle 4, 7 \rangle\), so \(c_2 = 3\). On the other hand, \(7 \not \in \langle 4, 5 \rangle\) but \(14 = 4 + 2 \cdot 5 \in \langle 4, 5 \rangle\), therefore \(c_3 = 2\). Finally, \((c_2-1) + (c_3 - 1)+1 = 4\) and \(S\) is simple.
Examples with GAP
Nowadays, there are no functions in package NumericalSgps related to simple numerical semigroup. However, given a numerical semigroup \(S\), the following function returns true if \(S\) is simple and false otherwise.
gap> IsSimpleNumericalSemigroup := function(S)
> local Min_gen, p, list_c;
> if not IsNumericalSemigroup(S) then
> Error("The argument must be a Numerical Semigroup");
> fi;
> Min_gen := MinimalGenerators(S);
> p := Length(Min_gen);
> if p = 1 then
> return false;
> fi;
> list_c := pivots(S);
> return Min_gen[1] - 1 = Sum(list_c{[2..p]} - 1);
> end;
function( S ) ... end
The function pivots
is not implemented in GAP yet, it computes the constants \(c_i\) defined above.
gap> pivots:=function(s, I...)
> local cs,msg,e,a,c,ap,i,rmsg,rs,d;
> if Length(I) = 0 then
> msg:=MinimalGenerators(s);
> elif Length(I) = 1 then
> msg:=I[1];
> else
> Error("The number of arguments must be one or two");
> fi;
> if not IsList(msg) or msg = [] then
> Error("Second argument must be an arrangement of the minimal system of generators of the first argument");
> fi;
> if not SortedList(msg) = MinimalGenerators(s) then
> Error("Second argument must be an arrangement of the minimal system of generators of the first argument");
> fi;
> e:=EmbeddingDimension(s);
> cs:=[];
> for i in [1..e] do
> a:=msg[i];
> rmsg:=Difference(msg,[a]);
> d:=Gcd(rmsg);
> rs:=NumericalSemigroup(rmsg/d);
> c:=First([2..Minimum(rmsg)], k->((k*a) mod d=0) and (k*a/d in rs));
> Add(cs,c);
> od;
> return cs;
> end;
function( s ) ... end
\(\diamond\) Let \(S = \langle 17, 21, 32 \rangle\), in GAP:
gap> S := NumericalSemigroup(17, 21, 32);
<Numerical semigroup with 3 generators>
If we use the function defined above,
gap> IsSimpleNumericalSemigroup(S);
false
Then, \(S\) is not simple.
\(\diamond\) Let \(S = \langle 13, 14, 15 \rangle\), in GAP:
gap> S := NumericalSemigroup(13, 14, 15);
<Numerical semigroup with 3 generators>
It can be proven that if \(S\) is simple, then is a numerical semigroup with Apéry set of unique expression, but the reciprocal is false.
gap> IsAperySetOfUniqueExpression(S);
true
gap> IsSimpleNumericalSemigroup(S);
false
The function IsAperySetOfUniqueExpression
is not implemented in GAP, its code is as follows.
gap> IsAperySetOfUniqueExpression := function(S)
> local w;
> if not IsNumericalSemigroup(S) then
> Error("The argument must be a Numerical Semigroup");
> fi;
> for w in AperyList(S) do
> if Length(Factorizations(w,S)) > 1 then
> return false;
> fi;
> od;
> return true;
> end;
function( S ) ... end
References
https://gap-packages.github.io/
numericalsgps
.