diff --git a/gap/bytable.gi b/gap/bytable.gi index a1fb785..f57efee 100644 --- a/gap/bytable.gi +++ b/gap/bytable.gi @@ -24,7 +24,31 @@ InstallMethod(IsElementwiseIdempotentTable, "for matrix", T -> ForAll([1..Length(T)], i->(T[i,i]=i)) ); +## And a general principle: collections from finite families are finite. + +InstallMethod(IsFinite, "for any collection (with a finite element family)", + [IsCollection], + function(C) + local ef; + ef := ElementsFamily(FamilyObj(C)); + if HasIsFinite(ef) and IsFinite(ef) then return true; fi; + TryNextMethod(); + return fail; +end); + + ## And now create them from multiplication tables + +#First a helper function +FiniteMagmaCreator@ := function(tbl, const, filts) + local M; + M := MagmaByMultiplicationTableCreatorNC( + T, const, filts and IsMagmaByMultiplicationTableObj); + SetIsFinite(ElementsFamily(FamilyObject(M))); + return M; +end; + + InstallGlobalFunction(LeftQuasigroupByMultiplicationTable, function(T) if not IsLeftQuasigroupTable(T) then @@ -36,8 +60,7 @@ InstallGlobalFunction(LeftQuasigroupByMultiplicationTable, end); InstallGlobalFunction(LeftQuasigroupByMultiplicationTableNC, - T -> MagmaByMultiplicationTableCreatorNC(T, LeftQuasigroupNC, - IsLeftQuotientElement and IsMagmaByMultiplicationTableObj) + T -> FiniteMagmaCreator@(T, LeftQuasigroupNC, IsLeftQuotientElement) ); InstallGlobalFunction(RightQuasigroupByMultiplicationTable, @@ -50,8 +73,7 @@ InstallGlobalFunction(RightQuasigroupByMultiplicationTable, end); InstallGlobalFunction(RightQuasigroupByMultiplicationTableNC, - T -> MagmaByMultiplicationTableCreatorNC(T, RightQuasigroupNC, - IsRightQuotientElement and IsMagmaByMultiplicationTableObj) + T -> FiniteMagmaCreator@(T, RightQuasigroupNC, IsRightQuotientElement) ); InstallGlobalFunction(LeftRackByMultiplicationTable, @@ -68,10 +90,8 @@ InstallGlobalFunction(LeftRackByMultiplicationTable, end); InstallGlobalFunction(LeftRackByMultiplicationTableNC, - T -> MagmaByMultiplicationTableCreatorNC(T, LeftRackNC, - IsLeftQuotientElement and IsLSelfDistElement and - IsMagmaByMultiplicationTableObj - ) + T -> FiniteMagmaCreator@(T, LeftRackNC, + IsLeftQuotientElement and IsLSelfDistElement) ); InstallGlobalFunction(LeftQuandleByMultiplicationTable, @@ -89,10 +109,8 @@ InstallGlobalFunction(LeftQuandleByMultiplicationTable, end); InstallGlobalFunction(LeftQuandleByMultiplicationTableNC, - T -> MagmaByMultiplicationTableCreatorNC(T, LeftQuandleNC, - IsLeftQuotientElement and IsLSelfDistElement and IsIdempotent and - IsMagmaByMultiplicationTableObj - ) + T -> FiniteMagmaCreator@(T, LeftQuandleNC, + IsLeftQuotientElement and IsLSelfDistElement and IsIdempotent) ); InstallGlobalFunction(RightRackByMultiplicationTable, @@ -109,10 +127,8 @@ InstallGlobalFunction(RightRackByMultiplicationTable, end); InstallGlobalFunction(RightRackByMultiplicationTableNC, - T -> MagmaByMultiplicationTableCreatorNC(T, RightRackNC, - IsRightQuotientElement and IsRSelfDistElement and - IsMagmaByMultiplicationTableObj - ) + T -> FiniteMagmaCreator@(T, RightRackNC, + IsRightQuotientElement and IsRSelfDistElement) ); InstallGlobalFunction(RightQuandleByMultiplicationTable, @@ -130,10 +146,8 @@ InstallGlobalFunction(RightQuandleByMultiplicationTable, end); InstallGlobalFunction(RightQuandleByMultiplicationTableNC, - T -> MagmaByMultiplicationTableCreatorNC(T, RightQuandleNC, - IsRightQuotientElement and IsRSelfDistElement and IsIdempotent and - IsMagmaByMultiplicationTableObj - ) + T -> FiniteMagmaCreator@(T, RightQuandleNC, + IsRightQuotientElement and IsRSelfDistElement and IsIdempotent) ); ## And define the operations