Skip to content

Commit

Permalink
Fix two bugs related to empty magmas
Browse files Browse the repository at this point in the history
First, SubadditiveMagma(a,[]) computes an empty magma, but we erroneously set
IsTrivial for it, which implies size 1. This was changed to IsEmpty.

Secondly, there was an implication from "IsFiniteOrderElementCollection and
IsMagma" to IsMagmaWithInverses. But such a collection may be empty, hence the
implication is invalid as given.

Fixes #2400
  • Loading branch information
fingolfin authored and ChrisJefferson committed May 18, 2018
1 parent 289fdda commit 2e29846
Show file tree
Hide file tree
Showing 3 changed files with 61 additions and 2 deletions.
2 changes: 1 addition & 1 deletion lib/addmagma.gi
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,7 @@ InstallGlobalFunction( SubadditiveMagmaNC, function( M, gens )
if IsEmpty( gens ) then
K:= NewType( FamilyObj(M),
IsAdditiveMagma
and IsTrivial
and IsEmpty
and IsAttributeStoringRep );
S:= Objectify( K, rec() );
SetGeneratorsOfAdditiveMagma( S, [] );
Expand Down
7 changes: 6 additions & 1 deletion lib/magma.gd
Original file line number Diff line number Diff line change
Expand Up @@ -129,8 +129,13 @@ DeclareCategory( "IsMagmaWithInverses",
IsMagmaWithInversesIfNonzero
and IsMultiplicativeElementWithInverseCollection );

# FIXME: this is wrong for empty magmas
# InstallTrueMethod( IsMagmaWithInverses,
# IsFiniteOrderElementCollection and IsMagma );

InstallTrueMethod( IsMagmaWithInverses,
IsFiniteOrderElementCollection and IsMagma );
IsFiniteOrderElementCollection and IsMagmaWithOne );


#############################################################################
##
Expand Down
54 changes: 54 additions & 0 deletions tst/testbugfix/2018-05-09-submagma.tst
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
#
# There was a bug where we marked a sub additive magma
# with empty generator list as trivial, even though it is empty.
#
# There was also a wrong implication, from "IsFiniteOrderElementCollection and
# IsMagma" to IsMagmaWithInverses. But a collection with the former filters may
# be empty, and then it isn't a IsMagmaWithInverses.
#
gap> amgm:=AdditiveMagma([0]);
<additive magma with 1 generators>
gap> Size(amgm);
1
gap> IsTrivial(amgm);
true
gap> IsEmpty(amgm);
false
gap> IsMagmaWithInverses(amgm);
false

#
gap> asub:=SubadditiveMagma(amgm, []);
<additive magma with 0 generators>
gap> Size(asub);
0
gap> IsTrivial(asub);
false
gap> IsEmpty(asub);
true
gap> IsMagmaWithInverses(asub);
false

#
gap> mgm:=Magma( () );
<commutative semigroup with 1 generator>
gap> Size(mgm);
1
gap> IsTrivial(mgm);
true
gap> IsEmpty(mgm);
false
gap> IsMagmaWithInverses(mgm);
false

#
gap> sub:=Submagma(mgm,[]);
<commutative semigroup with 0 generators>
gap> Size(sub);
0
gap> IsTrivial(sub);
false
gap> IsEmpty(sub);
true
gap> IsMagmaWithInverses(sub);
false

0 comments on commit 2e29846

Please sign in to comment.