1#############################################################################
2##
3#W  good-semigroups.gd           Manuel Delgado <mdelgado@fc.up.pt>
4#W                          Pedro A. Garcia-Sanchez <pedro@ugr.es>
5##
6#Y  Copyright 2016-- Centro de Matemática da Universidade do Porto, Portugal and IEMath-GR, Universidad de Granada, Spain
7#############################################################################
8
9#############################################################################
10##
11#R  IsGoodSemigroupRep
12##
13##  The representation of a good  semigroup.
14##
15#############################################################################
16DeclareRepresentation( "IsGoodSemigroupRep", IsAttributeStoringRep, [] );
17
18#############################################################################
19##
20#C  IsGoodSemigroup
21##
22##  The category of affine semigroups.
23##
24#############################################################################
25DeclareCategory( "IsGoodSemigroup", IsAdditiveMagma and IsGoodSemigroupRep) ;
26
27# Elements of affine semigroups are collections of integers, so affine
28# semigroups are collections of collections of integers.
29BindGlobal( "GoodSemigroupsType",
30        NewType( CollectionsFamily(CollectionsFamily(CyclotomicsFamily)),
31                IsGoodSemigroup));
32
33###################################################
34##
35#F GoodSemigroup(X)
36## define the good semigroup from the set of points G
37###################################################
38DeclareGlobalFunction("GoodSemigroup");
39
40## ATTRIBUTES ##
41##
42DeclareAttribute( "DefinedByDuplication", IsGoodSemigroup);
43DeclareSynonymAttr( "IsGoodSemigroupByDuplication", HasDefinedByDuplication);
44##
45DeclareAttribute( "DefinedByAmalgamation", IsGoodSemigroup);
46DeclareSynonymAttr( "IsGoodSemigroupByAmalgamation", HasDefinedByAmalgamation);
47##
48DeclareAttribute( "DefinedByCartesianProduct", IsGoodSemigroup);
49DeclareSynonymAttr( "IsGoodSemigroupByCartesianProduct", HasDefinedByCartesianProduct);
50##
51DeclareAttribute( "Generators", IsGoodSemigroup);
52##
53###################################################
54##
55#A MinimalGoodGenerators(M)
56#A MinimalGoodGeneratingSystemOfGoodSemigroup(M)
57## returns the unique minimal good generating of the
58## good semigroup M
59###################################################
60DeclareAttribute( "MinimalGoodGenerators", IsGoodSemigroup);
61DeclareSynonymAttr("MinimalGoodGeneratingSystemOfGoodSemigroup",MinimalGoodGenerators);
62
63##
64DeclareAttribute( "Conductor", IsGoodSemigroup);
65DeclareSynonymAttr("ConductorOfGoodSemigroup",Conductor);
66###################################################
67##
68#A SmallElements(M)
69#A SmallElementsOfGoodSemigroup(M)
70## returns de small elements of M, that is,
71## the elements below the conductor
72##################################################
73DeclareAttribute( "SmallElements", IsGoodSemigroup);
74DeclareSynonymAttr("SmallElementsOfGoodSemigroup",SmallElements);
75
76########???????????
77DeclareAttribute( "NumericalSemigroupGS", IsGoodSemigroup);
78DeclareAttribute( "NumericalSemigroupListGS", IsGoodSemigroup);
79DeclareAttribute( "IdealGS", IsGoodSemigroup);
80DeclareAttribute( "MorphismGS", IsGoodSemigroup);
81
82## OPERATIONS ##
83DeclareOperation("BelongsToGoodSemigroup",[IsHomogeneousList,IsGoodSemigroup]);
84
85## FUNCTIONS ##
86
87 ####################################################
88 ##
89 #F NumericalDublication(S,E,b)
90 ## returns 2S\cup(2E+b)
91 ####################################################
92DeclareGlobalFunction("NumericalDuplication");
93
94###################################################
95##
96#F NumericalSemigroupDuplication(S,E)
97## returns S\bowtie E
98###################################################
99DeclareGlobalFunction("NumericalSemigroupDuplication");
100
101###################################################
102##
103#F AmalgamationOfNumericalSemigroups(S,E,c)
104## returns S\bowtie^f E, f multiplication by c
105###################################################
106DeclareGlobalFunction("AmalgamationOfNumericalSemigroups");
107
108###################################################
109##
110#F CartesianProductOfNumericalSemigroups(S1,S2)
111## Computes the cartesian product of S1 and S2, which
112## is a good semigroup
113###################################################
114DeclareGlobalFunction("CartesianProductOfNumericalSemigroups");
115
116###################################################
117##
118#F RepresentsSmallElementsOfGoodSemigroup(X)
119## detects if X is a good semiring
120###################################################
121DeclareGlobalFunction("RepresentsSmallElementsOfGoodSemigroup");
122
123###############################################################
124##
125#F IsSymmetricGoodSemigroup(M)
126## Determines if M is symmetric
127###############################################################
128#DeclareGlobalFunction("IsSymmetricGoodSemigroup");
129DeclareProperty("IsSymmetricGoodSemigroup",IsGoodSemigroup);
130DeclareAttribute("IsSymmetric",IsGoodSemigroup);
131
132###############################################################
133##
134#F GoodSemigroupBySmallElements(M)
135## Constructs good semigroup from a set of small elements
136###############################################################
137DeclareGlobalFunction("GoodSemigroupBySmallElements");
138
139
140###############################################################
141##
142#F ArfGoodSemigroupClosure(M)
143## Constructs Arf good semigroup closure of M
144###############################################################
145DeclareGlobalFunction("ArfGoodSemigroupClosure");
146DeclareOperation("ArfClosure", [IsGoodSemigroup]);
147
148###############################################################
149##
150#F MaximalElementsOfGoodSemigroup(M)
151## returns the set of maximal elements of M
152###############################################################
153DeclareGlobalFunction("MaximalElementsOfGoodSemigroup");
154
155###############################################################
156##
157#F IrreducibleMaximalElementsOfGoodSemigroup(M)
158## returns the set of irreducible maximal elements of M
159###############################################################
160DeclareGlobalFunction("IrreducibleMaximalElementsOfGoodSemigroup");
161
162###############################################################
163##
164#F GoodSemigroupByMaximalElements(S1,S2,mx)
165## returns the good semigroup determined by removing from
166## S1 x S2 the set of points "above" a maximal element
167###############################################################
168DeclareGlobalFunction("GoodSemigroupByMaximalElements");
169
170#####################################################
171##
172#F ProjectionOfAGoodSemigroup:=function(S,num)
173## Given a good semigroup S it returns the num-th numerical semigroup projection
174#####################################################
175DeclareGlobalFunction("ProjectionOfGoodSemigroup");
176
177#####################################################
178##
179#F GenusOfAGoodSemigroup:=function(S)
180## Given a good semigroup S it returns its genus
181#####################################################
182DeclareGlobalFunction("GenusOfGoodSemigroup");
183DeclareAttribute( "Genus", IsGoodSemigroup);
184
185#####################################################
186##
187#F LengthOfAGoodSemigroup:=function(S)
188## Given a good semigroup S it returns its length
189#####################################################
190DeclareGlobalFunction("LengthOfGoodSemigroup");
191DeclareAttribute( "Length", IsGoodSemigroup);
192
193#####################################################
194#F AperySetOfAGoodSemigroup:=function(S)
195## Given a good semigroup S it returns a list with the elements of the Apery Set
196#####################################################
197DeclareGlobalFunction("AperySetOfGoodSemigroup");
198
199#####################################################
200#F LevelsOfTheAperySet:=function(S)
201## Given a good semigroup S it prints the number of levels and it returns a list
202# where the elements are the list of the level Apery Set
203#####################################################
204DeclareGlobalFunction("StratifiedAperySetOfGoodSemigroup");
205
206#####################################################
207#F AbsoluteIrreduciblesOfGoodSemigroup:=function(S)
208## Given a good semigroup S, the function returns the irreducible absolutes of S.
209#  These are the elements that generates S as semiring.
210#####################################################
211DeclareGlobalFunction("AbsoluteIrreduciblesOfGoodSemigroup");
212
213#####################################################
214#F TracksOfGoodSemigroup:=function(S)
215## Given a good semigroup S, the function returns the tracks of S.
216#####################################################
217DeclareGlobalFunction("TracksOfGoodSemigroup");
218
219###############################################################
220##
221#P IsLocal(S)
222## Determines if S is local
223###############################################################
224
225DeclareProperty("IsLocal",IsGoodSemigroup);
226
227
228###############################################################
229##
230#A Multiplicity(S)
231## Determines the multiplicity of S
232###############################################################
233DeclareAttribute("Multiplicity",IsGoodSemigroup);
234
235# ## FUNCTIONS ##
236
237#  ####################################################
238#  ##
239#  #F NumericalDublication(S,E,b)
240#  ## returns 2S\cup(2E+b)
241#  ####################################################
242# DeclareGlobalFunction("NumericalDuplication");
243
244# ###################################################
245# ##
246# #F SemigroupDuplication(S,E)
247# ## returns S\bowtie E
248# ###################################################
249# DeclareGlobalFunction("SemigroupDuplication");
250
251# ###################################################
252# ##
253# #F Amalgamation(S,E,c)
254# ## returns S\bowtie^f E, f multiplication by c
255# ###################################################
256# DeclareGlobalFunction("Amalgamation");
257
258# ###################################################
259# ##
260# #F CartesianProduct(S1,S2)
261# ## Computes the cartesian product of S1 and S2, which
262# ## is a good semigroup
263# ###################################################
264# DeclareGlobalFunction("CartesianProduct");
265
266# ###################################################
267# ##
268# #F RepresentsSmallElementsOfGoodSemigroup(X)
269# ## detects if X is a good semiring
270# ###################################################
271# DeclareGlobalFunction("RepresentsSmallElementsOfGoodSemigroup");
272
273
274
275
276
277
278
279
280
281# #############
282
283# DeclareAttribute( "DefinedByDuplication", IsGoodSemigroup);
284# DeclareAttribute( "DefinedByAmalgamation", IsGoodSemigroup);
285# DeclareAttribute( "DefinedByCartesianProduct", IsGoodSemigroup);
286# DeclareAttribute( "NumericalSemigroupGS", IsGoodSemigroup);
287# DeclareAttribute( "NumericalSemigroupListGS", IsGoodSemigroup);
288# DeclareAttribute( "IdealGS", IsGoodSemigroup);
289# DeclareAttribute( "MorphismGS", IsGoodSemigroup);
290# DeclareAttribute( "GeneratorsGS", IsGoodSemigroup);
291# DeclareAttribute( "Conductor", IsGoodSemigroup);
292
293# DeclareSynonymAttr( "IsGoodSemigroupByAmalgamation", HasDefinedByAmalgamation);
294# DeclareSynonymAttr( "IsGoodSemigroupByDuplication", HasDefinedByDuplication);
295# DeclareSynonymAttr( "IsGoodSemigroupByCartesianProduct", HasDefinedByCartesianProduct);
296
297# DeclareOperation("BelongsToGoodSemigroup",[IsHomogeneousList,IsGoodSemigroup]);
298
299
300#  ####################################################
301#  ##
302#  #F NumericalDublication(S,E,b)
303#  ## returns 2S\cup(2E+b)
304#  ####################################################
305# DeclareGlobalFunction("NumericalDuplication");
306
307# ###################################################
308# ##
309# #F SemigroupDuplication(S,E)
310# ## returns S\bowtie E
311# ###################################################
312# DeclareGlobalFunction("SemigroupDuplication");
313
314# ###################################################
315# ##
316# #F Amalgamation(S,E,c)
317# ## returns S\bowtie^f E, f multiplication by c
318# ###################################################
319# DeclareGlobalFunction("Amalgamation");
320
321# ###################################################
322# ##
323# #F CartesianProduct(S1,S2)
324# ## Computes the cartesian product of S1 and S2, which
325# ## is a good semigroup
326# ###################################################
327# DeclareGlobalFunction("CartesianProduct");
328
329# ###################################################
330# ##
331# #F RepresentsSmallElementsOfGoodSemigroup(X)
332# ## detects if X is a good semiring
333# ###################################################
334# DeclareGlobalFunction("RepresentsSmallElementsOfGoodSemigroup");
335
336# ###################################################
337# ##
338# #F GoodSemigroup(X)
339# ## define the good semigroup from the set of points G
340# ###################################################
341# DeclareGlobalFunction("GoodSemigroup");
342
343# ###################################################
344# ##
345# #A SmallElements(M)
346# #A SmallElementsOfGoodSemigroup(M)
347# ## returns de small elements of M, that is,
348# ## the elements below the conductor
349# ##################################################
350# DeclareAttribute( "SmallElements", IsGoodSemigroup);
351# DeclareSynonymAttr("SmallElementsOfGoodSemigroup",SmallElements);
352
353
354
355
356
357
358
359
360
361# #############
362
363# DeclareAttribute( "DefinedByDuplication", IsGoodSemigroup);
364# DeclareAttribute( "DefinedByAmalgamation", IsGoodSemigroup);
365# DeclareAttribute( "DefinedByCartesianProduct", IsGoodSemigroup);
366# DeclareAttribute( "NumericalSemigroupGS", IsGoodSemigroup);
367# DeclareAttribute( "NumericalSemigroupListGS", IsGoodSemigroup);
368# DeclareAttribute( "IdealGS", IsGoodSemigroup);
369# DeclareAttribute( "MorphismGS", IsGoodSemigroup);
370# DeclareAttribute( "GeneratorsGS", IsGoodSemigroup);
371# DeclareAttribute( "Conductor", IsGoodSemigroup);
372
373# DeclareSynonymAttr( "IsGoodSemigroupByAmalgamation", HasDefinedByAmalgamation);
374# DeclareSynonymAttr( "IsGoodSemigroupByDuplication", HasDefinedByDuplication);
375# DeclareSynonymAttr( "IsGoodSemigroupByCartesianProduct", HasDefinedByCartesianProduct);
376
377# DeclareOperation("BelongsToGoodSemigroup",[IsHomogeneousList,IsGoodSemigroup]);
378
379
380#  ####################################################
381#  ##
382#  #F NumericalDublication(S,E,b)
383#  ## returns 2S\cup(2E+b)
384#  ####################################################
385# DeclareGlobalFunction("NumericalDuplication");
386
387# ###################################################
388# ##
389# #F SemigroupDuplication(S,E)
390# ## returns S\bowtie E
391# ###################################################
392# DeclareGlobalFunction("SemigroupDuplication");
393
394# ###################################################
395# ##
396# #F Amalgamation(S,E,c)
397# ## returns S\bowtie^f E, f multiplication by c
398# ###################################################
399# DeclareGlobalFunction("Amalgamation");
400
401# ###################################################
402# ##
403# #F CartesianProduct(S1,S2)
404# ## Computes the cartesian product of S1 and S2, which
405# ## is a good semigroup
406# ###################################################
407# DeclareGlobalFunction("CartesianProduct");
408
409# ###################################################
410# ##
411# #F RepresentsSmallElementsOfGoodSemigroup(X)
412# ## detects if X is a good semiring
413# ###################################################
414# DeclareGlobalFunction("RepresentsSmallElementsOfGoodSemigroup");
415
416# ###################################################
417# ##
418# #F GoodSemigroup(X)
419# ## define the good semigroup from the set of points G
420# ###################################################
421# DeclareGlobalFunction("GoodSemigroup");
422
423# ###################################################
424# ##
425# #A SmallElements(M)
426# #A SmallElementsOfGoodSemigroup(M)
427# ## returns de small elements of M, that is,
428# ## the elements below the conductor
429# ##################################################
430# DeclareAttribute( "SmallElements", IsGoodSemigroup);
431# DeclareSynonymAttr("SmallElementsOfGoodSemigroup",SmallElements);
432
433
434# ###############################################################
435# ##
436# #F IsSymmetricGoodSemigroup(M)
437# ## Determines if M is symmetric
438# ###############################################################
439# DeclareGlobalFunction("IsSymmetricGoodSemigroup");
440
441# ###################################################
442# ##
443# #F MinimalGoodGeneratingSystemOfGoodSemigroup(M)
444# ## returns the unique minimal good generating of the
445# ## good semigroup M
446# ###################################################
447# DeclareGlobalFunction("MinimalGoodGeneratingSystemOfGoodSemigroup");
448
449