diff --git a/CHANGES.md b/CHANGES.md
index 52ac218..a3b7616 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -1,5 +1,14 @@
# CHANGES to the 'XModAlg' package
+## 1.25 -> 1.25dev (01/07/24)
+ * (08/07/24) renamed the actions and algebras in the tests/examples as
+ act1, act2, ,,, act6 and added direct sum operations
+ AlgebraActionOnDirectSum and DirectSumAlgebraActions
+ * (17/05/24) added operations for a module as an algebra,
+ revised XModAlgebraByModule
+ * (26/06/24) added AlgebraActionByHomomorphism,
+ changed the example of XModAlgebraByBoundaryAndAction
+
## 1.23 -> 1.25 (17/05/24)
* (17/05/24) just 5 PRs since 1.23 came out - mostly CI changes
diff --git a/PackageInfo.g b/PackageInfo.g
index f8e3417..68d12a0 100644
--- a/PackageInfo.g
+++ b/PackageInfo.g
@@ -9,7 +9,7 @@ SetPackageInfo( rec(
PackageName := "XModAlg",
Subtitle := "Crossed Modules and Cat1-Algebras",
Version := "1.25dev",
-Date := "17/06/2024", # dd/mm/yyyy format
+Date := "08/07/2024", # dd/mm/yyyy format
License := "GPL-2.0-or-later",
Persons := [
diff --git a/doc/algebra.xml b/doc/algebra.xml
index 1136ab0..b6841a9 100644
--- a/doc/algebra.xml
+++ b/doc/algebra.xml
@@ -58,14 +58,16 @@ on an ideal I of A.
A5c6 := GroupRing( GF(5), Group( (1,2,3,4,5,6) ) );;
-gap> vecA := BasisVectors( Basis( A5c6 ) );;
-gap> v := vecA[1] + vecA[3] + vecA[5];
+gap> A1 := GroupRing( GF(5), Group( (1,2,3,4,5,6) ) );;
+gap> SetName( A1, "A1" );
+gap> BA1 := BasisVectors( Basis( A1 ) );;
+gap> v := BA1[1] + BA1[3] + BA1[5];
(Z(5)^0)*()+(Z(5)^0)*(1,3,5)(2,4,6)+(Z(5)^0)*(1,5,3)(2,6,4)
-gap> I5c6 := Ideal( A5c6, [v] );;
-gap> v2 := vecA[2];
+gap> I1 := Ideal( A1, [v] );;
+gap> SetName( I1, "I1" );
+gap> v1 := BA1[2];
(Z(5)^0)*(1,2,3,4,5,6)
-gap> m2 := RegularAlgebraMultiplier( A5c6, I5c6, v2 );
+gap> m1 := RegularAlgebraMultiplier( A1, I1, v1 );
[ (Z(5)^0)*()+(Z(5)^0)*(1,3,5)(2,4,6)+(Z(5)^0)*(1,5,3)(2,6,4),
(Z(5)^0)*(1,2,3,4,5,6)+(Z(5)^0)*(1,4)(2,5)(3,6)+(Z(5)^0)*(1,6,5,4,3,2) ] ->
[ (Z(5)^0)*(1,2,3,4,5,6)+(Z(5)^0)*(1,4)(2,5)(3,6)+(Z(5)^0)*(1,6,5,4,3,2),
@@ -75,7 +77,7 @@ gap> m2 := RegularAlgebraMultiplier( A5c6, I5c6, v2 );
+ Arg="mu" />
This function tests the condition \mu(ab) = (\mu a)b = a(\mu b)
for all a,b in the basis for A.
@@ -84,16 +86,16 @@ for all a,b in the basis for A.
IsAlgebraMultiplier( m2 );
+gap> IsAlgebraMultiplier( m1 );
true
-gap> one := One( A5c6 );;
-gap> L := List( vecA, v -> one );;
-gap> m1 := LeftModuleHomomorphismByImages( A5c6, A5c6, vecA, L );
+gap> one := One( A1 );;
+gap> L1 := List( BA1, v -> one );;
+gap> h1 := LeftModuleHomomorphismByImages( A1, A1, BA1, L1 );
[ (Z(5)^0)*(), (Z(5)^0)*(1,2,3,4,5,6), (Z(5)^0)*(1,3,5)(2,4,6),
(Z(5)^0)*(1,4)(2,5)(3,6), (Z(5)^0)*(1,5,3)(2,6,4), (Z(5)^0)*(1,6,5,4,3,2)
] -> [ (Z(5)^0)*(), (Z(5)^0)*(), (Z(5)^0)*(), (Z(5)^0)*(), (Z(5)^0)*(),
(Z(5)^0)*() ]
-gap> IsAlgebraMultiplier( m1 );
+gap> IsAlgebraMultiplier( h1 );
false
]]>
@@ -111,17 +113,16 @@ form an algebra with product \mu_b \circ \mu_{b'} = \mu_{bb'}.
v3 := vecA[3];
+gap> u1 := BA1[3];
(Z(5)^0)*(1,3,5)(2,4,6)
-gap> B5c3 := Subalgebra( A5c6, [ v3 ] );;
-gap> M := MultiplierAlgebraOfIdealBySubalgebra( A5c6, I5c6, B5c3 );
+gap> S1 := Subalgebra( A3, [ u1 ] );;
+gap> SetName( S1, "S1" );
+gap> MS1 := MultiplierAlgebraOfIdealBySubalgebra( A1, I1, S1 );
-gap> vecM := BasisVectors( Basis( M ) );;
-gap> vecM[1];
-, (dimension 2
- )> -> ,
- (dimension 2)>>
+gap> SetName( MS1, "MS1" );
+gap> BMS1 := BasisVectors( Basis( MS1 ) );;
+gap> BMS1[1];
+ I1>
]]>
@@ -138,10 +139,10 @@ This operation returns MultiplierAlgebraOfIdealBySubalgebra(A,A,A);.
MA5c6 := RegularAlgebraMultiplier( A5c6 );
+gap> MA1 := MultiplierAlgebra( A1 );
-gap> vecM := BasisVectors( Basis( MA5c6 ) );;
-gap> vecM[3];
+gap> BMA1 := BasisVectors( Basis( MA1 ) );;
+gap> BMA1[3];
-> >
]]>
@@ -160,15 +161,14 @@ homomorphism from B to M mapping b to \mu_b.
hom := MultiplierHomomorphism( MA5c6 );;
-gap> ImageElm( hom, vecA[2] );
-Basis( ,
- (dimension 2)>,
-[ (Z(5)^0)*()+(Z(5)^0)*(1,3,5)(2,4,6)+(Z(5)^0)*(1,5,3)(2,6,4),
- (Z(5)^0)*(1,2,3,4,5,6)+(Z(5)^0)*(1,4)(2,5)(3,6)+(Z(5)^0)*(1,6,5,4,3,2)
- ] ) ->
-[ (Z(5)^0)*(1,2,3,4,5,6)+(Z(5)^0)*(1,4)(2,5)(3,6)+(Z(5)^0)*(1,6,5,4,3,2),
- (Z(5)^0)*()+(Z(5)^0)*(1,3,5)(2,4,6)+(Z(5)^0)*(1,5,3)(2,6,4) ]
+gap> hom1 := MultiplierHomomorphism( MA1 );;
+gap> ImageElm( hom1, BA1[2] );
+Basis( A1, [ (Z(5)^0)*(), (Z(5)^0)*(1,2,3,4,5,6), (Z(5)^0)*(1,3,5)(2\
+,4,6),
+ (Z(5)^0)*(1,4)(2,5)(3,6), (Z(5)^0)*(1,5,3)(2,6,4), (Z(5)^0)*(1,6,5,4,3,2)
+ ] ) -> [ (Z(5)^0)*(1,2,3,4,5,6), (Z(5)^0)*(1,3,5)(2,4,6),
+ (Z(5)^0)*(1,4)(2,5)(3,6), (Z(5)^0)*(1,5,3)(2,6,4), (Z(5)^0)*(1,6,5,4,3,2),
+ (Z(5)^0)*() ]
]]>
@@ -209,6 +209,20 @@ is a commutative action if and only if the following five axioms hold:
for all k \in k, r,r' \in R, and s,s' \in S.
+Notice in particular that, for fixed r \in R,
+the map s \mapsto r \cdot s is a vector space homomorphism,
+but not in general an algebra homomorphism.
+
+
+
+
+
+This global function calls one of the following operations,
+depending on the arguments supplied.
+
+
+
@@ -223,20 +237,21 @@ over the field GF(5).
The ideal is generated by v = () + (1,3,5)(2,4,6) + (1,5,3)(2,6,4).
The generator r = (1,2,3,4,5,6) acts on v
by multiplication to give the vector
-r \cdot v = (1,2,3,4,5,6) + (1,4)(2,5)(3,6) + (1,6,5,4,3,2).
+r \cdot v = (1,2,3,4,5,6) + (1,4)(2,5)(3,6) + (1,6,5,4,3,2),
+as shown in
A5c6 := GroupRing( GF(5), Group( (1,2,3,4,5,6) ) );;
-gap> vecA := BasisVectors( Basis( A5c6 ) );;
-gap> v := vecA[1] + vecA[3] + vecA[5];
+gap> A1 := GroupRing( GF(5), Group( (1,2,3,4,5,6) ) );;
+gap> BA1 := BasisVectors( Basis( A1 ) );;
+gap> v := BA1[1] + BA1[3] + BA1[5];
(Z(5)^0)*()+(Z(5)^0)*(1,3,5)(2,4,6)+(Z(5)^0)*(1,5,3)(2,6,4)
-gap> I5c6 := Ideal( A5c6, [v] );;
-gap> actm := AlgebraActionByMultipliers( A5c6, I5c6, A5c6 );;
-gap> actm2 := Image( actm, vecA[2] );;
-gap> Image( actm2, v );
+gap> I1 := Ideal( A1, [v] );;
+gap> act1 := AlgebraActionByMultipliers( A1, I1, A1 );;
+gap> act12 := Image( act1, BA1[2] );;
+gap> Image( act12, v );
(Z(5)^0)*(1,2,3,4,5,6)+(Z(5)^0)*(1,4)(2,5)(3,6)+(Z(5)^0)*(1,6,5,4,3,2)
]]>
@@ -245,66 +260,79 @@ gap> Image( actm2, v );
-Let \theta : A \to B be a surjective algebra homomorphism
-such that \ker\theta is contained in the annihilator of A.
-Then B acts on A by b \cdot a = pa
-where p \in (\theta^{-1}b).
+Let \theta : B \to A be a surjective algebra homomorphism
+such that \ker\theta is contained in the annihilator of B.
+Then A acts on B by a \cdot b = pb
+where p \in (\theta^{-1}a).
Note that this action is well defined since
-\theta^{-1}b = \{ p+k ~|~ k \in \ker\theta \}
-and (p+k)a = pa+ka = ca+0.
+\theta^{-1}a = \{ p+k ~|~ k \in \ker\theta \}
+and (p+k)b = pb+kb = pb+0.
Continuing with the previous example,
-we construct the quotient algebra Q5c6 = A5c6/I5c6,
-and the natural homomorphism \theta : A5c6 \to Q5c6.
-The kernel of \theta is not contained in
-the annihilator of A5c6, so an attempt to form the action fails.
+we construct the quotient algebra Q1 = A1/I1,
+and the natural homomorphism \theta_1 : A1 \to Q1.
+The kernel of \theta is not contained in the annihilator of A1,
+so an attempt to form the action fails.
-An alternative example involves a single-generator matrix algebra.
+An alternative example involves a matrix algebra A_2
+with generator m_2, basis \{m_2,m_2^2,m_2^3\},
+and where m_2^4=0.
+The ideal I_2 is generated by m_2^3
+and the quotient Q_2 has basis \{[m_2],[m_2^2]\}.
theta := NaturalHomomorphismByIdeal( A5c6, I5c6 );
+gap> theta1 := NaturalHomomorphismByIdeal( A1, I1 );
-> >
-gap> List( vecA, v -> ImageElm( theta, v ) );
+gap> List( BA1, v -> ImageElm( theta1, v ) );
[ v.1, v.2, v.3, v.4, (Z(5)^2)*v.1+(Z(5)^2)*v.3, (Z(5)^2)*v.2+(Z(5)^2)*v.4 ]
-gap> actp := AlgebraActionBySurjection( theta );
+gap> AlgebraActionBySurjection( theta1 );
kernel of hom is not in the annihilator of A
fail
gap> ## an example which does not fail:
-gap> m := [ [0,1,2,3], [0,0,1,2], [0,0,0,1], [0,0,0,0] ];;
-gap> m^2;
+gap> m2 := [ [0,1,2,3], [0,0,1,2], [0,0,0,1], [0,0,0,0] ];;
+gap> m2^2;
[ [ 0, 0, 1, 4 ], [ 0, 0, 0, 1 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ] ]
-gap> m^3;
+gap> m2^3;
[ [ 0, 0, 0, 1 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ] ]
-gap> A1 := Algebra( Rationals, [m] );;
-gap> SetName( A1, "A1" );
-gap> A3 := Subalgebra( A1, [m^3] );;
-gap> nat3 := NaturalHomomorphismByIdeal( A1, A3 );
- A2 := Algebra( Rationals, [m2] );;
+gap> SetName( A2, "A2" );
+gap> S2 := Subalgebra( A2, [m2^3] );;
+gap> SetName( S2, "S2" );
+gap> nat2 := NaturalHomomorphismByIdeal( A2, S2 );
+ >
-gap> Q13 := Image( nat3 );;
-gap> SetName( Q13, "Q13" );
-gap> Display(nat3);
-LeftModuleHomomorphismByMatrix( Basis( A1,
+gap> Q2 := Image( nat2 );;
+gap> SetName( Q2, "Q2" );
+gap> Display( nat2 );
+LeftModuleHomomorphismByMatrix( Basis( A2,
[ [ [ 0, 0, 0, 1 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ] ],
[ [ 0, 1, 2, 3 ], [ 0, 0, 1, 2 ], [ 0, 0, 0, 1 ], [ 0, 0, 0, 0 ] ],
[ [ 0, 0, 1, 4 ], [ 0, 0, 0, 1 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ] ] ] ),
-[ [ 0, 0 ], [ 1, 0 ], [ 0, 1 ] ], CanonicalBasis( Q13 ) )
-gap> act3 := AlgebraActionBySurjection( nat3 );;
-gap> B3 := Image( act3 );;
-gap> bvB3 := BasisVectors( Basis( B3 ) );;
-gap> b1 := bvB3[1];; b2 := bvB3[2];;
-gap> [ Image(b1,m)=m^2, Image(b1,m^2)=m^3, Image(b1,m^3)=Zero(A1) ];
+[ [ 0, 0 ], [ 1, 0 ], [ 0, 1 ] ], CanonicalBasis( Q2 ) )
+gap> act2 := AlgebraActionBySurjection( nat2 );;
+gap> C2 := Image( act2 );;
+gap> BC2 := BasisVectors( Basis( C2 ) );;
+gap> b1 := BC2[1];; b2 := BC2[2];;
+gap> [ Image(b1,m2)=m2^2, Image(b1,m2^2)=m2^3, Image(b1,m2^3)=Zero(A2) ];
[ true, true, true ]
-gap> [ Image(b2,m)=m^3, b2=b1^2 ];
+gap> [ Image(b2,m2)=m2^3, b2=b1^2 ];
[true, true ]
]]>
+<#Include Label="AlgebraActionByHomomorphism">
+
+
+
+
+
+Algebra modules
+
<#Include Label="AlgebraModules">
<#Include Label="ModuleAsAlgebra">
@@ -315,6 +343,27 @@ gap> [ Image(b2,m)=m^3, b2=b1^2 ];
<#Include Label="AlgebraActionByModule">
+
+
+
+
+Actions on direct sums of algebras
+
+<#Include Label="DirectSumOfAlgebrasInfo">
+
+<#Include Label="EmbeddingForDirectSumOfAlgebras">
+
+<#Include Label="DirectSumOfAlgebraHomomorphisms">
+
+<#Include Label="AlgebraActionOnDirectSum">
+
+<#Include Label="DirectSumOfAlgebraActions">
+
+
+
+
+
+Other operations on algebras
P := SemidirectProductOfAlgebras( A5c6, actm, I5c6 );
+gap> P1 := SemidirectProductOfAlgebras( A1, act1, I1 );
-gap> Embedding( P, 1 );
+gap> Embedding( P1, 1 );
[ (Z(5)^0)*(), (Z(5)^0)*(1,2,3,4,5,6), (Z(5)^0)*(1,3,5)(2,4,6),
(Z(5)^0)*(1,4)(2,5)(3,6), (Z(5)^0)*(1,5,3)(2,6,4), (Z(5)^0)*(1,6,5,4,3,2)
] -> [ v.1, v.2, v.3, v.4, v.5, v.6 ]
-gap> Embedding( P, 2 );
+gap> Embedding( P1, 2 );
[ (Z(5)^0)*()+(Z(5)^0)*(1,3,5)(2,4,6)+(Z(5)^0)*(1,5,3)(2,6,4),
(Z(5)^0)*(1,2,3,4,5,6)+(Z(5)^0)*(1,4)(2,5)(3,6)+(Z(5)^0)*(1,6,5,4,3,2) ] ->
[ v.7, v.8 ]
-gap> Projection( P, 1 );
+gap> Projection( P1, 1 );
[ v.1, v.2, v.3, v.4, v.5, v.6, v.7, v.8 ] ->
[ (Z(5)^0)*(), (Z(5)^0)*(1,2,3,4,5,6), (Z(5)^0)*(1,3,5)(2,4,6),
(Z(5)^0)*(1,4)(2,5)(3,6), (Z(5)^0)*(1,5,3)(2,6,4), (Z(5)^0)*(1,6,5,4,3,2),
of ..., of ... ]
-gap> P3 := SemidirectProductOfAlgebras( Q13, act3, A1 );
-
-gap> Embedding( P3, 1 );
+gap> P2 := SemidirectProductOfAlgebras( Q2, act2, A2 );
+Q2 |X A2
+gap> Embedding( P2, 1 );
[ v.1, v.2 ] -> [ v.1, v.2 ]
-gap> Embedding( P3, 2 );
+gap> Embedding( P2, 2 );
[ [ [ 0, 1, 2, 3 ], [ 0, 0, 1, 2 ], [ 0, 0, 0, 1 ], [ 0, 0, 0, 0 ] ],
[ [ 0, 0, 1, 4 ], [ 0, 0, 0, 1 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ] ],
[ [ 0, 0, 0, 1 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ] ] ] ->
diff --git a/doc/cat1.xml b/doc/cat1.xml
index d8de0b1..08ad795 100644
--- a/doc/cat1.xml
+++ b/doc/cat1.xml
@@ -2,7 +2,7 @@
-
+
@@ -37,9 +37,9 @@ algebra-algebroids, (Gaffar Musa's Ph.D. thesis, ).
In this section we describe an implementation of cat^{1}-algebras
and their morphisms.
-The notion of cat^{1}-groups was defined as an algebraic model
+The notion of a cat^{1}-group was defined as an algebraic model
of 2-types by Loday in .
-Then Ellis defined the cat^{1}-algebras in .
+Then Ellis defined cat^{1}-algebras in .
Let A and R be k-algebras,
let t,h:A\rightarrow R be surjections,
@@ -72,7 +72,7 @@ The homomorphisms t,h and e are called the tail map,
Arg="t h" />
-
@@ -81,14 +81,13 @@ The homomorphisms t,h and e are called the tail map,
-The operations listed above are used for construction of precat^{1}-
-and cat^{1}-algebra structures.
-The function Cat1Algebra selects the operation from the
-above implementations up to user's input.
The operations PreCat1AlgebraByEndomorphisms
and PreCat1AlgebraByTailHeadEmbedding
are used with particular choices of algebra homomorphisms.
-
+The operations listed above are used for the construction of
+precat^{1}- and cat^{1}-algebras.
+The functions PreCat1Algebra and Cat1Algebra
+select the appropriate operation to suit the user's input.
@@ -98,14 +97,16 @@ are used with particular choices of algebra homomorphisms.
Arg="C" />
-
-
-
+
..] :-
+ Arg="GFnum gpsize gpnum num" />
-The function may also be used to select a
-cat^{1}-algebra from a data file.
-All cat^{1}-structures on commutative algebras are stored in a list
-in file cat1algdata.g.
-The data is read into the list CAT1ALG_LIST
+The function may also be used to select certain
+cat^{1}-group-algebras from the data file included with this package.
+Data for these cat^{1}-structures on commutative group algebras is
+stored in a list in file cat1algdata.g.
+This data is read into the list CAT1ALG_LIST
only when this function is called.
The function Cat1AlgebraSelect may be used in four ways:
-
-Cat1AlgebraSelect( n ) returns the list of possible sizes of groups
-for group algebras with Galois field GF(n).
+Cat1AlgebraSelect( n ) returns the list of possible group orders when
+Galois field GF(n), with n \in [2,3,4,5,7],
+is used to form cat^1-group-algebra structures.
-
-Cat1AlgebraSelect( n, m ) returns the list of allowable
-group numbers with given Galois field GF(n)
-and groups of size m.
+Cat1AlgebraSelect( n, m ) returns the list of available
+group numbers of size m with which to form
+cat^1-group-algebra structures with given Galois field GF(n).
-
-Cat1AlgebraSelect( n, m, k ) returns the list of possible
-cat^{1}-algebra structures with given Galois field GF(n)
+Cat1AlgebraSelect( n, m, k ) prints the list of possible
+cat^{1}-group-algebra structures with given Galois field GF(n)
and group number k of size m.
+The number of these structures is returned.
-
Cat1AlgebraSelect( n, m, k, j )
(or simply Cat1Algebra( n, m, k, j )) returns the
-j-th cat^{1}-algebra structure with these other parameters.
+j-th cat^{1}-group-algebra structure with these other parameters.
Now, we give examples of the use of this function.
@@ -200,31 +203,29 @@ Now, we give examples of the use of this function.
C := Cat1AlgebraSelect( 11 );
-|--------------------------------------------------------|
-| 11 is invalid number for Galois Field (GFnum) |
-| Possible numbers for GFnum in the Data : |
-|--------------------------------------------------------|
- [ 2, 3, 4, 5, 7 ]
+|--------------------------------------------------------|
+| 11 is invalid value for the Galois Field (GFnum) |
+| Available values for GFnum in the data : |
+|--------------------------------------------------------|
+ [ 2, 3, 4, 5, 7 ]
Usage: Cat1Algebra( GFnum, gpsize, gpnum, num );
fail
gap> C := Cat1AlgebraSelect( 4, 12 );
-|--------------------------------------------------------|
-| 12 is invalid number for size of group (gpsize) |
-| Possible numbers for the gpsize for GF(4) in the Data: |
-|--------------------------------------------------------|
- [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
+|--------------------------------------------------------|
+| 12 is invalid value for size of group (gpsize) |
+| Available values for gpsize with GF(4) in the data: |
+|--------------------------------------------------------|
Usage: Cat1Algebra( GFnum, gpsize, gpnum, num );
-fail
+[ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
gap> C := Cat1AlgebraSelect( 2, 6, 3 );
-|--------------------------------------------------------|
-| 3 is invalid number for group of order 6 |
-| Possible numbers for the gpnum in the Data : |
-|--------------------------------------------------------|
- [ 1, 2 ]
+|--------------------------------------------------------|
+| 3 is invalid value for groups of order 6 |
+| Available values for gpnum for groups of size 6 : |
+|--------------------------------------------------------|
Usage: Cat1Algebra( GFnum, gpsize, gpnum, num );
-fail
+[ 1, 2 ]
gap> C := Cat1AlgebraSelect( 2, 6, 2 );
-There are 4 cat1-structures for the algebra GF(2)_c6.
+There are 4 cat1-structures for the group algebra GF(2)_c6.
Range Alg Tail Head
|--------------------------------------------------------|
| GF(2)_c6 identity map identity map |
@@ -235,14 +236,26 @@ There are 4 cat1-structures for the algebra GF(2)_c6.
Usage: Cat1Algebra( GFnum, gpsize, gpnum, num );
Algebra has generators [ (Z(2)^0)*(), (Z(2)^0)*(1,2,3)(4,5) ]
4
+]]>
+
+
+The algebra GF(n)_gp has a list of n^{|gp|} elements.
+The [2, 10] in the second structure above
+indicates that the tail map, and also the head map,
+of the cat^1-algebra maps the two generators of c6
+to the second and tenth elements of this algebra respectively.
+
+
+ C0 := Cat1AlgebraSelect( 4, 6, 2, 2 );
[GF(2^2)_c6 -> Algebra( GF(2^2),
[ (Z(2)^0)*(), (Z(2)^0)*()+(Z(2)^0)*(1,3,5)(2,4,6)+(Z(2)^0)*(1,4)(2,5)(3,6)+(
Z(2)^0)*(1,5,3)(2,6,4)+(Z(2)^0)*(1,6,5,4,3,2) ] )]
gap> Size2d( C0 );
[ 4096, 1024 ]
+gap> Dimension( C0 );
+[ 6, 5 ]
gap> Display( C0 );
-
Cat1-algebra [GF(2^2)_c6=>..] :-
: source algebra has generators:
[ (Z(2)^0)*(), (Z(2)^0)*(1,2,3,4,5,6) ]
@@ -271,13 +284,13 @@ Cat1-algebra [GF(2^2)_c6=>..] :-
+ Arg="alg src rng" />
-
-
+ Arg="alg src rng" />
+
+
Let \mathcal{C} = (e;t,h:A\rightarrow R)
be a cat^{1}-algebra, and let A^{\prime},
@@ -328,7 +341,6 @@ gap> CC3 := SubCat1Algebra( C3, AA3, BB3 );
[Algebra( GF(2), [ of ..., (Z(2)^0)*(), (Z(2)^0)*()+(Z(2)^0)*(4,5)
] ) -> Algebra( GF(2), [ of ..., (Z(2)^0)*() ] )]
gap> Display( CC3 );
-
Cat1-algebra [..=>..] :-
: source algebra has generators:
[ of ..., (Z(2)^0)*(), (Z(2)^0)*()+(Z(2)^0)*(4,5) ]
@@ -377,18 +389,20 @@ a cat^{1}-algebra morphism.
-
+
+ Arg="src rng srchom rnghom" />
+ Arg="src rng srchom rnghom" />
+ Arg="mor" />
+ Arg="mor" />
These operations are used for constructing cat^{1}-algebra morphisms.
Details of the implementations can be found in .
@@ -418,7 +432,6 @@ These are the six main attributes of a cat^{1}-algebra morphism.
gap> C1 := Cat1Algebra( 2, 1, 1, 1 );
[GF(2)_triv -> GF(2)_triv]
gap> Display( C1 );
-
Cat1-algebra [GF(2)_triv=>GF(2)_triv] :-
: source algebra has generators:
[ (Z(2)^0)*(), (Z(2)^0)*() ]
@@ -435,7 +448,6 @@ Cat1-algebra [GF(2)_triv=>GF(2)_triv] :-
gap> C2 := Cat1Algebra( 2, 2, 1, 2 );
[GF(2)_c2 -> GF(2)_triv]
gap> Display( C2 );
-
Cat1-algebra [GF(2)_c2=>GF(2)_triv] :-
: source algebra has generators:
[ (Z(2)^0)*(), (Z(2)^0)*(1,2) ]
@@ -453,7 +465,6 @@ Cat1-algebra [GF(2)_c2=>GF(2)_triv] :-
[ of ... ]
: kernel embedding maps generators of kernel to:
[ (Z(2)^0)*()+(Z(2)^0)*(1,2) ]
-
gap> C1 = C2;
false
gap> R1 := Source( C1 );;
@@ -514,7 +525,6 @@ this operation returns the image crossed module.
imm := ImagesSource2DimensionalMapping( m );;
gap> Display( imm );
-
Cat1-algebra [..=>..] :-
: source algebra has generators:
[ (Z(2)^0)*(), (Z(2)^0)*() ]
@@ -527,7 +537,6 @@ Cat1-algebra [..=>..] :-
: range embedding maps range generators to:
[ (Z(2)^0)*() ]
: the kernel is trivial.
-
]]>
diff --git a/doc/xmod.xml b/doc/xmod.xml
index b93ecc3..f9b9cbb 100644
--- a/doc/xmod.xml
+++ b/doc/xmod.xml
@@ -17,10 +17,10 @@ In this chapter we will present the notion of crossed modules of commutative
algebras and their implementation in this package.
-
Definition and Examples
crossed module
+precrossed module
2d-algebra
A crossed module is a k-algebra morphism
@@ -39,13 +39,26 @@ of \mathcal{X}
Note that, although in this definition we have used a left action,
in the category of commutative algebras left and right actions coincide.
+When only the first axiom is satisfied, it is a precrossed module
+which is constructed.
+
+The details of these implementations can be found in .
+
+
+
+
-This global function calls one of the following six operations,
-depending on the arguments supplied.
+These two global function call one of the following six operations,
+depending on the arguments supplied.
+The two properties listed are assigned as appropriate to the resulting
+structures.
@@ -128,119 +141,6 @@ gap> Size2d( XIAk4 );
]]>
-
-
-
-When A is an algebra with multiplier algebra M,
-then the map A \to M, ~ a \mapsto \mu_a is the boundary
-of a crossed module in which the action is the identity map on M.
-
-
-
-
-
- XA := XModAlgebraByMultiplierAlgebra( A );
-[ A(l,m) -> ]
-gap> XModAlgebraAction( XA );
-IdentityMapping( )
-]]>
-
-
-
-
-
-Let \partial : S\rightarrow R be a surjective algebra homomorphism
-whose kernel lies in the annihilator of S.
-Define the action of R on S by r\cdot s = \widetilde{r}s
-where \widetilde{r} \in \partial^{-1}(r),
-as described in section .
-Then \mathcal{X}=(\partial : S\rightarrow R)
-is a crossed module with the defined action.
-
-Continuing with the example in that section,
-
-
-
-
-
- X3 := XModAlgebraBySurjection( nat3 );;
-gap> Display( X3 );
-
-Crossed module [A1->Q13] :-
-: Source algebra A1 has generators:
- [ [ [ 0, 1, 2, 3 ], [ 0, 0, 1, 2 ], [ 0, 0, 0, 1 ], [ 0, 0, 0, 0 ] ] ]
-: Range algebra Q13 has generators:
- [ v.1, v.2 ]
-: Boundary homomorphism maps source generators to:
- [ v.1 ]
-]]>
-
-
-precrossed module
-
-
-
-
-
-
-An R-algebra homomorphism
-\mathcal{X} := (\partial : S \rightarrow R) which satisfies
-the condition {\bf XModAlg\ 1} is called a precrossed module.
-The details of these implementations can be found in .
-
-
-
-
- G := SmallGroup( 4, 2 );
-
-gap> F := GaloisField( 4 );
-GF(2^2)
-gap> R := GroupRing( F, G );
-
-gap> Size( R );
-256
-gap> SetName( R, "GF(2^2)[k4]" );
-gap> e5 := Elements( R )[5];
-(Z(2)^0)* of ...+(Z(2)^0)*f1+(Z(2)^0)*f2+(Z(2)^0)*f1*f2
-gap> S := Subalgebra( R, [e5] );;
-gap> SetName( S, "" );
-gap> RS := Cartesian( R, S );;
-gap> SetName( RS, "GF(2^2)[k4] x " );
-gap> act := AlgebraAction( R, RS, S );;
-gap> bdy := AlgebraHomomorphismByImages( S, R, [e5], [e5] );
-[ (Z(2)^0)* of ...+(Z(2)^0)*f1+(Z(2)^0)*f2+(Z(2)^0)*f1*f2 ] ->
-[ (Z(2)^0)* of ...+(Z(2)^0)*f1+(Z(2)^0)*f2+(Z(2)^0)*f1*f2 ]
-gap> IsAlgebraAction( act );
-true
-gap> IsAlgebraHomomorphism( bdy );
-true
-gap> XM := PreXModAlgebraByBoundaryAndAction( bdy, act );
-[->GF(2^2)[k4]]
-gap> IsXModAlgebra( XM );
-true
-gap> Display( XM );
-
-Crossed module [->GF(2^2)[k4]] :-
-: Source algebra has generators:
- [ (Z(2)^0)* of ...+(Z(2)^0)*f1+(Z(2)^0)*f2+(Z(2)^0)*f1*f2 ]
-: Range algebra GF(2^2)[k4] has generators:
- [ (Z(2)^0)* of ..., (Z(2)^0)*f1, (Z(2)^0)*f2 ]
-: Boundary homomorphism maps source generators to:
- [ (Z(2)^0)* of ...+(Z(2)^0)*f1+(Z(2)^0)*f2+(Z(2)^0)*f1*f2 ]
-
-]]>
-
-
-<#Include Label="XModAlgebraByModule">
-
@@ -301,25 +201,82 @@ gap> f := Boundary( XIAk4 );
+(Z(5)^
0)*f2 ] -> [ (Z(5)^2)* of ...+(Z(5)^0)*f1,
(Z(5)^2)* of ...+(Z(5)^0)*f2 ]
-gap> Print( RepresentationsOfObject(XIAk4), "\n" );
+gap> RepresentationsOfObject( XIAk4 );
[ "IsComponentObjectRep", "IsAttributeStoringRep", "IsPreXModAlgebraObj" ]
-gap> props := [ "CanEasilyCompareElements", "CanEasilySortElements",
-> "IsDuplicateFree", "IsLeftActedOnByDivisionRing", "IsAdditivelyCommutative",
-> "IsLDistributive", "IsRDistributive", "IsPreXModDomain", "Is2dAlgebraObject",
-> "IsPreXModAlgebra", "IsXModAlgebra" ];;
-gap> known := KnownPropertiesOfObject( XIAk4 );;
-gap> ForAll( props, p -> (p in known) );
-true
-gap> Print( KnownAttributesOfObject(XIAk4), "\n" );
-[ "Name", "Range", "Source", "Boundary", "Size2d", "XModAlgebraAction" ]
+gap> KnownPropertiesOfObject( XIAk4 );
+[ "CanEasilyCompareElements", "CanEasilySortElements", "IsDuplicateFree",
+ "IsLeftActedOnByDivisionRing", "IsAdditivelyCommutative", "IsLDistributive",
+ "IsRDistributive", "IsPreXModDomain", "Is2dAlgebraObject",
+ "IsPreXModAlgebra", "IsXModAlgebra" ]
+gap> KnownAttributesOfObject( XIAk4 );
+[ "Name", "LeftActingDomain", "Range", "Source", "Boundary", "Size2d",
+ "XModAlgebraAction" ]
+]]>
+
+
+
+
+
+When A is an algebra with multiplier algebra M,
+then the map A \to M, ~ a \mapsto \mu_a is the boundary
+of a crossed module in which the action is the identity map on M.
+
+
+
+
+
+ XA := XModAlgebraByMultiplierAlgebra( A );
+[ A(l,m) -> ]
+gap> XModAlgebraAction( XA );
+IdentityMapping( )
]]>
+
+
+
+Let \partial : S\rightarrow R be a surjective algebra homomorphism
+whose kernel lies in the annihilator of S.
+Define the action of R on S by r\cdot s = \widetilde{r}s
+where \widetilde{r} \in \partial^{-1}(r),
+as described in section .
+Then \mathcal{X}=(\partial : S\rightarrow R)
+is a crossed module with the defined action.
+
+Continuing with the example in that section,
+
+
+
+
+
+ X2 := XModAlgebraBySurjection( nat2 );;
+gap> Display( X2 );
+Crossed module [A2->Q2] :-
+: Source algebra A2 has generators:
+ [ [ [ 0, 1, 2, 3 ], [ 0, 0, 1, 2 ], [ 0, 0, 0, 1 ], [ 0, 0, 0, 0 ] ] ]
+: Range algebra Q2 has generators:
+ [ v.1, v.2 ]
+: Boundary homomorphism maps source generators to:
+ [ v.1 ]
+]]>
+
+
+<#Include Label="XModAlgebraByBoundaryAndAction">
+
+<#Include Label="XModAlgebraByModule">
+
+<#Include Label="DirectSumOfXModAlgebras">
+
+
+ Arg="alg src rng" />
+ Arg="alg sub" />
A crossed module \mathcal{X}^{\prime }
= (\partial ^{\prime }:S^{\prime}\rightarrow R^{\prime })
@@ -407,26 +364,26 @@ by the function Make2dAlgebraMorphism.
+ Arg="Xalg" />
+ Arg="src rng srchom rnghom" />
+ Arg="src rng srchom rnghom" />
+ Arg="mor" />
+ Arg="mor" />
+ Arg="mor" />
+ Arg="mor" />
+ Arg="mor" />
+ Arg="m0r" />
+ Arg="mor" />
These operations construct crossed module homomorphisms,
@@ -484,7 +441,7 @@ true
+ Arg="mor" />
Let (\theta,\varphi) : \mathcal{X} = (\partial : S \rightarrow R)
\rightarrow \mathcal{X}^{\prime} = (\partial^{\prime}
@@ -515,7 +472,7 @@ true
+ Arg="mor" />
Let (\theta,\varphi) : \mathcal{X} = (\partial : S \rightarrow R)
\rightarrow \mathcal{X}^{\prime} = (\partial^{\prime} : S^{\prime}
@@ -541,15 +498,15 @@ induced from a given crossed module homomorphism.
+ Arg="mor" />
+ Arg="mor" />
+ Arg="mor" />
+ Arg="mor" />
+ Arg="mor" />
Let (\theta,\varphi) be a homomorphism of crossed modules.
If the homomorphisms \theta and \varphi
diff --git a/examples/module.g b/examples/module.g
new file mode 100644
index 0000000..baa5660
--- /dev/null
+++ b/examples/module.g
@@ -0,0 +1,130 @@
+############################################################################
+##
+#W module.g XModAlg example files Chris Wensley
+##
+
+LoadPackage( "xmodalg" );
+
+## Section 2.2.4
+m3 := [ [0,1,0], [0,0,1], [1,0,0] ];
+Print( "m3 = ", m3, "\n" );
+A3 := Algebra( Rationals, [m3] );
+SetName( A3, "A3" );;
+G := Group( (1,2,3) );;
+B3 := GroupRing( Rationals, G );;
+SetName( B3, "GR(G)" );
+g3 := GeneratorsOfAlgebra( B3 )[2];;
+mg3 := RegularAlgebraMultiplier( B3, B3, g3 );;
+MB3 := AlgebraByGenerators( Rationals, [ mg3 ] );;
+hom3 := AlgebraHomomorphismByImages( A3, MB3, [ m3 ], [ mg3 ] );;
+act3 := AlgebraActionByHomomorphism( hom3, B3 );
+Print ( "action act3 of A3 on B3:\n", act3, "\n" );
+
+## Section 4.1.6
+bdy3 := AlgebraHomomorphismByImages( B3, A3, [ g3 ], [ m3 ] );
+Print( "bdy3 = ", bdy3, "\n" );
+X3 := XModAlgebraByBoundaryAndAction( bdy3, act3 );
+Print( "crossed module X3:\n" );
+Display( X3 );
+
+## Section 2.3
+m3 := [ [0,1,0], [0,0,1], [1,0,0] ];;
+A4 := Algebra( Rationals, [m3] );;
+SetName( A4, "A4" );;
+V4 := Rationals^3;;
+M4 := LeftAlgebraModule( A4, \*, V4 );;
+SetName( M4, "M4" );
+famM4 := ElementsFamily( FamilyObj( M4 ) );;
+v4 := [3,4,5];;
+Print( "initial v4 in V4 = ", v4, "\n" );
+v4 := ObjByExtRep( famM4, v4 );
+Print( "v4 after conversion to M4 = ", v4, "\n" );
+Print( "m3*v4 = ", m3*v4, "\n" );
+genM4 := GeneratorsOfLeftModule( M4 );;
+u4 := 6*genM4[1] + 7*genM4[2] + 8*genM4[3];
+Print( "u4 = 6*genM4[1] + 7*genM4[2] + 8*genM4[3] = ", u4, "\n" );
+u4 := ExtRepOfObj( u4 );
+Print( "ExtRepOfObf( u4 ) = ", u4, "\n" );
+
+## Section 2.3.1
+D4 := LeftActingDomain( M4 );;
+T4 := EmptySCTable( Dimension(M4), Zero(D4), "symmetric" );;
+B4a := AlgebraByStructureConstants( D4, T4 );
+Print( "B4a = ", B4a, "\n" );
+Print( "B4a has generators: ", GeneratorsOfAlgebra( B4a ), "\n" );
+B4 := ModuleAsAlgebra( M4 );
+Print( "B4 has name: ", Name( B4 ), "\n" );
+Print( "B4 has generators: ", GeneratorsOfAlgebra( B4 ), "\n" );
+
+## Section 2.3.2
+Print( "IsModuleAsAlgebra( B4 )? ", IsModuleAsAlgebra( B4 ), "\n" );
+Print( "IsModuleAsAlgebra( A4 )? ", IsModuleAsAlgebra( A4 ), "\n" );
+
+## Section 2.3.3
+Print( "the known attributes of B4 are:\n" );
+Print( KnownAttributesOfObject( B4 ), "\n" );
+M2B4 := ModuleToAlgebraIsomorphism( B4 );
+Print( "M2B4 = ", M2B4, "\n" );
+Print( "Source( M2B4 ) = M4? ", Source( M2B4 ) = M4, "\n" );
+Print( "Source( M2B4 ) = V4? ", Source( M2B4 ) = V4, "\n" );
+B2M4 := AlgebraToModuleIsomorphism( B4 );
+Print( "B2M4 = ", B2M4, "\n" );
+Print( "Range( B2M4 ) = M4? ", Range( B2M4 ) = M4, "\n" );
+Print( "Range( B2M4 ) = V4? ", Range( B2M4 ) = V4, "\n" );
+
+## Section 2.3.4
+act4 := AlgebraActionByModule( A4, M4 );
+Print( "the action act4 of A4 on B4 is:\n", act4, "\n" );
+a4 := 2*m3 + 3*m3^2;
+Print( "a4 = ", a4, ":\n" );
+Print( "the image of a4 under act4 is:\n", Image( act4, a4 ), "\n" );
+Print( "the image of the action act4 is:\n", Image( act4 ), "\n" );
+Print( "\n" );
+
+## Section 4.1.7
+X4 := XModAlgebraByModule( A4, M4 );
+Print( "Name( X4 ) = ", Name( X4 ), "\n" );
+Display( X4 );
+
+## Section 5.1.1
+C4 := Cat1AlgebraOfXModAlgebra( X4 );
+Print( "Name( C4 ) = ", Name( C4 ), "\n" );
+Display( C4 );
+
+## Section 2.4.1
+A3B3 := DirectSumOfAlgebras( A3, B3 );;
+SetName( A3B3, Concatenation( Name(A3), "(+)", Name(B3) ) );
+SetDirectSumOfAlgebrasInfo( A3B3,
+ rec( algebras := [A3,B3], first := [1,Dimension(A3)+1],
+ embeddings := [ ], projections := [ ] ) );;
+
+## Section 2.4.2
+Print( "\n first embedding into A3B3:\n", Embedding( A3B3, 1 ), "\n" );
+Print( "second projection from A3B3:\n", Projection( A3B3, 2 ), "\n" );
+
+## Section 2.4.3
+hom := DirectSumOfAlgebraHomomorphisms( hom3, hom3 );
+Print( "\nthe direct sum of hom3 with itself is:\n", hom, "\n" );
+
+## Section 2.4.4
+actMA3 := AlgebraActionByMultipliers( A3, A3, A3 );;
+act5 := AlgebraActionOnDirectSum( actMA3, act3 );;
+Print( "\naction of A on the direct sum of A3 and B3\n", act5, "\n" );
+
+## Section 2.4.5
+act6 := DirectSumOfAlgebraActions( act3, act4 );;
+A6 := Source( act6 );
+B6 := AlgebraActedOn( act6 );
+Print( "\nact6 is the direct sum action of ", A6, " on ", B6, "\n" );
+em3 := ImageElm( Embedding( A6, 1 ), m3 );
+Print( "matrix m3 embeds in A6 as: ", em3, "\n" );
+iem3 := ImageElm( act6, em3 );
+Print( "the action act6 maps em3 to:\n", iem3, "\n" );
+ea4 := ImageElm( Embedding( A6, 2 ), a4 );
+Print( "matrix m4 embeds in A6 as: ", ea4, "\n" );
+iea4 := ImageElm( act6, ea4 );
+Print( "the action act6 maps ea4 to:\n", iea4, "\n" );
+
+############################################################################
+##
+#E module.g . . . . . . . . . . . . . . . . . . . . . . . . . . . ends here
\ No newline at end of file
diff --git a/examples/module3.g b/examples/module3.g
deleted file mode 100644
index a252522..0000000
--- a/examples/module3.g
+++ /dev/null
@@ -1,73 +0,0 @@
-############################################################################
-##
-#W module3.g XModAlg example files Chris Wensley
-##
-
-LoadPackage( "xmodalg" );
-
-## Chapter 2, Section 2.2.3
-m := [ [0,1,0], [0,0,1], [1,0,0] ];
-Print( "m = ", m, "\n" );
-A3 := Algebra( Rationals, [m] );
-SetName( A3, "A3" );;
-V3 := Rationals^3;;
-M3 := LeftAlgebraModule( A3, \*, V3 );
-SetName( M3, "M3" );
-famM3 := ElementsFamily( FamilyObj( M3 ) );;
-v := [3,4,5];;
-v2 := ObjByExtRep( famM3, v );
-Print( "v = ", v, ", v2 = ", v2, "\n" );
-Print( "m*v2 = ", m*v2, "\n" );
-genM3 := GeneratorsOfLeftModule( M3 );;
-u2 := 6*genM3[1] + 7*genM3[2] + 8*genM3[3];
-u := ExtRepOfObj( u2 );
-Print( "u2 = ", u2, ", u = ", u, "\n" );
-
-## Chapter 2, Section 2.2.4
-D3 := LeftActingDomain( M3 );;
-T3 := EmptySCTable( Dimension(M3), Zero(D3), "symmetric" );;
-B3a := AlgebraByStructureConstants( D3, T3 );
-Print( "B3a = ", B3a, "\n" );
-Print( "B3a has generators: ", GeneratorsOfAlgebra( B3a ), "\n" );
-B3 := ModuleAsAlgebra( M3 );
-Print( "B3 has name: ", Name( B3 ), "\n" );
-Print( "B3 has generators: ", GeneratorsOfAlgebra( B3 ), "\n" );
-
-## Chapter 2, Section 2.2.5
-Print( "IsModuleAsAlgebra( B3 )? ", IsModuleAsAlgebra( B3 ), "\n" );
-Print( "IsModuleAsAlgebra( A3 )? ", IsModuleAsAlgebra( A3 ), "\n" );
-
-## Chapter 2, Section 2.2.6
-Print( "the known attributes of B3 are:\n" );
-Print( KnownAttributesOfObject( B3 ), "\n" );
-M2B3 := ModuleToAlgebraIsomorphism( B3 );
-Print( "M2B3 = ", M2B3, "\n" );
-Print( "Source( M2B3 ) = M3? ", Source( M2B3 ) = M3, "\n" );
-Print( "Source( M2B3 ) = V3? ", Source( M2B3 ) = V3, "\n" );
-B2M3 := AlgebraToModuleIsomorphism( B3 );
-Print( "B2M3 = ", B2M3, "\n" );
-Print( "Range( B2M3 ) = M3? ", Range( B2M3 ) = M3, "\n" );
-Print( "Range( B2M3 ) = V3? ", Range( B2M3 ) = V3, "\n" );
-
-## Chapter 2, Section 2.2.7
-act3 := AlgebraActionByModule( A3, M3 );
-Print( "the action act3 of A3 on B3 is:\n", act3, "\n" );
-a := 2*m + 3*m^2;
-Print( "a = ", a, ":\n" );
-Print( "the image of a under act3 is:\n", Image( act3, a ), "\n" );
-Print( "the image of the action act3 is:\n", Image( act3 ), "\n" );
-Print( "\n" );
-
-## Chapter 4, Section 4.1.7
-X3 := XModAlgebraByModule( A3, M3 );
-Print( "Name( X3 ) = ", Name( X3 ), "\n" );
-Display( X3 );
-
-## Chapter 5, Section 5.1.1
-C3 := Cat1AlgebraOfXModAlgebra( X3 );
-Print( "Name( C3 ) = ", Name( C3 ), "\n" );
-Display( C3 );
-
-############################################################################
-##
-#E module3.g . . . . . . . . . . . . . . . . . . . . . . . . . . ends here
\ No newline at end of file
diff --git a/init.g b/init.g
index e5cfcf5..7210d8c 100644
--- a/init.g
+++ b/init.g
@@ -11,6 +11,6 @@ fi;
## read the function declarations
ReadPackage( "xmodalg", "lib/algebra.gd" );
-ReadPackage( "xmodalg", "lib/module.gd" );
ReadPackage( "xmodalg", "lib/alg2obj.gd" );
+ReadPackage( "xmodalg", "lib/module.gd" );
ReadPackage( "xmodalg", "lib/alg2map.gd" );
diff --git a/lib/alg2obj.gd b/lib/alg2obj.gd
index bf9b0cb..18defb5 100644
--- a/lib/alg2obj.gd
+++ b/lib/alg2obj.gd
@@ -2,7 +2,7 @@
##
#W alg2obj.gd The XMODALG package Zekeriya Arvasi
#W & Alper Odabas
-#Y Copyright (C) 2014-2021, Zekeriya Arvasi & Alper Odabas,
+#Y Copyright (C) 2014-2024, Zekeriya Arvasi & Alper Odabas,
##
############################## 2d-algebras ###########################
@@ -30,17 +30,29 @@ DeclareProperty( "IsPreXModAlgebra", Is2dAlgebra );
DeclareProperty( "IsXModAlgebra", Is2dAlgebra );
InstallTrueMethod( IsPreXModAlgebra, IsXModAlgebra );
+BindGlobal( "PreXModAlgebraObjType",
+ NewType( Family2dAlgebra, IsPreXModAlgebraObj ) );
+BindGlobal( "PreCat1AlgebraObjType",
+ NewType( Family2dAlgebra, IsPreCat1AlgebraObj ) );
+
DeclareAttribute( "XModAlgebraAction", IsPreXModAlgebra );
DeclareOperation( "XModAlgebraObj",
[ IsAlgebraHomomorphism, IsAlgebraAction ] );
+DeclareOperation( "XModAlgebraObjNC",
+ [ IsAlgebraHomomorphism, IsAlgebraAction ] );
DeclareOperation( "PreXModAlgebraByBoundaryAndAction",
[ IsAlgebraHomomorphism, IsAlgebraAction ] );
+DeclareOperation( "PreXModAlgebraByBoundaryAndActionNC",
+ [ IsAlgebraHomomorphism, IsAlgebraAction ] );
DeclareGlobalFunction( "XModAlgebra" );
DeclareOperation( "XModAlgebraByBoundaryAndAction",
[ IsAlgebraHomomorphism, IsAlgebraAction ] );
+DeclareOperation( "XModAlgebraByBoundaryAndActionNC",
+ [ IsAlgebraHomomorphism, IsAlgebraAction ] );
+
DeclareOperation( "XModAlgebraBySurjection", [ IsAlgebraHomomorphism ] );
DeclareOperation( "XModAlgebraByMultiplierAlgebra",
[ IsAlgebra ] );
diff --git a/lib/alg2obj.gi b/lib/alg2obj.gi
index 5fac53d..96b5c55 100644
--- a/lib/alg2obj.gi
+++ b/lib/alg2obj.gi
@@ -50,7 +50,7 @@ function( obj, src, rng )
end );
-######################### (pre-)crossed modules #########################
+######################### (pre-)crossed algebras ########################
###########################################################################
##
@@ -71,26 +71,29 @@ function( P )
act := XModAlgebraAction( P );
# Check P.boundary: P.source -> P.range
if not ( ( Source( bdy ) = S ) and ( Range( bdy ) = R ) ) then
+ Info( InfoXModAlg, 1, "source/range error" );
return false;
fi;
# checking
if not IsAlgebraHomomorphism( bdy ) then
+ Info( InfoXModAlg, 1, "bdy is not a homomorphism" );
return false;
fi;
if not ( ( Source( act ) = R ) ) then
+ Info( InfoXModAlg, 1, "Source( act ) <> R" );
return false;
fi;
genR := GeneratorsOfAlgebra( R );
genS := GeneratorsOfAlgebra( S );
for r in genR do
- m := ImageElm( act, r );
+ m := ImageElm( act, r );
for s in genS do
ims := Image( bdy, s );
- acts := Image( m, s );
+ acts := Image( m, s );
z1 := ImageElm( bdy, acts );
z2 := r * ims;
- if not ( z1 = z2 ) then
- Info( InfoXModAlg, 1, z1, " <> ", z2 );
+ if not ( z1 = z2 ) then
+ Info( InfoXModAlg, 1, "XModAlg 1: ", z1, " <> ", z2 );
return false;
fi;
od;
@@ -101,16 +104,21 @@ end );
###########################################################################
##
#M XModAlgebraObj( , ) . . . . . . . make a pre-crossed module
+#M XModAlgebraObjNC( , ) . . . . . . make a pre-crossed module
##
-InstallMethod( XModAlgebraObj, "for homomorphism and action", true,
+InstallMethod( XModAlgebraObjNC, "for homomorphism and action", true,
[ IsAlgebraHomomorphism, IsAlgebraAction ], 0,
function( bdy, act )
- local A, B, filter, fam, PM, AB, BB;
- fam := Family2dAlgebra;
- filter := IsPreXModAlgebraObj;
+ local A, B, DA, DB, type, PM, AB, BB;
+ type := PreXModAlgebraObjType;
B := Source( bdy );
A := Range( bdy );
+ DA := LeftActingDomain( A );
+ DB := LeftActingDomain( B );
+ if not ( DA = DB ) then
+ Error( "conflicting domains" );
+ fi;
AB := Source( act );
BB := Range( act );
if ( IsLeftModuleGeneralMapping( act ) = true ) then
@@ -122,21 +130,28 @@ function( bdy, act )
return fail;
fi;
fi;
-
- ## ???? should there be any tests for condition XModAlg1 here ????
-
+ ## create the object
PM := rec();
- ObjectifyWithAttributes( PM, NewType( fam, filter ),
+ ObjectifyWithAttributes( PM, type,
Source, B,
Range, A,
Boundary, bdy,
XModAlgebraAction, act,
+ LeftActingDomain, DA,
IsPreXModDomain, true,
Is2dAlgebraObject, true );
+ return PM;
+end );
+
+InstallMethod( XModAlgebraObj, "for homomorphism and action", true,
+ [ IsAlgebraHomomorphism, IsAlgebraAction ], 0,
+function( bdy, act )
+ local PM;
+ PM := XModAlgebraObjNC( bdy, act );
+ ## check axiom XModAlg1
if not IsPreXModAlgebra( PM ) then
- return false;
+ return fail;
fi;
- # name := Name( PM );
return PM;
end );
@@ -174,7 +189,7 @@ function ( P, Q )
else
gS := S;
fi;
- #####£
+ ######
for r in gR do
for s in gS do
im1 := Image( aP, [r,s] );
@@ -374,50 +389,53 @@ end );
############################################################################
##
#M PreXModAlgebraByBoundaryAndAction
+#M PreXModAlgebraByBoundaryAndActionNC
##
InstallMethod( PreXModAlgebraByBoundaryAndAction,
"pre-crossed module from boundary and action maps",
true, [ IsAlgebraHomomorphism, IsAlgebraAction ], 0,
-
function( bdy, act )
-
- local B, BB, A, obj;
-
- if ( IsLeftModuleGeneralMapping(act) = true ) then
- ### yeni_yontem
- else
- ### eski_yontem
- B := Source( bdy );
- A := Range( bdy );
- BB := Range( act );
- if not ( BB = B ) then
- Info( InfoXModAlg, 2,
- "The range group is not the source of the action." );
- return fail;
- fi;
+ if not ( Source( act ) = Range( bdy ) ) then
+ Info( InfoXModAlg, 1, "Source(act) <> Range(bdy)" );
+ return fail;
fi;
- obj := XModAlgebraObj( bdy, act );
- return obj;
+ return XModAlgebraObj( bdy, act );
+end );
+
+InstallMethod( PreXModAlgebraByBoundaryAndActionNC,
+ "pre-crossed module from boundary and action maps",
+ true, [ IsAlgebraHomomorphism, IsAlgebraAction ], 0,
+function( bdy, act )
+ return XModAlgebraObjNC( bdy, act );
end );
############################################################################
##
#M XModAlgebraByBoundaryAndAction
+#M XModAlgebraByBoundaryAndActionNC
##
InstallMethod( XModAlgebraByBoundaryAndAction,
"crossed module from boundary and action maps", true,
[ IsAlgebraHomomorphism, IsAlgebraAction ], 0,
function( bdy, act )
-
local PM;
-
PM := PreXModAlgebraByBoundaryAndAction( bdy, act );
if not IsXModAlgebra( PM ) then
- Error( "this boundary and action only defines a pre-crossed module" );
+ Error( "boundary and action only define a pre-crossed module" );
fi;
return PM;
end );
+InstallMethod( XModAlgebraByBoundaryAndActionNC,
+ "crossed module from boundary and action maps", true,
+ [ IsAlgebraHomomorphism, IsAlgebraAction ], 0,
+function( bdy, act )
+ local PM;
+ PM := PreXModAlgebraByBoundaryAndActionNC( bdy, act );
+ SetIsXModAlgebra( PM, true );
+ return PM;
+end );
+
############################################################################
##
#M XModAlgebraByMultiplierAlgebra
@@ -1247,29 +1265,30 @@ end );
## cat1-algebra from data in CAT1_LIST
##
InstallOtherMethod( Cat1AlgebraSelect,
- "construct a cat1-algebra using data in file", true, [ IsInt ], 0,
+ "construct a cat1-algebra using data file", true, [ IsInt ], 0,
function( gf )
return Cat1AlgebraSelect( gf, 0, 0, 0 );
end );
InstallOtherMethod( Cat1AlgebraSelect,
- "construct a cat1-algebra using data in file", true, [ IsInt, IsInt ], 0,
+ "construct a cat1-algebra using data file", true, [ IsInt, IsInt ], 0,
function( gf, size )
return Cat1AlgebraSelect( gf, size, 0, 0 );
end );
InstallOtherMethod( Cat1AlgebraSelect,
- "construct a cat1-algebra using data in file", true,
+ "construct a cat1-algebra using data file", true,
[ IsInt, IsInt, IsInt ], 0,
function( gf, size, gpnum )
return Cat1AlgebraSelect( gf, size, gpnum, 0 );
end );
-InstallMethod( Cat1AlgebraSelect, "construct a cat1-algebra using data in file",
+InstallMethod( Cat1AlgebraSelect,
+ "construct a cat1-group-algebra using data file",
true, [ IsInt, IsInt, IsInt, IsInt ], 0,
function( gf, size, gpnum, num )
- local ok, type, norm, usage, usage2, sizes, maxsize, maxgsize,
+ local ok, type, norm, usage, usage2, sizes, maxsize, maxgsize, len,
start, iso, count, pos, pos2, names, A, gA, B, H, emb, gB,
usage_list1, usage_list2, usage_list3, i, j, k, l, ncat1,
G, genG, M, L, genR, R, t, kert, e, h, imt, imh, C1A, XC, elA;
@@ -1283,9 +1302,11 @@ function( gf, size, gpnum, num )
usage_list1 := Set(CAT1ALG_LIST, i -> i[1]);
if not gf in usage_list1 then
- Print( "|--------------------------------------------------------| \n" );
- Print( "| ",gf," is invalid number for Galois Field (GFnum) \t \t | \n");
- Print( "| Possible numbers for GFnum in the Data : \t \t | \n");
+ Print( "|--------------------------------------------------------| \n" );
+ if ( gf <> 0 ) then
+ Print( "| ",gf," is invalid value for the Galois Field (GFnum) \t | \n");
+ fi;
+ Print( "| Available values for GFnum in the data : \t \t | \n");
Print( "|--------------------------------------------------------| \n" );
Print( " ",usage_list1," \n");
Print( usage, "\n" );
@@ -1293,24 +1314,26 @@ function( gf, size, gpnum, num )
fi;
usage_list2 := Set(Filtered(CAT1ALG_LIST, i -> i[1]=gf), i -> i[2]);
if not size in usage_list2 then
- Print( "|--------------------------------------------------------| \n" );
- Print( "| ",size," is invalid number for size of group (gpsize) \t | \n") ;
- Print( "| Possible numbers for the gpsize for GF(",gf,") in the Data: | \n");
+ Print( "|--------------------------------------------------------| \n" );
+ if ( size <> 0 ) then
+ Print( "| ",size," is invalid value for size of group (gpsize) \t | \n") ;
+ fi;
+ Print( "| Available values for gpsize with GF(",gf,") in the data: \t | \n");
Print( "|--------------------------------------------------------| \n" );
- Print( " ",usage_list2," \n");
Print( usage, "\n" );
- return fail;
+ return usage_list2;
fi;
usage_list3 := Set( Filtered( Filtered( CAT1ALG_LIST, i -> i[1] = gf),
i -> i[2] = size ), i -> i[3] );
if not gpnum in usage_list3 then
- Print( "|--------------------------------------------------------| \n" );
- Print( "| ",gpnum," is invalid number for group of order ",size, "\t \t | \n");
- Print( "| Possible numbers for the gpnum in the Data : \t \t | \n");
- Print( "|--------------------------------------------------------| \n" );
- Print( " ",usage_list3," \n");
+ Print( "|--------------------------------------------------------| \n" );
+ if ( gpnum <> 0 ) then
+ Print( "| ",gpnum," is invalid value for groups of order ",size, "\t \t | \n");
+ fi;
+ Print( "| Available values for gpnum for groups of size ",size," : \t | \n");
+ Print( "|--------------------------------------------------------| \n" );
Print( usage, "\n" );
- return fail;
+ return usage_list3;
fi;
maxgsize := CAT1ALG_LIST_GROUP_SIZES[gf+1]-CAT1ALG_LIST_GROUP_SIZES[gf];
iso := CAT1ALG_LIST_CLASS_SIZES;
@@ -1353,13 +1376,16 @@ function( gf, size, gpnum, num )
gA := GeneratorsOfAlgebra(A);
SetName( A, M[5] );
if not ( ( num >= 1 ) and ( num <= ncat1 ) ) then
- Print( "There are ", ncat1, " cat1-structures for the algebra ");
+ Print( "There are ", ncat1, " cat1-structures for the group algebra ");
Print( A, ".\n" );
Print( " Range Alg \tTail \t\tHead \n" );
Print( "|--------------------------------------------------------| \n" );
Print( "| ", A, " \tidentity map \t\tidentity map \t |\n" );
for i in [2..ncat1] do
- Print( "| ",M[6][i-1][3]," \t",M[6][i-1][4]," \t\t",M[6][i-1][5], "\t | \n" );
+ len := Length( M[6][i-1][4] );
+ Print( "| ",M[6][i-1][3]," \t",M[6][i-1][4] );
+ if ( len<14 ) then Print( "\t" ); fi;
+ Print( " \t",M[6][i-1][5], "\t | \n" );
od;
Print( "|--------------------------------------------------------| \n" );
Print( usage, "\n" );
@@ -1373,7 +1399,7 @@ function( gf, size, gpnum, num )
imt := L[4];
imh := L[5];
else
- L := M[6][num-1];
+ L := M[6][num-1];
if ( L[3] = "-----" ) then
elA := Elements(A);;
imt := [];
diff --git a/lib/algebra.gd b/lib/algebra.gd
index 22daa05..10248f3 100644
--- a/lib/algebra.gd
+++ b/lib/algebra.gd
@@ -1,4 +1,4 @@
-#############################################################################
+ #############################################################################
##
#W algebra.gd The XMODALG package Zekeriya Arvasi
#W & Alper Odabas
@@ -37,15 +37,15 @@ DeclareOperation( "AllIdempotentAlgebraHomomorphisms",
############################## algebra actions ####################
-DeclareProperty( "IsAlgebraAction", IsMapping );
+DeclareProperty( "IsAlgebraAction", IsAlgebraHomomorphism );
DeclareGlobalFunction( "AlgebraAction" );
DeclareAttribute( "LeftElementOfCartesianProduct", IsAlgebraAction );
DeclareAttribute( "AlgebraActionType", IsAlgebraAction );
+DeclareAttribute( "AlgebraActedOn", IsAlgebraAction );
DeclareAttribute( "HasZeroModuleProduct", IsAlgebraAction );
DeclareOperation( "AlgebraActionByMultipliers",
[ IsAlgebra, IsAlgebra, IsAlgebra ] );
-DeclareOperation( "AlgebraAction2", [ IsAlgebra ] );
DeclareOperation( "AlgebraActionBySurjection", [ IsAlgebraHomomorphism ] );
DeclareOperation ( "SemidirectProductOfAlgebras",
diff --git a/lib/algebra.gi b/lib/algebra.gi
index edce335..d0344c7 100644
--- a/lib/algebra.gi
+++ b/lib/algebra.gi
@@ -88,7 +88,7 @@ end );
#############################################################################
##
-#F MultiplierAlgebraOfIdealBySubalgebra( )
+#M MultiplierAlgebraOfIdealBySubalgebra( )
##
InstallMethod( MultiplierAlgebraOfIdealBySubalgebra,
"for an algebra, an ideal, and a subalgebra", true,
@@ -118,7 +118,7 @@ end );
#############################################################################
##
-#F MultiplierAlgebra( )
+#M MultiplierAlgebra( )
##
InstallMethod( MultiplierAlgebra, "generic method for an algebra",
true, [ IsAlgebra ], 0,
@@ -128,7 +128,7 @@ end );
#############################################################################
##
-#F MultiplierAlgebraByGenerators
+#M MultiplierAlgebraByGenerators
##
InstallMethod( MultiplierAlgebraByGenerators,
"generic method for an algebra and a list of multipliers", true,
@@ -475,28 +475,30 @@ end);
#############################################################################
##
-#F IsAlgebraAction( )
-##
-InstallMethod( IsAlgebraAction, "for a mapping", true, [ IsMapping ], 0,
-function ( ac )
- local AB,A,B,uzB,uzA,j,i,k;
- # mapping
##
## D3 := LeftActingDomain( M3 );;
-## gap> T3 := EmptySCTable( Dimension(M3), Zero(D3), "symmetric" );;
-## gap> B3a := AlgebraByStructureConstants( D3, T3 );
+## gap> D4 := LeftActingDomain( M4 );;
+## gap> T4 := EmptySCTable( Dimension(M4), Zero(D4), "symmetric" );;
+## gap> B4a := AlgebraByStructureConstants( D4, T4 );
##
-## gap> GeneratorsOfAlgebra( B3a );
+## gap> GeneratorsOfAlgebra( B4a );
## [ v.1, v.2, v.3 ]
-## gap> B3 := ModuleAsAlgebra( M3 );
-## A(M3)
-## gap> GeneratorsOfAlgebra( B3 );
+## gap> B4 := ModuleAsAlgebra( M4 );
+## A(M4)
+## gap> GeneratorsOfAlgebra( B4 );
## [ [[ 1, 0, 0 ]], [[ 0, 1, 0 ]], [[ 0, 0, 1 ]] ]
## ]]>
##
@@ -108,9 +197,9 @@ DeclareAttribute( "ModuleAsAlgebra", IsLeftModule );
##
##
## IsModuleAsAlgebra( B3 );
+## gap> IsModuleAsAlgebra( B4 );
## true
-## gap> IsModuleAsAlgebra( A3 );
+## gap> IsModuleAsAlgebra( A4 );
## false
## ]]>
##
@@ -138,24 +227,24 @@ DeclareProperty( "IsModuleAsAlgebra", IsAlgebra );
##
##
## KnownAttributesOfObject( B3 );
+## gap> KnownAttributesOfObject( B4 );
## [ "Name", "ZeroImmutable", "LeftActingDomain", "Dimension",
## "GeneratorsOfLeftOperatorAdditiveGroup", "GeneratorsOfLeftOperatorRing",
## "ModuleToAlgebraIsomorphism", "AlgebraToModuleIsomorphism" ]
-## gap> M2B3 := ModuleToAlgebraIsomorphism( B3 );
+## gap> M2B4 := ModuleToAlgebraIsomorphism( B4 );
## [ [ 1, 0, 0 ], [ 0, 1, 0 ], [ 0, 0, 1 ] ] -> [ [[ 1, 0, 0 ]], [[ 0, \
## 1, 0 ]],
## [[ 0, 0, 1 ]] ]
-## gap> Source( M2B3 ) = M3;
+## gap> Source( M2B4 ) = M4;
## false
-## gap> Source( M2B3 ) = V3;
+## gap> Source( M2B4 ) = V4;
## true
-## gap> B2M3 := AlgebraToModuleIsomorphism( B3 );
+## gap> B2M4 := AlgebraToModuleIsomorphism( B4 );
## [ [[ 1, 0, 0 ]], [[ 0, 1, 0 ]], [[ 0, 0, 1 ]] ] ->
## [ [ 1, 0, 0 ], [ 0, 1, 0 ], [ 0, 0, 1 ] ]
-## gap> Range( B2M3 ) = M3;
+## gap> Range( B2M4 ) = M4;
## false
-## gap> Range( B2M3 ) = V3;
+## gap> Range( B2M4 ) = V4;
## true
## ]]>
##
@@ -180,25 +269,18 @@ DeclareAttribute( "AlgebraToModuleIsomorphism", IsAlgebra );
##
##
## act3 := AlgebraActionByModule( A3, M3 );
-## [ [ [ 1, 0, 0 ], [ 0, 1, 0 ], [ 0, 0, 1 ] ],
-## [ [ 1, 0, 0 ], [ 0, 0, 0 ], [ 0, 0, 0 ] ],
-## [ [ 0, 0, 1 ], [ 1, 0, 0 ], [ 0, 1, 0 ] ] ] ->
+## gap> act4 := AlgebraActionByModule( A4, M4 );
+## [ [ [ 0, 1, 0 ], [ 0, 0, 1 ], [ 1, 0, 0 ] ] ] ->
## [ [ [[ 1, 0, 0 ]], [[ 0, 1, 0 ]], [[ 0, 0, 1 ]] ] ->
-## [ [[ 1, 0, 0 ]], [[ 0, 1, 0 ]], [[ 0, 0, 1 ]] ],
-## [ [[ 1, 0, 0 ]], [[ 0, 1, 0 ]], [[ 0, 0, 1 ]] ] ->
-## [ [[ 1, 0, 0 ]], 0*[[ 1, 0, 0 ]], 0*[[ 1, 0, 0 ]] ],
-## [ [[ 1, 0, 0 ]], [[ 0, 1, 0 ]], [[ 0, 0, 1 ]] ] ->
-## [ [[ 0, 1, 0 ]], [[ 0, 0, 1 ]], [[ 1, 0, 0 ]] ] ]
-## gap> genA3 := GeneratorsOfAlgebra( A3 );;
-## gap> a := 2*m + 3*m^2;
+## [ [[ 0, 0, 1 ]], [[ 1, 0, 0 ]], [[ 0, 1, 0 ]] ] ]
+## gap> a4 := 2*m3 + 3*m3^2;
## [ [ 0, 2, 3 ], [ 3, 0, 2 ], [ 2, 3, 0 ] ]
-## gap> Image( act3, a );
-## Basis( A(M3), [ [[ 1, 0, 0 ]], [[ 0, 1, 0 ]], [[ 0, 0, 1 ]] ] ) ->
+## gap> Image( act4, a4 );
+## Basis( A(M4), [ [[ 1, 0, 0 ]], [[ 0, 1, 0 ]], [[ 0, 0, 1 ]] ] ) ->
## [ (3)*[[ 0, 1, 0 ]]+(2)*[[ 0, 0, 1 ]], (2)*[[ 1, 0, 0 ]]+(3)*[[ 0, 0, 1 ]],
## (3)*[[ 1, 0, 0 ]]+(2)*[[ 0, 1, 0 ]] ]
-## gap> Image( act3 );
-##
+## gap> Image( act4 );
+##
## ]]>
##
## <#/GAPDoc>
@@ -230,14 +312,14 @@ DeclareOperation( "AlgebraActionByModule", [ IsAlgebra, IsLeftModule ] );
##
##
## X3 := XModAlgebraByModule( A3, M3 );
-## [ A(M3) -> A3 ]
-## gap> Display( X3 );
-## Crossed module [A(M3)->A3] :-
-## : Source algebra A(M3) has generators:
+## gap> X4 := XModAlgebraByModule( A4, M4 );
+## [ A(M4) -> A4 ]
+## gap> Display( X4 );
+## Crossed module [A(M4)->A4] :-
+## : Source algebra A(M4) has generators:
## [ [[ 1, 0, 0 ]], [[ 0, 1, 0 ]], [[ 0, 0, 1 ]] ]
-## : Range algebra A3 has generators:
-## [ [ [ 1, 0, 0 ], [ 0, 1, 0 ], [ 0, 0, 1 ] ],
+## : Range algebra A4 has generators:
+## [4[ [ 1, 0, 0 ], [ 0, 1, 0 ], [ 0, 0, 1 ] ],
## [ [ 1, 0, 0 ], [ 0, 0, 0 ], [ 0, 0, 0 ] ],
## [ [ 0, 0, 1 ], [ 1, 0, 0 ], [ 0, 1, 0 ] ] ]
## : Boundary homomorphism maps source generators to:
@@ -258,14 +340,13 @@ DeclareOperation( "XModAlgebraByModule", [ IsAlgebra, IsLeftModule ] );
##
## As a second example, we convert the crossed module X3
## constructed in
-
-
+##
##
## C3 := Cat1AlgebraOfXModAlgebra( X3 );
-## [A3 |X A(M3)=>A3]
-## gap> Display( C3 );
-## Cat1-algebra [A3 |X A(M3)=>A3] :-
+## gap> C6 := Cat1AlgebraOfXModAlgebra( X6 );
+## [A4 |X A(M4)=>A4]
+## gap> Display( C6 );
+## Cat1-algebra [A4 |X A(M4)=>A4] :-
## : range algebra has generators:
## [ [ [ 0, 1, 0 ], [ 0, 0, 1 ], [ 1, 0, 0 ] ] ]
## : tail homomorphism = head homomorphism
@@ -284,3 +365,216 @@ DeclareOperation( "XModAlgebraByModule", [ IsAlgebra, IsLeftModule ] );
##
## <#/GAPDoc>
##
+
+############################ direct sum operations #######################
+
+#############################################################################
+##
+#A DirectSumOfAlgebrasInfo( )
+##
+## <#GAPDoc Label="DirectSumOfAlgebrasInfo">
+##
+##
+##
+##
+## This attribute for direct sums of algebras is missing from
+## the main library, and is added here to be used in methods
+## for Embedding and Projection.
+##
+##
+##
+## A3B3 := DirectSumOfAlgebras( A3, B3 );;
+## gap> SetName( A3B3, Concatenation( Name(A3), "(+)", Name(B3) ) );
+## gap> SetDirectSumOfAlgebrasInfo( A3B3,
+## > rec( algebras := [A3,B3], first := [1,Dimension(A3)+1],
+## > embeddings := [ ], projections := [ ] ) );
+## ]]>
+##
+## <#/GAPDoc>
+##
+DeclareAttribute( "DirectSumOfAlgebrasInfo", IsAlgebra, "mutable" );
+
+############################################################################
+##
+## Embedding( )
+##
+## <#GAPDoc Label="EmbeddingForDirectSumOfAlgebras">
+##
+##
+##
+##
+##
+## Methods for Embedding and Projection for direct sums
+## of algebras are missing from the main library, and so are included here.
+##
+##
+##
+##
+## Embedding( A3B3, 1 );
+## Basis( A3, [ [ [ 0, 1, 0 ], [ 0, 0, 1 ], [ 1, 0, 0 ] ],
+## [ [ 0, 0, 1 ], [ 1, 0, 0 ], [ 0, 1, 0 ] ],
+## [ [ 1, 0, 0 ], [ 0, 1, 0 ], [ 0, 0, 1 ] ] ] ) -> [ v.1, v.2, v.3 ]
+## gap> Projection( A3B3, 2 );
+## CanonicalBasis( A3(+)GR(G) ) -> [ of ..., of ...,
+## of ..., (1)*(), (1)*(1,2,3), (1)*(1,3,2) ]
+## ]]>
+##
+## <#/GAPDoc>
+##
+
+############################################################################
+##
+## DirectSumOfAlgebraHomomorphisms( )
+##
+## <#GAPDoc Label="DirectSumOfAlgebraHomomorphisms">
+##
+##
+##
+##
+## Let \theta_1 : B_1 \to A_1 and \theta_2 : B_2 \to A_2
+## be algebra homomorphisms.
+## The embeddings into A = A_1 \oplus A_2
+## and B = B_1 \oplus B_2 may be used to construct
+## \theta = \theta_1 \oplus \theta_2 : B \to A
+## where \theta(b_1,b_2) = (\theta_1b_1,\theta_2b_2).
+## The example uses the homomorphism hom3 used in
+## Section
+##
+##
+##
+##
+## hom := DirectSumOfAlgebraHomomorphisms( hom3, hom3 );;
+## gap> Print( hom, "\n" );
+## AlgebraHomomorphismByImages( A3(+)A3, Algebra( Rationals,
+## [ v.1, v.2, v.3, v.4, v.5, v.6 ] ),
+## [ [ [ 0, 1, 0, 0, 0, 0 ], [ 0, 0, 1, 0, 0, 0 ], [ 1, 0, 0, 0, 0, 0 ],
+## [ 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ] ],
+## [ [ 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ],
+## [ 0, 0, 0, 0, 1, 0 ], [ 0, 0, 0, 0, 0, 1 ], [ 0, 0, 0, 1, 0, 0 ] ] ],
+## [ v.1, v.4 ] )
+## ]]>
+##
+## <#/GAPDoc>
+##
+DeclareOperation( "DirectSumOfAlgebraHomomorphisms",
+ [ IsAlgebraHomomorphism, IsAlgebraHomomorphism ] );
+
+############################################################################
+##
+## AlgebraActionOnDirectSum( )
+##
+## <#GAPDoc Label="AlgebraActionOnDirectSum">
+##
+##
+##
+##
+## If \alpha_1 : A \to C_1 is an action on algebra B_1
+## and \alpha_2 : A \to C_2 is an action on algebra B_2
+## by the same algebra A,
+## then A acts on the direct sum B_1 \oplus B_2
+## by a \cdot (b_1,b_2) = (a \cdot b_1, a \cdot b_2).
+##
+## In Section there is created
+## an action actB3 of A3 on an isomorphic B3.
+## In the example here we construct actA3, with A3 acting
+## on itself, formed using AlgebraActionByMultipliers.
+## Then we construct the direcct sum of these actions.
+##
+##
+##
+## actMA3 := AlgebraActionByMultipliers( A3, A3, A3 );;
+## gap> act5 := AlgebraActionOnDirectSum( actMA3, act3 );
+## [ [ [ 0, 1, 0 ], [ 0, 0, 1 ], [ 1, 0, 0 ] ],
+## [ [ 0, 0, 1 ], [ 1, 0, 0 ], [ 0, 1, 0 ] ],
+## [ [ 1, 0, 0 ], [ 0, 1, 0 ], [ 0, 0, 1 ] ] ] ->
+## [ [ v.1, v.2, v.3, v.4, v.5, v.6 ] -> [ v.2, v.3, v.1, v.5, v.6, v.4 ],
+## [ v.1, v.2, v.3, v.4, v.5, v.6 ] -> [ v.3, v.1, v.2, v.6, v.4, v.5 ],
+## [ v.1, v.2, v.3, v.4, v.5, v.6 ] -> [ v.1, v.2, v.3, v.4, v.5, v.6 ] ]
+## ]]>
+##
+## <#/GAPDoc>
+##
+DeclareOperation( "AlgebraActionOnDirectSum",
+ [ IsAlgebraAction, IsAlgebraAction ] );
+
+############################################################################
+##
+## DirectSumOfAlgebraActions( )
+##
+## <#GAPDoc Label="DirectSumOfAlgebraActions">
+##
+##
+##
+##
+## Let
+## If \alpha_1 : A_1 \to C_1 is an action on algebra B_1,
+## and \alpha_2 : A_2 \to C_2 is an action on algebra B_2,
+## then A_1 \oplus A_2 acts on the direct sum B_1 \oplus B_2
+## by (a_1,a_2) \cdot (b_1,b_2) = (a_1 \cdot b_1, a_2 \cdot b_2).
+## The example forms the direct sum of the actions constructed in
+## sections
+## and
+##
+##
+##
+##
+## act6 := DirectSumOfAlgebraActions( act3, act4 );;
+## gap> A6 := Source( act6 );
+## A3(+)A4
+## gap> B6 := AlgebraActedOn( act6 );
+## GR(G)(+)A(M4)
+## gap> em3 := ImageElm( Embedding( A6, 1 ), m3 );
+## [ [ 0, 1, 0, 0, 0, 0 ], [ 0, 0, 1, 0, 0, 0 ], [ 1, 0, 0, 0, 0, 0 ],
+## [ 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ] ]
+## gap> ImageElm( act6, em3 );
+## Basis( GR(G)(+)A(M4), [ v.1, v.2, v.3, v.4, v.5, v.6 ] ) ->
+## [ v.2, v.3, v.1, 0*v.1, 0*v.1, 0*v.1 ]
+## gap> ea4 := ImageElm( Embedding( A6, 2 ), a4 );
+## [ [ 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ],
+## [ 0, 0, 0, 0, 2, 3 ], [ 0, 0, 0, 3, 0, 2 ], [ 0, 0, 0, 2, 3, 0 ] ]
+## gap> ImageElm( act6, ea4 );
+## Basis( GR(G)(+)A(M4), [ v.1, v.2, v.3, v.4, v.5, v.6 ] ) ->
+## [ 0*v.1, 0*v.1, 0*v.1, (3)*v.5+(2)*v.6, (2)*v.4+(3)*v.6, (3)*v.4+(2)*v.5 ]
+## ]]>
+##
+## <#/GAPDoc>
+##
+DeclareOperation( "DirectSumOfAlgebraActions",
+ [ IsAlgebraAction, IsAlgebraAction ] );
+
+############################################################################
+##
+## DirectSumOfXModAlgebras( )
+##
+## <#GAPDoc Label="DirectSumOfXModAlgebras">
+##
+##
+##
+##
+## In Sections
+## and
+## we constructed direct sums of algebra homomorphisms and algebra actions.
+## So, given two crossed modules of algebras X_1, X_2,
+## we can form the direct sums of their boundaries and actions
+## to form a direct sum X_1 \oplus X_2 of crossed modules.
+##
+##
+##
+##
+## DirectSumOfXModAlgebras( X3, X4 );
+## [ GR(G)(+)A(M4) -> A3(+)A4 ]
+## ]]>
+##
+## <#/GAPDoc>
+##
+DeclareOperation( "DirectSumOfXModAlgebras",
+ [ IsXModAlgebra, IsXModAlgebra ] );
+
diff --git a/lib/module.gi b/lib/module.gi
index 99afe63..f0e02f1 100644
--- a/lib/module.gi
+++ b/lib/module.gi
@@ -5,20 +5,45 @@
#Y Copyright (C) 2014-2024, Zekeriya Arvasi & Alper Odabas,
##
-############################ algebra operations ###########################
+############################## algebra actions ############################
+
+#############################################################################
+##
+#F AlgebraActionByHomomorphism( )
+##
+InstallMethod( AlgebraActionByHomomorphism,
+ "for an algebra homomorphism and an algebra", true,
+ [ IsAlgebraHomomorphism, IsAlgebra ], 0,
+function ( hom, B )
+ local C, genC;
+ if not IsAlgebraAction( hom ) then
+ Info( InfoXModAlg, 1, "hom is not an algebra action" );
+ return fail;
+ fi;
+ C := Range( hom );
+ genC := GeneratorsOfAlgebra( C );
+ if not ( B = Source( genC[1] ) ) then
+ Info( InfoXModAlg, 1, "Range(hom) not isomorphisms of B" );
+ return fail;
+ fi;
+ SetAlgebraActionType( hom, "homomorphism" );
+ SetAlgebraActedOn( hom, B );
+ return hom;
+end );
+
+############################# module operations ###########################
#############################################################################
##
#M ModuleAsAlgebra
##
-InstallMethod( ModuleAsAlgebra, "generic method for a module", true,
+InstallMethod( ModuleAsAlgebra, "baseric method for a module", true,
[ IsLeftModule ], 0,
function( M )
local D, z, genM, num, L, T, B, genB, V, genV, MtoB, BtoM;
D := LeftActingDomain( M );
z := Zero( D );
genM := List( GeneratorsOfLeftModule( M ), g -> ExtRepOfObj(g) );
-## Print( "genM = ", genM, "\n" );
num := Length( genM );
if HasIsAlgebraModule( M ) and IsAlgebraModule( M ) then
V := UnderlyingLeftModule( M );
@@ -27,17 +52,14 @@ function( M )
else
L := List( genM, v -> Concatenation( "[", String(v), "]" ) );
fi;
-## Print( "L = ", L, "\n" );
T := EmptySCTable( num, z, "symmetric" );
B := AlgebraByStructureConstants( D, T, L );
SetIsModuleAsAlgebra( B, true );
genB := GeneratorsOfAlgebra( B );
if HasIsAlgebraModule( M ) and IsAlgebraModule( M ) then
-## Print( "first option - IsAlgebraModule\n" );
MtoB := LeftModuleHomomorphismByImages( V, B, genV, genB );
BtoM := LeftModuleHomomorphismByImages( B, V, genB, genV );
else
-## Print( "second option - IsLeftModule\n" );
MtoB := LeftModuleHomomorphismByImages( M, B, genM, genB );
BtoM := LeftModuleHomomorphismByImages( B, M, genB, genM );
fi;
@@ -66,8 +88,9 @@ InstallMethod( AlgebraActionByModule,
"for an algebra and an algebra module", true,
[ IsAlgebra, IsLeftModule ], 0,
function( A, M )
- local genA, dimA, famM, B, genB, dimB, M2B, B2M, imact, i, a, imi,
+ local DA, genA, dimA, famM, B, genB, dimB, M2B, B2M, imact, i, a, imi,
j, v, m, C, act;
+ DA := LeftActingDomain( A );
genA := GeneratorsOfAlgebra( A );
dimA := Length( genA );
famM := ElementsFamily( FamilyObj( M ) );
@@ -87,12 +110,13 @@ function( A, M )
od;
imact[i] := AlgebraGeneralMappingByImages( B, B, genB, imi );
od;
- C := AlgebraByGenerators( Rationals, imact );
+ C := AlgebraByGenerators( DA, imact );
if HasName( B ) then
SetName( C, Concatenation( "Act(", Name(B), ")" ) );
fi;
act := AlgebraGeneralMappingByImages( A, C, genA, imact );
SetIsAlgebraAction( act, true );
+ SetAlgebraActedOn( act, B );
SetAlgebraActionType( act, "module" );
return act;
end );
@@ -115,7 +139,283 @@ function( A, M )
act := AlgebraActionByModule( A, M );
PM := PreXModAlgebraByBoundaryAndAction( bdy, act );
if not IsXModAlgebra( PM ) then
- Error( "this boundary and action only defines a pre-crossed module" );
+ Error( "this boundary and action only define a pre-crossed module" );
fi;
return PM;
end );
+
+
+############################ direct sum operations #######################
+
+#############################################################################
+##
+#M Embedding
+##
+InstallMethod( Embedding, "algebra direct sum and integer",
+ [ IsAlgebra and HasDirectSumOfAlgebrasInfo, IsPosInt ],
+ function( D, i )
+ local info, A, imgs, hom;
+ # check if exists already
+ info := DirectSumOfAlgebrasInfo( D );
+ if IsBound( info.embeddings[i] ) then
+ return info.embeddings[i];
+ fi;
+ if not ( i in [1,2] ) then
+ Error( "require i in [1,2]" );
+ fi;
+ # compute the embedding
+ A := info.algebras[i];
+ imgs := Basis( D ){[info.first[i]..info.first[i]+Dimension(A)-1]};
+ hom := AlgebraHomomorphismByImagesNC( A, D, Basis(A), imgs );
+ SetIsInjective( hom, true );
+ ## store information
+ info.embeddings[i] := hom;
+ return hom;
+end);
+
+#############################################################################
+##
+#M Projection
+##
+InstallMethod( Projection, "algebra direct sum and integer",
+ [ IsAlgebra and HasDirectSumOfAlgebrasInfo, IsPosInt ],
+ function( D, i )
+ local info, A, bass, dimA, dimD, imgs, hom;
+ # check if exists already
+ info := DirectSumOfAlgebrasInfo( D );
+ if IsBound( info.projections[i] ) then
+ return info.projections[i];
+ fi;
+ if not ( i in [1,2] ) then
+ Error( "require i in [1,2]" );
+ fi;
+ # compute the projection
+ A := info.algebras[i];
+ dimA := Dimension( A );
+ dimD := Dimension( D );
+ bass := Basis( D );
+ if ( i = 1 ) then
+ imgs := Concatenation( Basis( A ),
+ List( [1..dimD-dimA], x -> Zero(A) ) );
+ else
+ imgs := Concatenation( List( [1..dimD-dimA], x -> Zero(A) ),
+ Basis( A ) );
+ fi;
+ hom := AlgebraHomomorphismByImagesNC( D, A, bass, imgs );
+ SetIsSurjective( hom, true );
+ ## store information
+ info.projections[i] := hom;
+ return hom;
+end);
+
+#############################################################################
+##
+#M DirectSumOfAlgebraHomomorphisms
+##
+InstallMethod( DirectSumOfAlgebraHomomorphisms,
+ "for two algebra homomorphisms",
+ [ IsAlgebraHomomorphism, IsAlgebraHomomorphism ],
+ function( hom1, hom2 )
+ local B1, A1, gen1, im1, B2, A2, gen2, im2,
+ dom, B, eB1, eB2, genB, A, eA1, eA2, imhom, hom;
+ B1 := Source( hom1 );
+ A1 := Range( hom1 );
+ gen1 := GeneratorsOfAlgebra( B1 );
+ im1 := List( gen1, g -> ImageElm( hom1, g ) );
+ B2 := Source( hom2 );
+ A2 := Range( hom2 );
+ gen2 := GeneratorsOfAlgebra( B2 );
+ im2 := List( gen2, g -> ImageElm( hom2, g ) );
+ dom := LeftActingDomain( B1 );
+ if not ( dom = LeftActingDomain( B2 ) ) then
+ Error( "homomorphisms are over different domains" );
+ fi;
+ B := DirectSumOfAlgebras( B1, B2 );
+ if HasName( B1 ) and HasName( B2 ) then
+ SetName( B, Concatenation( Name(B1), "(+)", Name(B2) ) );
+ fi;
+ SetDirectSumOfAlgebrasInfo( B,
+ rec( algebras := [ B1, B2 ],
+ first := [ 1, 1 + Dimension( B1 ) ],
+ embeddings := [ ],
+ projections := [ ] ) );
+ eB1 := Embedding( B, 1 );
+ eB2 := Embedding( B, 2 );
+ A := DirectSumOfAlgebras( A1, A2 );
+ if HasName( A1 ) and HasName( A2 ) then
+ SetName( A, Concatenation( Name(A1), "(+)", Name(A2) ) );
+ fi;
+ SetDirectSumOfAlgebrasInfo( A,
+ rec( algebras := [ A1, A2 ],
+ first := [ 1, 1 + Dimension( A1 ) ],
+ embeddings := [ ],
+ projections := [ ] ) );
+ eA1 := Embedding( A, 1 );
+ eA2 := Embedding( A, 2 );
+ genB := Concatenation( List( gen1, b -> ImageElm( eB1, b ) ),
+ List( gen2, b -> ImageElm( eB2, b ) ) );
+ imhom := Concatenation( List( im1, a -> ImageElm( eA1, a ) ),
+ List( im2, a -> ImageElm( eA2, a ) ) );
+ hom := AlgebraHomomorphismByImages( B, A, genB, imhom );
+ return hom;
+end);
+
+#############################################################################
+##
+#M AlgebraActionOnDirectSum
+##
+InstallMethod( AlgebraActionOnDirectSum, "for two algebra actions", true,
+ [ IsAlgebraAction, IsAlgebraAction ], 0,
+function( act1, act2 )
+ local A, domA, genA, B1, basB1, B2, basB2, B, firstB, basB,
+ eB1, eB2, genC, a, c1, c2, imc1, imc2, imB, C, act;
+ A := Source( act1 );
+ domA := LeftActingDomain( A );
+ genA := BasisVectors( Basis( A ) );
+ if not ( Source( act2 ) = A ) then
+ Error( "act1, act2 must have the same source" );
+ fi;
+ B1 := AlgebraActedOn( act1 );
+ basB1 := BasisVectors( Basis( B1 ) );
+ B2 := AlgebraActedOn( act2 );
+ basB2 := BasisVectors( Basis( B2 ) );
+ B := DirectSumOfAlgebras( B1, B2 );
+ firstB := [ 1, 1 + Dimension( B1 ) ];
+ basB := BasisVectors( Basis( B ) );
+ SetDirectSumOfAlgebrasInfo( B,
+ rec( algebras := [ B1, B2 ],
+ first := firstB,
+ embeddings := [ ],
+ projections := [ ] ) );
+ eB1 := Embedding( B, 1 );
+ eB2 := Embedding( B, 2 );
+ genC := [ ];
+ for a in genA do
+ c1 := ImageElm( act1, a );
+ c2 := ImageElm( act2, a );
+ imc2 := List( basB2, b -> ImageElm( eB2, ImageElm( c2, b ) ) );
+ imc1 := List( basB1, b -> ImageElm( eB1, ImageElm( c1, b ) ) );
+ imB := Concatenation( imc1, imc2 );
+ Add( genC, LeftModuleHomomorphismByImages( B, B, basB, imB ) );
+ od;
+ C := AlgebraByGenerators( domA, genC );
+ act := AlgebraHomomorphismByImages( A, C, genA, genC );
+ SetIsAlgebraAction( act, true );
+ SetAlgebraActedOn( act, B );
+ SetAlgebraActionType( act, "on direct sum 1" );
+ return act;
+end );
+
+#############################################################################
+##
+#M DirectSumOfAlgebraActions
+##
+InstallMethod( DirectSumOfAlgebraActions, "for two algebra actions", true,
+ [ IsAlgebraAction, IsAlgebraAction ], 0,
+function( act1, act2 )
+ local domA, A1, basA1, nA1, A2, basA2, nA2, A, basA, firstA,
+ B1, basB1, nB1, B2, basB2, nB2, B, basB, firstB, zB, zB1, zB2,
+ C1, basC1, nC1, C2, basC2, nC2, C, basC, c, imc, hom,
+ eA1, imA1, eA2, imA2, eB1, imB1, eB2, imB2, i, act;
+ A1 := Source( act1 );
+ domA := LeftActingDomain( A1 );
+ basA1 := BasisVectors( Basis( A1 ) );
+ nA1 := Length( basA1 );
+ B1 := AlgebraActedOn( act1 );
+ basB1 := BasisVectors( Basis( B1 ) );
+ nB1 := Length( basB1 );
+ C1 := Range( act1 );
+ basC1 := BasisVectors( Basis( C1 ) );
+ nC1 := Length( basC1 );
+ A2 := Source( act2 );
+ if not ( domA = LeftActingDomain( A2 ) ) then
+ Error( "act1 and act2 have different left acting domains" );
+ fi;
+ basA2 := BasisVectors( Basis( A2 ) );
+ nA2 := Length( basA2 );
+ B2 := AlgebraActedOn( act2 );
+ basB2 := BasisVectors( Basis( B2 ) );
+ nB2 := Length( basB2 );
+ C2 := Range( act2 );
+ basC2 := BasisVectors( Basis( C2 ) );
+ nC2 := Length( basC2 );
+ A := DirectSumOfAlgebras( A1, A2 );
+ if HasName( A1 ) and HasName( A2 ) then
+ SetName( A, Concatenation( Name(A1), "(+)", Name(A2) ) );
+ fi;
+ firstA := [ 1, 1 + Dimension( A1 ) ];
+ SetDirectSumOfAlgebrasInfo( A,
+ rec( algebras := [ A1, A2 ],
+ first := firstA,
+ embeddings := [ ],
+ projections := [ ] ) );
+ eA1 := Embedding( A, 1 );
+ imA1 := List( [1..nA1], i -> ImageElm( eA1, basA1[i] ) );
+ eA2 := Embedding( A, 2 );
+ imA2 := List( [1..nA2], j -> ImageElm( eA2, basA2[j] ) );
+ basA := Concatenation( imA1, imA2 );
+ B := DirectSumOfAlgebras( B1, B2 );
+ if HasName( B1 ) and HasName( B2 ) then
+ SetName( B, Concatenation( Name(B1), "(+)", Name(B2) ) );
+ fi;
+ firstB := [ 1, 1 + Dimension( B1 ) ];
+ SetDirectSumOfAlgebrasInfo( B,
+ rec( algebras := [ B1, B2 ],
+ first := firstB,
+ embeddings := [ ],
+ projections := [ ] ) );
+ eB1 := Embedding( B, 1 );
+ imB1 := List( [1..nB1], i -> ImageElm( eB1, basB1[i] ) );
+ eB2 := Embedding( B, 2 );
+ imB2 := List( [1..nB2], j -> ImageElm( eB2, basB2[j] ) );
+ basB := Concatenation( imB1, imB2 );
+ basC := ListWithIdenticalEntries( nC1+nC2, 0 );
+ zB := Zero( B );
+ zB1 := List( [1..nB1], i -> zB );
+ zB2 := List( [1..nB2], i -> zB );
+ for i in [1..nC1] do
+ ## c := ImageElm( act1, basA1[i] );
+ c := basC1[i];
+ imc := List( basB1, b -> ImageElm( eB1, ImageElm( c, b ) ) );
+ imc := Concatenation( imc, zB2 );
+ hom := LeftModuleHomomorphismByImages( B, B, basB, imc );
+ if ( hom = fail ) then
+ Print( "!!! hom = fail !!!\n" );
+ fi;
+ basC[i] := hom;
+ od;
+ for i in [1..nC2] do
+ ## c := ImageElm( act2, basA2[i] );
+ c := basC2[i];
+ imc := List( basB2, b -> ImageElm( eB2, ImageElm( c, b ) ) );
+ imc := Concatenation( zB1, imc );
+ hom := LeftModuleHomomorphismByImages( B, B, basB, imc );
+ basC[nC1+i] := hom;
+ od;
+
+ C := AlgebraByGenerators( domA, basC );
+ act := AlgebraGeneralMappingByImages( A, C, basA, basC );
+ SetIsAlgebraAction( act, true );
+ SetAlgebraActedOn( act, B );
+ SetAlgebraActionType( act, "direct sum" );
+ return act;
+end );
+
+#############################################################################
+##
+#M DirectSumOfXModAlgebras
+##
+InstallMethod( DirectSumOfXModAlgebras, "for two crossed modules", true,
+ [ IsXModAlgebra, IsXModAlgebra ], 0,
+function( X1, X2 )
+ local bdy1, act1, bdy2, act2, bdy, act, X12;
+ bdy1 := Boundary( X1 );
+ act1 := XModAlgebraAction( X1 );
+ bdy2 := Boundary( X2 );
+ act2 := XModAlgebraAction( X2 );
+ bdy := DirectSumOfAlgebraHomomorphisms( bdy1, bdy2 );
+ act := DirectSumOfAlgebraActions( act1, act2 );
+ X12 := PreXModAlgebraByBoundaryAndActionNC( bdy, act );
+ SetIsXModAlgebra( X12, true );
+ return X12;
+end );
diff --git a/read.g b/read.g
index f12abe2..0591bf3 100644
--- a/read.g
+++ b/read.g
@@ -7,8 +7,8 @@
## read the actual code
ReadPackage( "xmodalg", "lib/algebra.gi" );
-ReadPackage( "xmodalg", "lib/module.gi" );
ReadPackage( "xmodalg", "lib/alg2obj.gi" );
+ReadPackage( "xmodalg", "lib/module.gi" );
ReadPackage( "xmodalg", "lib/alg2map.gi" );
## temporary fix
diff --git a/tst/algebra.tst b/tst/algebra.tst
index 90f78c4..4363928 100644
--- a/tst/algebra.tst
+++ b/tst/algebra.tst
@@ -10,140 +10,141 @@ gap> SetInfoLevel( InfoXModAlg, 0 );
gap> SetInfoLevel( InfoXModAlg, saved_infolevel_xmodalg );;
gap> STOP_TEST( "algebra.tst", 10000 );
-## Chapter 2, Section 2.1.1
-gap> A5c6 := GroupRing( GF(5), Group( (1,2,3,4,5,6) ) );;
-gap> vecA := BasisVectors( Basis( A5c6 ) );;
-gap> v := vecA[1] + vecA[3] + vecA[5];
+## Section 2.1.1
+gap> A1 := GroupRing( GF(5), Group( (1,2,3,4,5,6) ) );;
+gap> SetName( A1, "A1" );
+gap> BA1 := BasisVectors( Basis( A1 ) );;
+gap> v := BA1[1] + BA1[3] + BA1[5];
(Z(5)^0)*()+(Z(5)^0)*(1,3,5)(2,4,6)+(Z(5)^0)*(1,5,3)(2,6,4)
-gap> I5c6 := Ideal( A5c6, [v] );;
-gap> v2 := vecA[2];
+gap> I1 := Ideal( A1, [v] );;
+gap> SetName( I1, "I1" );
+gap> v1 := BA1[2];
(Z(5)^0)*(1,2,3,4,5,6)
-gap> m2 := RegularAlgebraMultiplier( A5c6, I5c6, v2 );
+gap> m1 := RegularAlgebraMultiplier( A1, I1, v1 );
[ (Z(5)^0)*()+(Z(5)^0)*(1,3,5)(2,4,6)+(Z(5)^0)*(1,5,3)(2,6,4),
(Z(5)^0)*(1,2,3,4,5,6)+(Z(5)^0)*(1,4)(2,5)(3,6)+(Z(5)^0)*(1,6,5,4,3,2) ] ->
[ (Z(5)^0)*(1,2,3,4,5,6)+(Z(5)^0)*(1,4)(2,5)(3,6)+(Z(5)^0)*(1,6,5,4,3,2),
(Z(5)^0)*()+(Z(5)^0)*(1,3,5)(2,4,6)+(Z(5)^0)*(1,5,3)(2,6,4) ]
## Section 2.1.2
-gap> IsAlgebraMultiplier( m2 );
+gap> IsAlgebraMultiplier( m1 );
true
-gap> one := One( A5c6 );;
-gap> L := List( vecA, v -> one );;
-gap> m1 := LeftModuleHomomorphismByImages( A5c6, A5c6, vecA, L );
+gap> one := One( A1 );;
+gap> L1 := List( BA1, v -> one );;
+gap> h1 := LeftModuleHomomorphismByImages( A1, A1, BA1, L1 );
[ (Z(5)^0)*(), (Z(5)^0)*(1,2,3,4,5,6), (Z(5)^0)*(1,3,5)(2,4,6),
(Z(5)^0)*(1,4)(2,5)(3,6), (Z(5)^0)*(1,5,3)(2,6,4), (Z(5)^0)*(1,6,5,4,3,2)
] -> [ (Z(5)^0)*(), (Z(5)^0)*(), (Z(5)^0)*(), (Z(5)^0)*(), (Z(5)^0)*(),
(Z(5)^0)*() ]
-gap> IsAlgebraMultiplier( m1 );
+gap> IsAlgebraMultiplier( h1 );
false
## Section 2.1.3
-gap> v3 := vecA[3];
+gap> u1 := BA1[3];
(Z(5)^0)*(1,3,5)(2,4,6)
-gap> B5c3 := Subalgebra( A5c6, [ v3 ] );;
-gap> M := MultiplierAlgebraOfIdealBySubalgebra( A5c6, I5c6, B5c3 );
+gap> S1 := Subalgebra( A1, [ u1 ] );;
+gap> SetName( S1, "S1" );
+gap> MS1 := MultiplierAlgebraOfIdealBySubalgebra( A1, I1, S1 );
-gap> vecM := BasisVectors( Basis( M ) );;
-gap> vecM[1];
-, (dimension 2
- )> -> ,
- (dimension 2)>>
+gap> SetName( MS1, "MS1" );
+gap> BMS1 := BasisVectors( Basis( MS1 ) );;
+gap> BMS1[1];
+ I1>
## Section 2.1.4
-gap> MA5c6 := MultiplierAlgebra( A5c6 );
+gap> MA1 := MultiplierAlgebra( A1 );
-gap> vecM := BasisVectors( Basis( MA5c6 ) );;
-gap> vecM[3];
- -> >
+gap> BMA1 := BasisVectors( Basis( MA1 ) );;
+gap> BMA1[3];
+ A1>
## Section 2.1.5
-gap> hom := MultiplierHomomorphism( MA5c6 );;
-gap> ImageElm( hom, vecA[2] );
-Basis( ,
-[ (Z(5)^0)*(), (Z(5)^0)*(1,2,3,4,5,6), (Z(5)^0)*(1,3,5)(2,4,6),
+gap> hom1 := MultiplierHomomorphism( MA1 );;
+gap> ImageElm( hom1, BA1[2] );
+Basis( A1, [ (Z(5)^0)*(), (Z(5)^0)*(1,2,3,4,5,6), (Z(5)^0)*(1,3,5)(2\
+,4,6),
(Z(5)^0)*(1,4)(2,5)(3,6), (Z(5)^0)*(1,5,3)(2,6,4), (Z(5)^0)*(1,6,5,4,3,2)
] ) -> [ (Z(5)^0)*(1,2,3,4,5,6), (Z(5)^0)*(1,3,5)(2,4,6),
(Z(5)^0)*(1,4)(2,5)(3,6), (Z(5)^0)*(1,5,3)(2,6,4), (Z(5)^0)*(1,6,5,4,3,2),
(Z(5)^0)*() ]
-## Chapter 2, Section 2.2.1
-gap> A5c6 := GroupRing( GF(5), Group( (1,2,3,4,5,6) ) );;
-gap> vecA := BasisVectors( Basis( A5c6 ) );;
-gap> v := vecA[1] + vecA[3] + vecA[5];
+## Section 2.2.2
+gap> A1 := GroupRing( GF(5), Group( (1,2,3,4,5,6) ) );;
+gap> BA1 := BasisVectors( Basis( A1 ) );;
+gap> v := BA1[1] + BA1[3] + BA1[5];
(Z(5)^0)*()+(Z(5)^0)*(1,3,5)(2,4,6)+(Z(5)^0)*(1,5,3)(2,6,4)
-gap> I5c6 := Ideal( A5c6, [v] );;
-gap> actm := AlgebraActionByMultipliers( A5c6, I5c6, A5c6 );;
-gap> actm2 := Image( actm, vecA[2] );;
-gap> Image( actm2, v );
+gap> I1 := Ideal( A1, [v] );;
+gap> act1 := AlgebraActionByMultipliers( A1, I1, A1 );;
+gap> act12 := Image( act1, BA1[2] );;
+gap> Image( act12, v );
(Z(5)^0)*(1,2,3,4,5,6)+(Z(5)^0)*(1,4)(2,5)(3,6)+(Z(5)^0)*(1,6,5,4,3,2)
-## Section 2.2.2
-gap> theta := NaturalHomomorphismByIdeal( A5c6, I5c6 );
+## Section 2.2.3
+gap> theta1 := NaturalHomomorphismByIdeal( A1, I1 );
-> >
-gap> List( vecA, v -> ImageElm( theta, v ) );
+gap> List( BA1, v -> ImageElm( theta1, v ) );
[ v.1, v.2, v.3, v.4, (Z(5)^2)*v.1+(Z(5)^2)*v.3, (Z(5)^2)*v.2+(Z(5)^2)*v.4 ]
-gap> actp := AlgebraActionBySurjection( theta );
+gap> AlgebraActionBySurjection( theta1 );
kernel of hom is not in the annihilator of A
fail
gap> ## an example which does not fail:
-gap> m := [ [0,1,2,3], [0,0,1,2], [0,0,0,1], [0,0,0,0] ];;
-gap> m^2;
+gap> m2 := [ [0,1,2,3], [0,0,1,2], [0,0,0,1], [0,0,0,0] ];;
+gap> m2^2;
[ [ 0, 0, 1, 4 ], [ 0, 0, 0, 1 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ] ]
-gap> m^3;
+gap> m2^3;
[ [ 0, 0, 0, 1 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ] ]
-gap> A1 := Algebra( Rationals, [m] );;
-gap> SetName( A1, "A1" );
-gap> A3 := Subalgebra( A1, [m^3] );;
-gap> nat3 := NaturalHomomorphismByIdeal( A1, A3 );
- A2 := Algebra( Rationals, [m2] );;
+gap> SetName( A2, "A2" );
+gap> S2 := Subalgebra( A2, [m2^3] );;
+gap> SetName( S2, "S2" );
+gap> nat2 := NaturalHomomorphismByIdeal( A2, S2 );
+ >
-gap> Q13 := Image( nat3 );;
-gap> SetName( Q13, "Q13" );
-gap> Display(nat3);
-LeftModuleHomomorphismByMatrix( Basis( A1,
+gap> Q2 := Image( nat2 );;
+gap> SetName( Q2, "Q2" );
+gap> Display( nat2 );
+LeftModuleHomomorphismByMatrix( Basis( A2,
[ [ [ 0, 0, 0, 1 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ] ],
[ [ 0, 1, 2, 3 ], [ 0, 0, 1, 2 ], [ 0, 0, 0, 1 ], [ 0, 0, 0, 0 ] ],
[ [ 0, 0, 1, 4 ], [ 0, 0, 0, 1 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ] ] ] ),
-[ [ 0, 0 ], [ 1, 0 ], [ 0, 1 ] ], CanonicalBasis( Q13 ) )
-gap> act3 := AlgebraActionBySurjection( nat3 );;
-gap> B3 := Image( act3 );;
-gap> bvB3 := BasisVectors( Basis( B3 ) );;
-gap> b1 := bvB3[1];; b2 := bvB3[2];;
-gap> [ Image(b1,m)=m^2, Image(b1,m^2)=m^3, Image(b1,m^3)=Zero(A1) ];
+[ [ 0, 0 ], [ 1, 0 ], [ 0, 1 ] ], CanonicalBasis( Q2 ) )
+gap> act2 := AlgebraActionBySurjection( nat2 );;
+gap> C2 := Image( act2 );;
+gap> BC2 := BasisVectors( Basis( C2 ) );;
+gap> b1 := BC2[1];; b2 := BC2[2];;
+gap> [ Image(b1,m2)=m2^2, Image(b1,m2^2)=m2^3, Image(b1,m2^3)=Zero(A2) ];
[ true, true, true ]
-gap> [ Image(b2,m)=m^3, b2=b1^2 ];
+gap> [ Image(b2,m2)=m2^3, b2=b1^2 ];
[true, true ]
-## Section 2.2.8
-gap> P := SemidirectProductOfAlgebras( A5c6, actm, I5c6 );
+## Section 2.5.1
+gap> P1 := SemidirectProductOfAlgebras( A1, act1, I1 );
-gap> Embedding( P, 1 );
+gap> Embedding( P1, 1 );
[ (Z(5)^0)*(), (Z(5)^0)*(1,2,3,4,5,6), (Z(5)^0)*(1,3,5)(2,4,6),
(Z(5)^0)*(1,4)(2,5)(3,6), (Z(5)^0)*(1,5,3)(2,6,4), (Z(5)^0)*(1,6,5,4,3,2)
] -> [ v.1, v.2, v.3, v.4, v.5, v.6 ]
-gap> Embedding( P, 2 );
+gap> Embedding( P1, 2 );
[ (Z(5)^0)*()+(Z(5)^0)*(1,3,5)(2,4,6)+(Z(5)^0)*(1,5,3)(2,6,4),
(Z(5)^0)*(1,2,3,4,5,6)+(Z(5)^0)*(1,4)(2,5)(3,6)+(Z(5)^0)*(1,6,5,4,3,2) ] ->
[ v.7, v.8 ]
-gap> Projection( P, 1 );
+gap> Projection( P1, 1 );
[ v.1, v.2, v.3, v.4, v.5, v.6, v.7, v.8 ] ->
[ (Z(5)^0)*(), (Z(5)^0)*(1,2,3,4,5,6), (Z(5)^0)*(1,3,5)(2,4,6),
(Z(5)^0)*(1,4)(2,5)(3,6), (Z(5)^0)*(1,5,3)(2,6,4), (Z(5)^0)*(1,6,5,4,3,2),
of ..., of ... ]
-gap> P3 := SemidirectProductOfAlgebras( Q13, act3, A1 );
-Q13 |X A1
-gap> Embedding( P3, 1 );
+gap> P2 := SemidirectProductOfAlgebras( Q2, act2, A2 );
+Q2 |X A2
+gap> Embedding( P2, 1 );
[ v.1, v.2 ] -> [ v.1, v.2 ]
-gap> Embedding( P3, 2 );
+gap> Embedding( P2, 2 );
[ [ [ 0, 1, 2, 3 ], [ 0, 0, 1, 2 ], [ 0, 0, 0, 1 ], [ 0, 0, 0, 0 ] ],
[ [ 0, 0, 1, 4 ], [ 0, 0, 0, 1 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ] ],
[ [ 0, 0, 0, 1 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ] ] ] ->
[ v.3, v.4, v.5 ]
-## Section 2.3.1
+## Section 2.6.1
gap> A2c6 := GroupRing( GF(2), Group( (1,2,3,4,5,6) ) );;
gap> R2c3 := GroupRing( GF(2), Group( (7,8,9) ) );;
gap> homAR := AllAlgebraHomomorphisms( A2c6, R2c3 );;
diff --git a/tst/cat1.tst b/tst/cat1.tst
index bcda9d9..a97e84e 100644
--- a/tst/cat1.tst
+++ b/tst/cat1.tst
@@ -78,38 +78,36 @@ Cat1-algebra [..=>..] :-
############################
## Chapter 3, Section 3.1.3
gap> C := Cat1AlgebraSelect( 11 );
-|--------------------------------------------------------|
-| 11 is invalid number for Galois Field (GFnum) |
-| Possible numbers for GFnum in the Data : |
-|--------------------------------------------------------|
- [ 2, 3, 4, 5, 7 ]
+|--------------------------------------------------------|
+| 11 is invalid value for the Galois Field (GFnum) |
+| Available values for GFnum in the data : |
+|--------------------------------------------------------|
+ [ 2, 3, 4, 5, 7 ]
Usage: Cat1Algebra( GFnum, gpsize, gpnum, num );
fail
gap> C := Cat1AlgebraSelect( 4, 12 );
-|--------------------------------------------------------|
-| 12 is invalid number for size of group (gpsize) |
-| Possible numbers for the gpsize for GF(4) in the Data: |
-|--------------------------------------------------------|
- [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
+|--------------------------------------------------------|
+| 12 is invalid value for size of group (gpsize) |
+| Available values for gpsize with GF(4) in the data: |
+|--------------------------------------------------------|
Usage: Cat1Algebra( GFnum, gpsize, gpnum, num );
-fail
+[ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
gap> C := Cat1AlgebraSelect( 2, 6, 3 );
-|--------------------------------------------------------|
-| 3 is invalid number for group of order 6 |
-| Possible numbers for the gpnum in the Data : |
-|--------------------------------------------------------|
- [ 1, 2 ]
+|--------------------------------------------------------|
+| 3 is invalid value for groups of order 6 |
+| Available values for gpnum for groups of size 6 : |
+|--------------------------------------------------------|
Usage: Cat1Algebra( GFnum, gpsize, gpnum, num );
-fail
+[ 1, 2 ]
gap> C := Cat1AlgebraSelect( 2, 6, 2 );
-There are 4 cat1-structures for the algebra GF(2)_c6.
- Range Alg Tail Head
-|--------------------------------------------------------|
-| GF(2)_c6 identity map identity map |
-| ----- [ 2, 10 ] [ 2, 10 ] |
-| ----- [ 2, 14 ] [ 2, 14 ] |
-| ----- [ 2, 50 ] [ 2, 50 ] |
-|--------------------------------------------------------|
+There are 4 cat1-structures for the group algebra GF(2)_c6.
+ Range Alg Tail Head
+|--------------------------------------------------------|
+| GF(2)_c6 identity map identity map |
+| ----- [ 2, 10 ] [ 2, 10 ] |
+| ----- [ 2, 14 ] [ 2, 14 ] |
+| ----- [ 2, 50 ] [ 2, 50 ] |
+|--------------------------------------------------------|
Usage: Cat1Algebra( GFnum, gpsize, gpnum, num );
Algebra has generators [ (Z(2)^0)*(), (Z(2)^0)*(1,2,3)(4,5) ]
4
@@ -120,7 +118,6 @@ gap> C0 := Cat1AlgebraSelect( 4, 6, 2, 2 );
gap> Size2d( C0 );
[ 4096, 1024 ]
gap> Display( C0 );
-
Cat1-algebra [GF(2^2)_c6=>..] :-
: source algebra has generators:
[ (Z(2)^0)*(), (Z(2)^0)*(1,2,3,4,5,6) ]
@@ -167,7 +164,6 @@ gap> CC3 := SubCat1Algebra( C3, AA3, BB3 );
[Algebra( GF(2), [ of ..., (Z(2)^0)*(), (Z(2)^0)*()+(Z(2)^0)*(4,5)
] ) -> Algebra( GF(2), [ of ..., (Z(2)^0)*() ] )]
gap> Display( CC3 );
-
Cat1-algebra [..=>..] :-
: source algebra has generators:
[ of ..., (Z(2)^0)*(), (Z(2)^0)*()+(Z(2)^0)*(4,5) ]
@@ -185,13 +181,14 @@ Cat1-algebra [..=>..] :-
[ of ..., of ... ]
: kernel embedding maps generators of kernel to:
[ of ..., (Z(2)^0)*()+(Z(2)^0)*(4,5) ]
+gap> IsSubCat1Algebra( C3, CC3 );
+true
############################
## Chapter 3, Section 3.2.2
gap> C1 := Cat1AlgebraSelect( 2, 1, 1, 1 );
[GF(2)_triv -> GF(2)_triv]
gap> Display( C1 );
-
Cat1-algebra [GF(2)_triv=>GF(2)_triv] :-
: source algebra has generators:
[ (Z(2)^0)*(), (Z(2)^0)*() ]
@@ -204,11 +201,9 @@ Cat1-algebra [GF(2)_triv=>GF(2)_triv] :-
: range embedding maps range generators to:
[ (Z(2)^0)*(), (Z(2)^0)*() ]
: the kernel is trivial.
-
gap> C2 := Cat1AlgebraSelect( 2, 2, 1, 2 );
[GF(2)_c2 -> GF(2)_triv]
gap> Display( C2 );
-
Cat1-algebra [GF(2)_c2=>GF(2)_triv] :-
: source algebra has generators:
[ (Z(2)^0)*(), (Z(2)^0)*(1,2) ]
@@ -226,7 +221,6 @@ Cat1-algebra [GF(2)_c2=>GF(2)_triv] :-
[ of ... ]
: kernel embedding maps generators of kernel to:
[ (Z(2)^0)*()+(Z(2)^0)*(1,2) ]
-
gap> C1 = C2;
false
gap> R1 := Source( C1 );;
@@ -252,7 +246,7 @@ gap> f2 := AlgebraHomomorphismByImages( S1, S2, gS1, im2 );
[ (Z(2)^0)*(), (Z(2)^0)*() ] -> [ (Z(2)^0)*(), (Z(2)^0)*() ]
gap> m := Cat1AlgebraMorphism( C1, C2, f1, f2 );
[[GF(2)_triv=>GF(2)_triv] => [GF(2)_c2=>GF(2)_triv]]
-gap> Display( m );
+gap> Display( m );
Morphism of cat1-algebras :-
: Source = [GF(2)_triv=>GF(2)_triv] with generating sets:
@@ -279,7 +273,6 @@ false
## Chapter 3, Section 3.2.3
gap> imm := ImagesSource2DimensionalMapping( m );;
gap> Display( imm );
-
Cat1-algebra [..=>..] :-
: source algebra has generators:
[ (Z(2)^0)*(), (Z(2)^0)*() ]
@@ -292,7 +285,6 @@ Cat1-algebra [..=>..] :-
: range embedding maps range generators to:
[ (Z(2)^0)*() ]
: the kernel is trivial.
-
gap> SetInfoLevel( InfoXModAlg, saved_infolevel_xmodalg );;
gap> STOP_TEST( "cat1.tst", 10000 );
diff --git a/tst/module.tst b/tst/module.tst
new file mode 100644
index 0000000..f1fe462
--- /dev/null
+++ b/tst/module.tst
@@ -0,0 +1,215 @@
+############################################################################
+##
+#W module.tst XModAlg test files Chris Wensley
+##
+#@local level,m3,A3,G,B3,g3,mg3,MB3,hom3,act3,bdy3,X3,A4,V4,M4,famM4,v4,genM4,u4,D4,T4,B4a,B4,M2B4,B2M4,act4,a4,X4,C4,A3B3,hom,actMA3,act5,act6,A6,B6,em3,ea4
+
+gap> START_TEST( "XModAlg package: module.tst" );
+gap> level := InfoLevel( InfoXModAlg );;
+gap> SetInfoLevel( InfoXModAlg, 0 );
+
+## Section 2.2.4
+gap> m3 := [ [0,1,0], [0,0,1], [1,0,0,] ];;
+gap> A3 := Algebra( Rationals, [m3] );;
+gap> SetName( A3, "A3" );;
+gap> G := Group( (1,2,3) );;
+gap> B3 := GroupRing( Rationals, G );;
+gap> SetName( B3, "GR(G)" );
+gap> g3 := GeneratorsOfAlgebra( B3 )[2];;
+gap> mg3 := RegularAlgebraMultiplier( B3, B3, g3 );;
+gap> MB3 := AlgebraByGenerators( Rationals, [ mg3 ] );;
+gap> hom3 := AlgebraHomomorphismByImages( A3, MB3, [ m3 ], [ mg3 ] );;
+gap> act3 := AlgebraActionByHomomorphism( hom3, B3 );
+[ [ [ 0, 1, 0 ], [ 0, 0, 1 ], [ 1, 0, 0 ] ] ] ->
+[ [ (1)*(), (1)*(1,2,3), (1)*(1,3,2) ] -> [ (1)*(1,2,3), (1)*(1,3,2), (1)*()
+ ] ]
+
+## .1.7
+gap> hom3 := AlgebraHomomorphismByImages( A3, MB3, [ m3 ], [ mg3 ] );
+[ [ [ 0, 1, 0 ], [ 0, 0, 1 ], [ 1, 0, 0 ] ] ] ->
+[ [ (1)*(), (1)*(1,2,3), (1)*(1,3,2) ] -> [ (1)*(1,2,3), (1)*(1,3,2), (1)*()
+ ] ]
+gap> bdy3 := AlgebraHomomorphismByImages( B3, A3, [ g3 ], [ m3 ] );
+[ (1)*(1,2,3) ] -> [ [ [ 0, 1, 0 ], [ 0, 0, 1 ], [ 1, 0, 0 ] ] ]
+gap> X3 := XModAlgebraByBoundaryAndAction( bdy3, act3 );
+[ GR(G) -> A3 ]
+gap> Display( X3 );
+
+Crossed module [GR(G) -> A3] :-
+: Source algebra GR(G) has generators:
+ [ (1)*(), (1)*(1,2,3) ]
+: Range algebra A3 has generators:
+ [ [ [ 0, 1, 0 ], [ 0, 0, 1 ], [ 1, 0, 0 ] ] ]
+: Boundary homomorphism maps source generators to:
+ [ [ [ 1, 0, 0 ], [ 0, 1, 0 ], [ 0, 0, 1 ] ],
+ [ [ 0, 1, 0 ], [ 0, 0, 1 ], [ 1, 0, 0 ] ] ]
+
+## Section 2.3
+gap> m3 := [ [0,1,0], [0,0,1], [1,0,0] ];;
+gap> A4 := Algebra( Rationals, [m3] );;
+gap> SetName( A4, "A4" );;
+gap> V4 := Rationals^3;;
+gap> M4 := LeftAlgebraModule( A4, \*, V4 );;
+gap> SetName( M4, "M4" );
+gap> famM4 := ElementsFamily( FamilyObj( M4 ) );;
+gap> v4 := [3,4,5];;
+gap> v4 := ObjByExtRep( famM4, v4 );
+[ 3, 4, 5 ]
+gap> m3*v4;
+[ 4, 5, 3 ]
+gap> genM4 := GeneratorsOfLeftModule( M4 );;
+gap> u4 := 6*genM4[1] + 7*genM4[2] + 8*genM4[3];
+[ 6, 7, 8 ]
+gap> u4 := ExtRepOfObj( u4 );
+[ 6, 7, 8 ]
+
+## Section 2.3.1
+gap> D4 := LeftActingDomain( M4 );;
+gap> T4 := EmptySCTable( Dimension(M4), Zero(D4), "symmetric" );;
+gap> B4a := AlgebraByStructureConstants( D4, T4 );
+
+gap> GeneratorsOfAlgebra( B4a );
+[ v.1, v.2, v.3 ]
+gap> B4 := ModuleAsAlgebra( M4 );
+A(M4)
+gap> GeneratorsOfAlgebra( B4 );
+[ [[ 1, 0, 0 ]], [[ 0, 1, 0 ]], [[ 0, 0, 1 ]] ]
+
+## Section 2.3.2
+gap> IsModuleAsAlgebra( B4 );
+true
+gap> IsModuleAsAlgebra( A4 );
+false
+
+## Section 2.3.3
+gap> KnownAttributesOfObject( B4 );
+[ "Name", "ZeroImmutable", "LeftActingDomain", "Dimension",
+ "GeneratorsOfLeftOperatorAdditiveGroup", "GeneratorsOfLeftOperatorRing",
+ "ModuleToAlgebraIsomorphism", "AlgebraToModuleIsomorphism" ]
+gap> M2B4 := ModuleToAlgebraIsomorphism( B4 );
+[ [ 1, 0, 0 ], [ 0, 1, 0 ], [ 0, 0, 1 ] ] -> [ [[ 1, 0, 0 ]], [[ 0, \
+1, 0 ]],
+ [[ 0, 0, 1 ]] ]
+gap> Source( M2B4 ) = M4;
+false
+gap> Source( M2B4 ) = V4;
+true
+gap> B2M4 := AlgebraToModuleIsomorphism( B4 );
+[ [[ 1, 0, 0 ]], [[ 0, 1, 0 ]], [[ 0, 0, 1 ]] ] ->
+[ [ 1, 0, 0 ], [ 0, 1, 0 ], [ 0, 0, 1 ] ]
+gap> Range( B2M4 ) = M4;
+false
+gap> Range( B2M4 ) = V4;
+true
+
+## Section 2.3.4
+gap> act4 := AlgebraActionByModule( A4, M4 );
+[ [ [ 0, 1, 0 ], [ 0, 0, 1 ], [ 1, 0, 0 ] ] ] ->
+[ [ [[ 1, 0, 0 ]], [[ 0, 1, 0 ]], [[ 0, 0, 1 ]] ] ->
+ [ [[ 0, 0, 1 ]], [[ 1, 0, 0 ]], [[ 0, 1, 0 ]] ] ]
+gap> a4 := 2*m3 + 3*m3^2;
+[ [ 0, 2, 3 ], [ 3, 0, 2 ], [ 2, 3, 0 ] ]
+gap> Image( act4, a4 );
+Basis( A(M4), [ [[ 1, 0, 0 ]], [[ 0, 1, 0 ]], [[ 0, 0, 1 ]] ] ) ->
+[ (3)*[[ 0, 1, 0 ]]+(2)*[[ 0, 0, 1 ]], (2)*[[ 1, 0, 0 ]]+(3)*[[ 0, 0, 1 ]],
+ (3)*[[ 1, 0, 0 ]]+(2)*[[ 0, 1, 0 ]] ]
+gap> Image( act4 );
+
+
+## Section 4.1.8
+gap> X4 := XModAlgebraByModule( A4, M4 );
+[A(M4)->A4]
+gap> Display( X4 );
+
+Crossed module [A(M4)->A4] :-
+: Source algebra A(M4) has generators:
+ [ [[ 1, 0, 0 ]], [[ 0, 1, 0 ]], [[ 0, 0, 1 ]] ]
+: Range algebra A4 has generators:
+ [ [ [ 0, 1, 0 ], [ 0, 0, 1 ], [ 1, 0, 0 ] ] ]
+: Boundary homomorphism maps source generators to:
+ [ [ [ 0, 0, 0 ], [ 0, 0, 0 ], [ 0, 0, 0 ] ],
+ [ [ 0, 0, 0 ], [ 0, 0, 0 ], [ 0, 0, 0 ] ],
+ [ [ 0, 0, 0 ], [ 0, 0, 0 ], [ 0, 0, 0 ] ] ]
+
+## Section 5.1.1
+gap> C4 := Cat1AlgebraOfXModAlgebra( X4 );
+[A4 |X A(M4) -> A4]
+gap> Display( C4 );
+Cat1-algebra [A4 |X A(M4)=>A4] :-
+: range algebra has generators:
+ [ [ [ 0, 1, 0 ], [ 0, 0, 1 ], [ 1, 0, 0 ] ] ]
+: tail homomorphism = head homomorphism
+ they map the source generators to:
+ [ [ [ 0, 1, 0 ], [ 0, 0, 1 ], [ 1, 0, 0 ] ],
+ [ [ 0, 0, 1 ], [ 1, 0, 0 ], [ 0, 1, 0 ] ],
+ [ [ 1, 0, 0 ], [ 0, 1, 0 ], [ 0, 0, 1 ] ],
+ [ [ 0, 0, 0 ], [ 0, 0, 0 ], [ 0, 0, 0 ] ],
+ [ [ 0, 0, 0 ], [ 0, 0, 0 ], [ 0, 0, 0 ] ],
+ [ [ 0, 0, 0 ], [ 0, 0, 0 ], [ 0, 0, 0 ] ] ]
+: range embedding maps range generators to:
+ [ v.1 ]
+: kernel has generators:
+ [ v.4, v.5, v.6 ]
+
+## Section 2.4.1
+gap> A3B3 := DirectSumOfAlgebras( A3, B3 );;
+gap> SetName( A3B3, Concatenation( Name(A3), "(+)", Name(B3) ) );
+gap> SetDirectSumOfAlgebrasInfo( A3B3,
+> rec( algebras := [A3,B3], first := [1,Dimension(A3)+1],
+> embeddings := [ ], projections := [ ] ) );;
+
+## Section 2.4.2
+gap> Embedding( A3B3, 1 );
+Basis( A3, [ [ [ 0, 1, 0 ], [ 0, 0, 1 ], [ 1, 0, 0 ] ],
+ [ [ 0, 0, 1 ], [ 1, 0, 0 ], [ 0, 1, 0 ] ],
+ [ [ 1, 0, 0 ], [ 0, 1, 0 ], [ 0, 0, 1 ] ] ] ) -> [ v.1, v.2, v.3 ]
+gap> Projection( A3B3, 2 );
+CanonicalBasis( A3(+)GR(G) ) -> [ of ..., of ...,
+ of ..., (1)*(), (1)*(1,2,3), (1)*(1,3,2) ]
+
+## Section 2.4.3
+gap> hom := DirectSumOfAlgebraHomomorphisms( hom3, hom3 );;
+gap> Print( hom, "\n" );
+AlgebraHomomorphismByImages( A3(+)A3, Algebra( Rationals,
+[ v.1, v.2, v.3, v.4, v.5, v.6 ] ),
+[ [ [ 0, 1, 0, 0, 0, 0 ], [ 0, 0, 1, 0, 0, 0 ], [ 1, 0, 0, 0, 0, 0 ],
+ [ 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ] ],
+ [ [ 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ],
+ [ 0, 0, 0, 0, 1, 0 ], [ 0, 0, 0, 0, 0, 1 ], [ 0, 0, 0, 1, 0, 0 ] ] ],
+[ v.1, v.4 ] )
+
+## Section 2.4.4
+gap> actMA3 := AlgebraActionByMultipliers( A3, A3, A3 );;
+gap> act5 := AlgebraActionOnDirectSum( actMA3, act3 );
+[ [ [ 0, 1, 0 ], [ 0, 0, 1 ], [ 1, 0, 0 ] ],
+ [ [ 0, 0, 1 ], [ 1, 0, 0 ], [ 0, 1, 0 ] ],
+ [ [ 1, 0, 0 ], [ 0, 1, 0 ], [ 0, 0, 1 ] ] ] ->
+[ [ v.1, v.2, v.3, v.4, v.5, v.6 ] -> [ v.2, v.3, v.1, v.5, v.6, v.4 ],
+ [ v.1, v.2, v.3, v.4, v.5, v.6 ] -> [ v.3, v.1, v.2, v.6, v.4, v.5 ],
+ [ v.1, v.2, v.3, v.4, v.5, v.6 ] -> [ v.1, v.2, v.3, v.4, v.5, v.6 ] ]
+
+## Section 2.4.5
+gap> act6 := DirectSumOfAlgebraActions( act3, act4 );;
+gap> A6 := Source( act6 );
+A3(+)A4
+gap> B6 := AlgebraActedOn( act6 );
+GR(G)(+)A(M4)
+gap> em3 := ImageElm( Embedding( A6, 1 ), m3 );
+[ [ 0, 1, 0, 0, 0, 0 ], [ 0, 0, 1, 0, 0, 0 ], [ 1, 0, 0, 0, 0, 0 ],
+ [ 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ] ]
+gap> ImageElm( act6, em3 );
+Basis( GR(G)(+)A(M4), [ v.1, v.2, v.3, v.4, v.5, v.6 ] ) ->
+[ v.2, v.3, v.1, 0*v.1, 0*v.1, 0*v.1 ]
+gap> ea4 := ImageElm( Embedding( A6, 2 ), a4 );
+[ [ 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0 ],
+ [ 0, 0, 0, 0, 2, 3 ], [ 0, 0, 0, 3, 0, 2 ], [ 0, 0, 0, 2, 3, 0 ] ]
+gap> ImageElm( act6, ea4 );
+Basis( GR(G)(+)A(M4), [ v.1, v.2, v.3, v.4, v.5, v.6 ] ) ->
+[ 0*v.1, 0*v.1, 0*v.1, (3)*v.5+(2)*v.6, (2)*v.4+(3)*v.6, (3)*v.4+(2)*v.5 ]
+
+gap> SetInfoLevel( InfoXModAlg, level );;
+gap> STOP_TEST( "module.tst", 10000 );
+
+############################################################################
+##
+#E module.tst . . . . . . . . . . . . . . . . . . . . . . . . . . ends here
\ No newline at end of file
diff --git a/tst/module3.tst b/tst/module3.tst
deleted file mode 100644
index ea7fd2d..0000000
--- a/tst/module3.tst
+++ /dev/null
@@ -1,123 +0,0 @@
-############################################################################
-##
-#W module3.tst XModAlg test files Chris Wensley
-##
-#@local level,m,A3,V3,M3,famM3,v,v2,genM3,u2,u,D3,T3,B3a,B3,M2B3,B2M3,act3,a,X3,C3
-
-gap> START_TEST( "XModAlg package: module3.tst" );
-gap> level := InfoLevel( InfoXModAlg );;
-gap> SetInfoLevel( InfoXModAlg, 0 );
-
-## Chapter 2, Section 2.2.3
-gap> m := [ [0,1,0], [0,0,1], [1,0,0] ];;
-gap> A3 := Algebra( Rationals, [m] );;
-gap> SetName( A3, "A3" );;
-gap> V3 := Rationals^3;;
-gap> M3 := LeftAlgebraModule( A3, \*, V3 );;
-gap> SetName( M3, "M3" );
-gap> famM3 := ElementsFamily( FamilyObj( M3 ) );;
-gap> v := [3,4,5];;
-gap> v2 := ObjByExtRep( famM3, v );
-[ 3, 4, 5 ]
-gap> m*v2;
-[ 4, 5, 3 ]
-gap> genM3 := GeneratorsOfLeftModule( M3 );;
-gap> u2 := 6*genM3[1] + 7*genM3[2] + 8*genM3[3];
-[ 6, 7, 8 ]
-gap> u := ExtRepOfObj( u2 );
-[ 6, 7, 8 ]
-
-## Chapter 2, Section 2.2.4
-gap> D3 := LeftActingDomain( M3 );;
-gap> T3 := EmptySCTable( Dimension(M3), Zero(D3), "symmetric" );;
-gap> B3a := AlgebraByStructureConstants( D3, T3 );
-
-gap> GeneratorsOfAlgebra( B3a );
-[ v.1, v.2, v.3 ]
-gap> B3 := ModuleAsAlgebra( M3 );
-A(M3)
-gap> GeneratorsOfAlgebra( B3 );
-[ [[ 1, 0, 0 ]], [[ 0, 1, 0 ]], [[ 0, 0, 1 ]] ]
-
-## Chapter 2, Section 2.2.5
-gap> IsModuleAsAlgebra( B3 );
-true
-gap> IsModuleAsAlgebra( A3 );
-false
-
-## Chapter 2, Section 2.2.6
-gap> KnownAttributesOfObject( B3 );
-[ "Name", "ZeroImmutable", "LeftActingDomain", "Dimension",
- "GeneratorsOfLeftOperatorAdditiveGroup", "GeneratorsOfLeftOperatorRing",
- "ModuleToAlgebraIsomorphism", "AlgebraToModuleIsomorphism" ]
-gap> M2B3 := ModuleToAlgebraIsomorphism( B3 );
-[ [ 1, 0, 0 ], [ 0, 1, 0 ], [ 0, 0, 1 ] ] -> [ [[ 1, 0, 0 ]], [[ 0, \
-1, 0 ]],
- [[ 0, 0, 1 ]] ]
-gap> Source( M2B3 ) = M3;
-false
-gap> Source( M2B3 ) = V3;
-true
-gap> B2M3 := AlgebraToModuleIsomorphism( B3 );
-[ [[ 1, 0, 0 ]], [[ 0, 1, 0 ]], [[ 0, 0, 1 ]] ] ->
-[ [ 1, 0, 0 ], [ 0, 1, 0 ], [ 0, 0, 1 ] ]
-gap> Range( B2M3 ) = M3;
-false
-gap> Range( B2M3 ) = V3;
-true
-
-## Chapter 2, Section 2.2.7
-gap> act3 := AlgebraActionByModule( A3, M3 );
-[ [ [ 0, 1, 0 ], [ 0, 0, 1 ], [ 1, 0, 0 ] ] ] ->
-[ [ [[ 1, 0, 0 ]], [[ 0, 1, 0 ]], [[ 0, 0, 1 ]] ] ->
- [ [[ 0, 0, 1 ]], [[ 1, 0, 0 ]], [[ 0, 1, 0 ]] ] ]
-gap> a := 2*m + 3*m^2;
-[ [ 0, 2, 3 ], [ 3, 0, 2 ], [ 2, 3, 0 ] ]
-gap> Image( act3, a );
-Basis( A(M3), [ [[ 1, 0, 0 ]], [[ 0, 1, 0 ]], [[ 0, 0, 1 ]] ] ) ->
-[ (3)*[[ 0, 1, 0 ]]+(2)*[[ 0, 0, 1 ]], (2)*[[ 1, 0, 0 ]]+(3)*[[ 0, 0, 1 ]],
- (3)*[[ 1, 0, 0 ]]+(2)*[[ 0, 1, 0 ]] ]
-gap> Image( act3 );
-
-
-## Chapter 4, Section 4.1.7
-gap> X3 := XModAlgebraByModule( A3, M3 );
-[A(M3)->A3]
-gap> Display( X3 );
-
-Crossed module [A(M3)->A3] :-
-: Source algebra A(M3) has generators:
- [ [[ 1, 0, 0 ]], [[ 0, 1, 0 ]], [[ 0, 0, 1 ]] ]
-: Range algebra A3 has generators:
- [ [ [ 0, 1, 0 ], [ 0, 0, 1 ], [ 1, 0, 0 ] ] ]
-: Boundary homomorphism maps source generators to:
- [ [ [ 0, 0, 0 ], [ 0, 0, 0 ], [ 0, 0, 0 ] ],
- [ [ 0, 0, 0 ], [ 0, 0, 0 ], [ 0, 0, 0 ] ],
- [ [ 0, 0, 0 ], [ 0, 0, 0 ], [ 0, 0, 0 ] ] ]
-
-## Chapter 5, Section 5.1.1
-gap> C3 := Cat1AlgebraOfXModAlgebra( X3 );
-[A3 |X A(M3) -> A3]
-gap> Display( C3 );
-Cat1-algebra [A3 |X A(M3)=>A3] :-
-: range algebra has generators:
- [ [ [ 0, 1, 0 ], [ 0, 0, 1 ], [ 1, 0, 0 ] ] ]
-: tail homomorphism = head homomorphism
- they map the source generators to:
- [ [ [ 0, 1, 0 ], [ 0, 0, 1 ], [ 1, 0, 0 ] ],
- [ [ 0, 0, 1 ], [ 1, 0, 0 ], [ 0, 1, 0 ] ],
- [ [ 1, 0, 0 ], [ 0, 1, 0 ], [ 0, 0, 1 ] ],
- [ [ 0, 0, 0 ], [ 0, 0, 0 ], [ 0, 0, 0 ] ],
- [ [ 0, 0, 0 ], [ 0, 0, 0 ], [ 0, 0, 0 ] ],
- [ [ 0, 0, 0 ], [ 0, 0, 0 ], [ 0, 0, 0 ] ] ]
-: range embedding maps range generators to:
- [ v.1 ]
-: kernel has generators:
- [ v.4, v.5, v.6 ]
-
-gap> SetInfoLevel( InfoXModAlg, level );;
-gap> STOP_TEST( "module3.tst", 10000 );
-
-############################################################################
-##
-#E module3.tst . . . . . . . . . . . . . . . . . . . . . . . . . ends here
diff --git a/tst/xmod.tst b/tst/xmod.tst
index 1c4082e..4bb2bf0 100644
--- a/tst/xmod.tst
+++ b/tst/xmod.tst
@@ -7,13 +7,13 @@ gap> saved_infolevel_xmodalg := InfoLevel( InfoXModAlg );;
gap> SetInfoLevel( InfoXModAlg, 0 );
## make this test independent of algebra.tst
-gap> m := [ [0,1,2,3], [0,0,1,2], [0,0,0,1], [0,0,0,0] ];;
-gap> A1 := Algebra( Rationals, [m] );;
-gap> SetName( A1, "A1" );
-gap> A3 := Subalgebra( A1, [m^3] );;
-gap> nat3 := NaturalHomomorphismByIdeal( A1, A3 );;
-gap> Q13 := Image( nat3 );;
-gap> SetName( Q13, "Q13" );
+gap> m2 := [ [0,1,2,3], [0,0,1,2], [0,0,0,1], [0,0,0,0] ];;
+gap> A2 := Algebra( Rationals, [m2] );;
+gap> SetName( A2, "A2" );
+gap> S2 := Subalgebra( A2, [m2^3] );;
+gap> nat2 := NaturalHomomorphismByIdeal( A2, S2 );;
+gap> Q2 := Image( nat2 );;
+gap> SetName( Q2, "Q2" );
## Chapter 4, Section 4.1.2
gap> F := GF(5);;
@@ -64,27 +64,27 @@ gap> Size2d( XIAk4 );
[ 125, 625 ]
gap> ############################
-gap> ## Section 4.1.4
+gap> ## Section 4.1.5
gap> XA := XModAlgebraByMultiplierAlgebra( A );
[ A(l,m) -> ]
gap> XModAlgebraAction( XA );
IdentityMapping( )
gap> ############################
-gap> ## Section 4.1.5
-gap> X3 := XModAlgebraBySurjection( nat3 );;
-gap> Display( X3 );
+gap> ## Section 4.1.6
+gap> X2 := XModAlgebraBySurjection( nat2 );;
+gap> Display( X2 );
-Crossed module [A1->Q13] :-
-: Source algebra A1 has generators:
+Crossed module [A2->Q2] :-
+: Source algebra A2 has generators:
[ [ [ 0, 1, 2, 3 ], [ 0, 0, 1, 2 ], [ 0, 0, 0, 1 ], [ 0, 0, 0, 0 ] ] ]
-: Range algebra Q13 has generators:
+: Range algebra Q2 has generators:
[ v.1, v.2 ]
: Boundary homomorphism maps source generators to:
[ v.1 ]
gap> ############################
-gap> ## Section 4.1.6
+gap> ## Section ???
gap> G := SmallGroup( 4, 2 );
gap> F := GaloisField( 4 );
@@ -138,10 +138,12 @@ gap> Set( kpo );
"IsRDistributive", "IsXModAlgebra" ]
gap> kao := KnownAttributesOfObject( XIAk4 );;
gap> Set( kao );
-[ "Boundary", "Name", "Range", "Size2d", "Source", "XModAlgebraAction" ]
+[ "Boundary", "LeftActingDomain", "Name", "Range", "Size2d", "Source\
+",
+ "XModAlgebraAction" ]
gap> ############################
-gap> ## Section 4.1.9
+gap> ## Section 4.1.10
gap> e4 := Elements( IAk4 )[4];
(Z(5)^0)* of ...+(Z(5)^0)*f1+(Z(5)^2)*f2+(Z(5)^2)*f1*f2
gap> Je4 := Ideal( IAk4, [e4] );;