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