1#############################################################################
2##
3#W  affine-def.gd           Manuel Delgado <mdelgado@fc.up.pt>
4#W                          Pedro A. Garcia-Sanchez <pedro@ugr.es>
5##
6#Y  Copyright 2015-- Centro de Matemática da Universidade do Porto, Portugal and Universidad de Granada, Spain
7#############################################################################
8
9#############################################################################
10##
11#R  IsAffineSemigroupRep
12##
13##  The representation of an affine semigroup.
14##
15#############################################################################
16DeclareRepresentation( "IsAffineSemigroupRep", IsAttributeStoringRep, [] );
17
18#############################################################################
19##
20#C  IsAffineSemigroup
21##
22##  The category of affine semigroups.
23##
24#############################################################################
25DeclareCategory( "IsAffineSemigroup", IsAdditiveMagma and IsAffineSemigroupRep) ;
26
27# Elements of affine semigroups are collections of integers, so affine
28# semigroups are collections of collections of integers.
29BindGlobal( "AffineSemigroupsType",
30        NewType( CollectionsFamily(CollectionsFamily(CyclotomicsFamily)),
31                 IsAffineSemigroup));
32
33
34#############################################################################
35##
36#F  AffineSemigroupByGenerators(arg)
37##
38##  Returns the affine semigroup generated by arg.
39##
40#############################################################################
41DeclareGlobalFunction( "AffineSemigroupByGenerators" );
42#A
43DeclareAttribute( "Generators", IsAffineSemigroup);
44DeclareSynonymAttr( "GeneratorsOfAffineSemigroup", Generators);
45DeclareSynonymAttr( "IsAffineSemigroupByGenerators", HasGenerators);
46#A
47DeclareAttribute( "Dimension", IsAffineSemigroup);
48DeclareSynonymAttr( "DimensionOfAffineSemigroup", Dimension);
49
50#############################################################################
51##
52#F  AffineSemigroupByMinimalGenerators(arg)
53##
54##  Returns the affine semigroup minimally generated by arg.
55##  If the generators given are not minimal, the minimal ones
56##  are computed and used.
57##
58#############################################################################
59# DeclareGlobalFunction( "AffineSemigroupByMinimalGenerators" );
60#A
61DeclareAttribute( "MinimalGenerators", IsAffineSemigroup);
62DeclareSynonymAttr( "IsAffineSemigroupByMinimalGenerators", HasMinimalGenerators);
63
64###############################################################################
65#A PseudoFrobenius
66# The set of PseudoFrobeniusVectors
67# Works only if the affine semigroup has finitely many gaps
68###############################################################################
69DeclareAttribute("PseudoFrobenius", IsAffineSemigroup);
70
71###############################################################################
72#O SpecialGaps
73# The set of special gaps
74# Works only if the affine semigroup has finitely many gaps
75###############################################################################
76DeclareAttribute("SpecialGaps", IsAffineSemigroup);
77
78###############################################################################
79#
80# RemoveMinimalGeneratorFromAffineSemigroup(x,s)
81#
82# Compute the affine semigroup obtained by removing the minimal generator x from
83# the given affine semigroup s. If s has finite gaps, its set of gaps is setted
84#
85###############################################################################
86DeclareGlobalFunction("RemoveMinimalGeneratorFromAffineSemigroup");
87
88##############################################################################
89#
90#  AddSpecialGapOfAffineSemigroup(x,s)
91#
92# Let a an affine semigroup with finite gaps and x be a special gap of a.
93# We compute the unitary extension of a with x
94################################################################################
95DeclareGlobalFunction("AddSpecialGapOfAffineSemigroup");
96
97#############################################################################
98##
99#F  AffineSemigroupByGaps(arg)
100##
101##  Returns the affine semigroup determined by the gaps arg.
102##  If the given set is not a set of gaps, then an error is raised.
103##
104#############################################################################
105DeclareGlobalFunction( "AffineSemigroupByGaps" );
106#A
107DeclareAttribute( "Gaps", IsAffineSemigroup);
108#A
109DeclareAttribute( "Genus", IsAffineSemigroup);
110
111
112#############################################################################
113##
114#F  AffineSemigroupByMinimalGeneratorsNC(arg)
115##
116##  Returns the affine semigroup minimally generated by arg.
117##  No test is made about args' minimality.
118##
119#############################################################################
120# DeclareGlobalFunction( "AffineSemigroupByMinimalGeneratorsNC" );
121
122#############################################################################
123##
124#O  Generators(S)
125##
126##  Computes a set of generators of the affine semigroup S.
127##  If a set of generators has already been computed, this
128##  is the set returned.
129############################################################################
130#DeclareOperation("Generators",[IsAffineSemigroup]);
131# #A
132# DeclareAttribute( "Generators", IsAffineSemigroup);
133# DeclareSynonymAttr( "IsAffineSemigroupByGenerators", HasGenerators);
134
135#############################################################################
136## Full ffine semigroups
137#############################################################################
138##
139#F  AffineSemigroupByEquations(ls,md)
140##
141##  Returns the (full) affine semigroup defined by the system A X=0 mod md, where the rows
142## of A are the elements of ls.
143##
144#############################################################################
145DeclareGlobalFunction( "AffineSemigroupByEquations" );
146#A
147DeclareAttribute( "Equations", IsAffineSemigroup);
148DeclareSynonymAttr( "IsAffineSemigroupByEquations", HasEquations);
149#############################################################################
150##
151#F  AffineSemigroupByInequalities(ls)
152##
153##  Returns the (full) affine semigroup defined by the system  ls*X>=0 over the nonnegative
154## integers
155##
156#############################################################################
157DeclareGlobalFunction( "AffineSemigroupByInequalities" );
158#A
159# collission with MatricesForHomalg
160#DeclareAttribute( "Inequalities", IsAffineSemigroup);
161#DeclareSynonymAttr( "IsAffineSemigroupByInequalities", HasInequalities);
162DeclareAttribute( "AffineSemigroupInequalities", IsAffineSemigroup);
163DeclareSynonymAttr( "HasInequalities", HasAffineSemigroupInequalities);
164DeclareOperation("Inequalities", [IsAffineSemigroup and HasInequalities]);
165
166#############################################################################
167##
168#F  AffineSemigroupByPMInequality(f, b, g)
169##
170##  Returns the proportionally modular affine semigroup defined by the
171##  inequality f*x mod b <= g*x
172##
173#############################################################################
174DeclareGlobalFunction( "AffineSemigroupByPMInequality" );
175DeclareAttribute( "PMInequality", IsAffineSemigroup);
176
177#############################################################################
178##
179#F  AffineSemigroup(arg)
180##
181##  This function's first argument may be one of:
182##  "generators", "minimalgenerators",
183## : equations...
184##
185##  The following arguments must conform to the arguments of
186##  the corresponding function defined above.
187##  By default, the option "generators" is used, so,
188##  gap> AffineSemigroup([1,3],[7,2],[1,5]);
189##  <Affine semigroup in 3-dimensional space, with 3 generators>
190##
191##
192#############################################################################
193DeclareGlobalFunction( "AffineSemigroup" );
194
195
196#############################################################################
197##
198#P  IsFullAffineSemigroup(S)
199##
200##  Tests if the affine semigroup S has the property of being full.
201##
202#############################################################################
203DeclareProperty( "IsFull", IsAffineSemigroup);
204DeclareSynonymAttr("IsFullAffineSemigroup",IsFull);
205
206#############################################################################
207##
208#F AsAffineSemigroup(S)
209##
210## Takes a numerical semigroup as argument and returns it as affine semigroup
211##
212#############################################################################
213DeclareGlobalFunction("AsAffineSemigroup");
214