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 gap-system#2400
  • Loading branch information
fingolfin committed May 9, 2018
1 parent cf61a22 commit 9cd3d7e
Show file tree
Hide file tree
Showing 3 changed files with 58 additions and 3 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
5 changes: 3 additions & 2 deletions lib/magma.gd
Original file line number Diff line number Diff line change
Expand Up @@ -129,8 +129,9 @@ DeclareCategory( "IsMagmaWithInverses",
IsMagmaWithInversesIfNonzero
and IsMultiplicativeElementWithInverseCollection );

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

#############################################################################
##
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);
true

#
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 9cd3d7e

Please sign in to comment.