From 2e501e3baebdac4f8ad08017968229b5712aa7bd Mon Sep 17 00:00:00 2001 From: cdwensley Date: Thu, 20 Jun 2024 15:49:17 +0100 Subject: [PATCH 1/5] adjustments to the manual --- doc/cat1.xml | 122 ++++++++++++++++++++++++------------------------- doc/xmod.xml | 38 +++++++-------- lib/alg2obj.gd | 2 +- lib/alg2obj.gi | 52 ++++++++++++--------- tst/cat1.tst | 60 +++++++++++------------- 5 files changed, 136 insertions(+), 138 deletions(-) diff --git a/doc/cat1.xml b/doc/cat1.xml index d8de0b1..2195f63 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 | @@ -241,8 +242,9 @@ gap> C0 := Cat1AlgebraSelect( 4, 6, 2, 2 ); 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 +273,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 +330,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 +378,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 +421,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 +437,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 +454,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 +514,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 +526,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..0191141 100644 --- a/doc/xmod.xml +++ b/doc/xmod.xml @@ -317,9 +317,9 @@ gap> Print( KnownAttributesOfObject(XIAk4), "\n" ); + Arg="alg src rng" /> + Arg="alg sub" /> A crossed module \mathcal{X}^{\prime } = (\partial ^{\prime }:S^{\prime}\rightarrow R^{\prime }) @@ -407,26 +407,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 +484,7 @@ true + Arg="mor" /> Let (\theta,\varphi) : \mathcal{X} = (\partial : S \rightarrow R) \rightarrow \mathcal{X}^{\prime} = (\partial^{\prime} @@ -515,7 +515,7 @@ true + Arg="mor" /> Let (\theta,\varphi) : \mathcal{X} = (\partial : S \rightarrow R) \rightarrow \mathcal{X}^{\prime} = (\partial^{\prime} : S^{\prime} @@ -541,15 +541,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/lib/alg2obj.gd b/lib/alg2obj.gd index bf9b0cb..f7b70ca 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 ########################### diff --git a/lib/alg2obj.gi b/lib/alg2obj.gi index 5fac53d..9cc59b0 100644 --- a/lib/alg2obj.gi +++ b/lib/alg2obj.gi @@ -1247,29 +1247,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 +1284,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 +1296,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 +1358,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 +1381,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/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 ); From c7cdbb93b8dd978c6837027f6a8fb3cdf217925c Mon Sep 17 00:00:00 2001 From: cdwensley Date: Wed, 26 Jun 2024 19:07:08 +0100 Subject: [PATCH 2/5] added AlgebraActionByHomomorphism --- CHANGES.md | 6 ++ PackageInfo.g | 2 +- doc/algebra.xml | 7 +++ doc/cat1.xml | 11 ++++ doc/xmod.xml | 97 +++++++++------------------------ lib/alg2obj.gd | 5 ++ lib/alg2obj.gi | 59 +++++++++----------- lib/algebra.gd | 6 +- lib/algebra.gi | 91 ++++++++++++------------------- lib/module.gd | 97 ++++++++++++++++++++++++++++++++- lib/module.gi | 40 ++++++++++++-- tst/{module3.tst => module.tst} | 46 ++++++++++++++-- tst/xmod.tst | 4 +- 13 files changed, 295 insertions(+), 176 deletions(-) rename tst/{module3.tst => module.tst} (72%) diff --git a/CHANGES.md b/CHANGES.md index 52ac218..f64c6ec 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,5 +1,11 @@ # CHANGES to the 'XModAlg' package +## 1.25 -> 1.25dev (26/06/24) + * (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..0bc7eb7 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 := "26/06/2024", # dd/mm/yyyy format License := "GPL-2.0-or-later", Persons := [ diff --git a/doc/algebra.xml b/doc/algebra.xml index 1136ab0..eb1ecef 100644 --- a/doc/algebra.xml +++ b/doc/algebra.xml @@ -209,6 +209,11 @@ 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. +

+ @@ -305,6 +310,8 @@ gap> [ Image(b2,m)=m^3, b2=b1^2 ]; +<#Include Label="AlgebraActionByHomomorphism"> + <#Include Label="AlgebraModules"> <#Include Label="ModuleAsAlgebra"> diff --git a/doc/cat1.xml b/doc/cat1.xml index 2195f63..08ad795 100644 --- a/doc/cat1.xml +++ b/doc/cat1.xml @@ -236,6 +236,17 @@ There are 4 cat1-structures for the group 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)+( diff --git a/doc/xmod.xml b/doc/xmod.xml index 0191141..85187a9 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. @@ -180,64 +193,7 @@ Crossed module [A1->Q13] :- ]]> -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="XModAlgebraByBoundaryAndAction"> <#Include Label="XModAlgebraByModule"> @@ -301,17 +257,16 @@ 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" ] ]]> diff --git a/lib/alg2obj.gd b/lib/alg2obj.gd index f7b70ca..8119607 100644 --- a/lib/alg2obj.gd +++ b/lib/alg2obj.gd @@ -30,6 +30,11 @@ DeclareProperty( "IsPreXModAlgebra", Is2dAlgebra ); DeclareProperty( "IsXModAlgebra", Is2dAlgebra ); InstallTrueMethod( IsPreXModAlgebra, IsXModAlgebra ); +BindGlobal( "PreXModAlgebraObjType", + NewType( Family2dAlgebra, IsPreXModAlgebraObj ) ); +BindGlobal( "PreCat1AlgebraObjType", + NewType( Family2dAlgebra, IsPreCat1AlgebraObj ) ); + DeclareAttribute( "XModAlgebraAction", IsPreXModAlgebra ); DeclareOperation( "XModAlgebraObj", diff --git a/lib/alg2obj.gi b/lib/alg2obj.gi index 9cc59b0..7311197 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; @@ -106,11 +109,15 @@ InstallMethod( XModAlgebraObj, "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 +129,22 @@ 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 ); + + ## check axiom XModAlg1 if not IsPreXModAlgebra( PM ) then - return false; + return fail; fi; - # name := Name( PM ); return PM; end ); @@ -174,7 +182,7 @@ function ( P, Q ) else gS := S; fi; - #####£ + ###### for r in gR do for s in gS do im1 := Image( aP, [r,s] ); @@ -380,24 +388,11 @@ InstallMethod( PreXModAlgebraByBoundaryAndAction, 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 ); ############################################################################ @@ -413,7 +408,7 @@ function( bdy, act ) 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 ); 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..f87e38e 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 , result - AB := Source(ac); - B := Elements(Range(ac)); - A := Elements(LeftElementOfCartesianProduct(ac)); - uzB := Length(B); - uzA := Length(A); - for j in [1..uzB] do - if One(LeftElementOfCartesianProduct(ac))*B[j]<>B[j] then +#M IsAlgebraAction( ) +## +InstallMethod( IsAlgebraAction, "for an algebra homomorphism", true, + [ IsAlgebraHomomorphism ], 0, +function ( hom ) + local A, C, genC, g1, g; + C := Range( hom ); + ## check that C is an algebra of isomorphism of A + genC := GeneratorsOfAlgebra( C ); + g1 := genC[1]; + if not IsLeftModuleHomomorphism( g1 ) then + Info( InfoXModAlg, 1, "g1 is not a left module homomorphism" ); + return false; + fi; + A := Source( g1 ); + for g in genC do + if not ( Source( g ) = A ) and ( Range( g ) = A ) then + Info( InfoXModAlg, 1, "source and/or range <> A" ); + return false; + fi; + if not IsBijective( g ) then + Info( InfoXModAlg, 1, "a generator of C is not bijective" ); return false; fi; - for k in [1..uzA] do - for i in [1..uzA] do - if (((A[k]*A[i])*B[j])<>(A[k]*(A[i]*B[j]))) then - return false; - fi; - od; - od; od; return true; end ); @@ -514,17 +516,18 @@ function( arg ) # Algebra, Ideal, and Subalgebra if ( ( nargs = 3 ) and ForAll( arg, IsAlgebra ) ) then return AlgebraActionByMultipliers( arg[1], arg[2], arg[3] ); - # Multiplier Action - elif ( ( nargs = 1 ) and IsAlgebra( arg[1] ) ) then - return AlgebraAction2( arg[1] ); + # module and zero map + elif ( ( nargs = 2 ) and IsAlgebra( arg[1] ) + and IsLeftModule( arg[2] ) ) then + return AlgebraActionByModule( arg[1],arg[2] ); + # action homomorphism and algebra acted on + elif ( nargs = 2 ) and IsAlgebraHomomorphism( arg[1] ) + and IsAlgebra( arg[2] ) then + return AlgebraActionByHomomorphism( arg[1], arg[2] ); # surjective homomorphism elif ( ( nargs = 1 ) and IsAlgebraHomomorphism( arg[1] ) and IsSurjective( arg[1] ) ) then return AlgebraActionBySurjection( arg[1] ); - # module and zero map - elif ( ( nargs = 2 ) and IsAlgebra( arg[1] ) - and IsLeftModule( arg[2] ) ) then - return AlgebraActionByModule( arg[1],arg[2] ); fi; # alternatives not allowed Error( "usage: AlgebraAction( A, I, B ); or various options" ); @@ -543,36 +546,11 @@ function ( A, I, B ) act := MultiplierHomomorphism( M ); SetIsAlgebraAction( act, true ); SetAlgebraActionType( act, "multiplier" ); + SetAlgebraActedOn( act, M ); SetHasZeroModuleProduct( act, false ); return act; end ); -############################################################################# -## -#F AlgebraAction2( ) -## -InstallMethod( AlgebraAction2, "for an algebra", true, [ IsAlgebra ], 0, -function ( A ) - local act,MA,MAA; # mapping , result - MA := MultiplierAlgebra(A); - MAA := DirectSumOfAlgebras( MA, A ); -## MAA := := Cartesian(MA,A); - act := rec( fun:= x->Image(x[1],x[2]) ); - ObjectifyWithAttributes( act, - NewType( GeneralMappingsFamily( ElementsFamily(FamilyObj(MAA) ), - ElementsFamily( FamilyObj(A) ) ), - IsSPMappingByFunctionRep and IsSingleValued - and IsTotal and IsGroupHomomorphism ), - LeftElementOfCartesianProduct, MA, - AlgebraActionType, "Type2", - Source, MAA, - Range, A, - HasZeroModuleProduct, false, - IsAlgebraAction, true ); - # return the mapping - return act; -end ); - ############################################################################# ## #F AlgebraActionBySurjection( ) @@ -622,6 +600,7 @@ function ( hom ) act := LeftModuleGeneralMappingByImages( B, M, vecB, maps ); SetIsAlgebraAction( act, true ); SetAlgebraActionType( act, "surjection" ); + SetAlgebraActedOn( act, A ); SetHasZeroModuleProduct( act, false ); return act; end ); diff --git a/lib/module.gd b/lib/module.gd index 9054110..72b55a7 100644 --- a/lib/module.gd +++ b/lib/module.gd @@ -4,8 +4,99 @@ #W #Y Copyright (C) 2014-2024, Zekeriya Arvasi & Alper Odabas, ## +############################ algebra actions ############################# + +############################################################################ +## +## AlgebraActionByHomomorphism( ) +## +## <#GAPDoc Label="AlgebraActionByHomomorphism"> +## +## +## +## +## If \alpha : B \to C is an algebra homomorphism +## where C is an algebra of left module isomorphisms +## of an algebra A, then +## AlgebraActionByHomomorphism( alpha, A ) +## attempts to return an action of B on A. +##

+## In the example the matrix algebra Am +## and the group algebra AG are isomorphic algebras, +## so the resulting action is equivalent to the multiplier +## action of AG on itself. +## +## +## +## m := [ [0,1,0], [0,0,1], [1,0,0,] ];; +## gap> Am := Algebra( Rationals, [m] );; +## gap> SetName( Am, "Am" );; +## gap> G := Group( (1,2,3) );; +## gap> AG := GroupRing( Rationals, G );; +## gap> SetName( AG, "GR(G)" ); +## gap> g := GeneratorsOfAlgebra( AG )[2];; +## gap> mug := RegularAlgebraMultiplier( AG, AG, g );; +## gap> MAG := AlgebraByGenerators( Rationals, [ mug ] );; +## gap> hom := AlgebraHomomorphismByImages( Am, MAG, [ m ], [ mug ] );; +## gap> act := AlgebraActionByHomomorphism( hom, AG ); +## [ [ [ 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)*() +## ] ] +## ]]> +## +## <#/GAPDoc> +## +DeclareOperation( "AlgebraActionByHomomorphism", + [ IsAlgebraHomomorphism, IsAlgebra ] ); + +############################################################################ +## +## XModAlgebraByBoundaryAndAction( ) +## +## <#GAPDoc Label="XModAlgebraByBoundaryAndAction"> +## +## +## +## +## When a suitable pair of algebra homomorphisms are available, +## these operations may be used. +## The example uses the algebra action created in section +## . +## +## +## +## hom := AlgebraHomomorphismByImages( Am, MAG, [ m ], [ mug ] ); +## [ [ [ 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> bdy := AlgebraHomomorphismByImages( AG, Am, [ g ], [ m ] ); +## [ (1)*(1,2,3) ] -> [ [ [ 0, 1, 0 ], [ 0, 0, 1 ], [ 1, 0, 0 ] ] ] +## gap> Xm := XModAlgebraByBoundaryAndAction( bdy, act ); +## [ GR(G) -> Am ] +## gap> Display( Xm ); +## Crossed module [GR(G) -> Am] :- +## : Source algebra GR(G) has generators: +## [ (1)*(), (1)*(1,2,3) ] +## : Range algebra Am 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 ] ] ] +## ]]> +## +## <#/GAPDoc> +## +DeclareOperation( "XModAlgebraByBoundaryAndAction", + [ IsAlgebraHomomorphism, IsAlgebra ] ); +DeclareOperation( "PreXModAlgebraByBoundaryAndAction", + [ IsAlgebraHomomorphism, IsAlgebra ] ); -############################ module operations ################### + +############################ module operations ########################### ############################################################################ ## @@ -284,3 +375,7 @@ DeclareOperation( "XModAlgebraByModule", [ IsAlgebra, IsLeftModule ] ); ## ## <#/GAPDoc> ## + +############################ direct sum operations ####################### + + diff --git a/lib/module.gi b/lib/module.gi index 99afe63..19bb377 100644 --- a/lib/module.gi +++ b/lib/module.gi @@ -18,7 +18,6 @@ function( M ) 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 +26,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 +62,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,7 +84,7 @@ 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; @@ -119,3 +116,34 @@ function( A, M ) fi; return PM; end ); + + +############################ direct sum operations ####################### + +############################################################################# +## +#F AlgebraActionByHomomorphism( ) +## +InstallMethod( AlgebraActionByHomomorphism, + "for an algebra homomorphism and an algebra", true, + [ IsAlgebraHomomorphism, IsAlgebra ], 0, +function ( hom, A ) + 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 ( A = Source( genC[1] ) ) then + Info( InfoXModAlg, 1, "Range(hom) not isomorphisms of A" ); + return fail; + fi; + SetAlgebraActionType( hom, "homomorphism" ); + SetAlgebraActedOn( hom, A ); + return hom; +end ); + +############################ direct sum operations ####################### + + diff --git a/tst/module3.tst b/tst/module.tst similarity index 72% rename from tst/module3.tst rename to tst/module.tst index ea7fd2d..eeb35f1 100644 --- a/tst/module3.tst +++ b/tst/module.tst @@ -2,13 +2,49 @@ ## #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 +#@local level,m,Am,G,AG,g,mug,MAG,hom,act,bdy,Xm,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> Am := Algebra( Rationals, [m] );; +gap> SetName( Am, "Am" );; +gap> G := Group( (1,2,3) );; +gap> AG := GroupRing( Rationals, G );; +gap> SetName( AG, "GR(G)" ); +gap> g := GeneratorsOfAlgebra( AG )[2];; +gap> mug := RegularAlgebraMultiplier( AG, AG, g );; +gap> MAG := AlgebraByGenerators( Rationals, [ mug ] );; +gap> hom := AlgebraHomomorphismByImages( Am, MAG, [ m ], [ mug ] );; +gap> act := AlgebraActionByHomomorphism( hom, AG ); +[ [ [ 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)*() + ] ] + +## Chapter 4, Section 4.1.6 +gap> hom := AlgebraHomomorphismByImages( Am, MAG, [ m ], [ mug ] ); +[ [ [ 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> bdy := AlgebraHomomorphismByImages( AG, Am, [ g ], [ m ] ); +[ (1)*(1,2,3) ] -> [ [ [ 0, 1, 0 ], [ 0, 0, 1 ], [ 1, 0, 0 ] ] ] +gap> Xm := XModAlgebraByBoundaryAndAction( bdy, act ); +[ GR(G) -> Am ] +gap> Display( Xm ); + +Crossed module [GR(G) -> Am] :- +: Source algebra GR(G) has generators: + [ (1)*(), (1)*(1,2,3) ] +: Range algebra Am 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 ] ] ] + +## Chapter 2, Section 2.2.4 gap> m := [ [0,1,0], [0,0,1], [1,0,0] ];; gap> A3 := Algebra( Rationals, [m] );; gap> SetName( A3, "A3" );; @@ -27,7 +63,7 @@ gap> u2 := 6*genM3[1] + 7*genM3[2] + 8*genM3[3]; gap> u := ExtRepOfObj( u2 ); [ 6, 7, 8 ] -## Chapter 2, Section 2.2.4 +## Chapter 2, Section 2.2.5 gap> D3 := LeftActingDomain( M3 );; gap> T3 := EmptySCTable( Dimension(M3), Zero(D3), "symmetric" );; gap> B3a := AlgebraByStructureConstants( D3, T3 ); @@ -39,13 +75,13 @@ A(M3) gap> GeneratorsOfAlgebra( B3 ); [ [[ 1, 0, 0 ]], [[ 0, 1, 0 ]], [[ 0, 0, 1 ]] ] -## Chapter 2, Section 2.2.5 +## Chapter 2, Section 2.2.6 gap> IsModuleAsAlgebra( B3 ); true gap> IsModuleAsAlgebra( A3 ); false -## Chapter 2, Section 2.2.6 +## Chapter 2, Section 2.2.7 gap> KnownAttributesOfObject( B3 ); [ "Name", "ZeroImmutable", "LeftActingDomain", "Dimension", "GeneratorsOfLeftOperatorAdditiveGroup", "GeneratorsOfLeftOperatorRing", @@ -66,7 +102,7 @@ false gap> Range( B2M3 ) = V3; true -## Chapter 2, Section 2.2.7 +## Chapter 2, Section 2.2.8 gap> act3 := AlgebraActionByModule( A3, M3 ); [ [ [ 0, 1, 0 ], [ 0, 0, 1 ], [ 1, 0, 0 ] ] ] -> [ [ [[ 1, 0, 0 ]], [[ 0, 1, 0 ]], [[ 0, 0, 1 ]] ] -> diff --git a/tst/xmod.tst b/tst/xmod.tst index 1c4082e..05a1836 100644 --- a/tst/xmod.tst +++ b/tst/xmod.tst @@ -138,7 +138,9 @@ 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 From 35200f3f4e2905d5d8b0f0148065b5e41c989082 Mon Sep 17 00:00:00 2001 From: cdwensley Date: Mon, 1 Jul 2024 16:53:03 +0100 Subject: [PATCH 3/5] added operation AlgebraActionOnDirectSum --- CHANGES.md | 4 +- PackageInfo.g | 2 +- doc/algebra.xml | 186 ++++++++++++++++++------------- doc/xmod.xml | 11 +- examples/module.g | 107 ++++++++++++++++++ examples/module3.g | 73 ------------ lib/algebra.gi | 2 +- lib/module.gd | 270 ++++++++++++++++++++++++++++++++------------- lib/module.gi | 147 ++++++++++++++++++++---- tst/algebra.tst | 143 ++++++++++++------------ tst/module.tst | 174 ++++++++++++++++------------- tst/xmod.tst | 24 ++-- 12 files changed, 730 insertions(+), 413 deletions(-) create mode 100644 examples/module.g delete mode 100644 examples/module3.g diff --git a/CHANGES.md b/CHANGES.md index f64c6ec..0b0a72b 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,6 +1,8 @@ # CHANGES to the 'XModAlg' package -## 1.25 -> 1.25dev (26/06/24) +## 1.25 -> 1.25dev (01/07/24) + * (01/07/24) renamed the actions and algebras in the tests/examples as + act1, act, ,,, and added AlgebraActionOnDirectSum * (17/05/24) added operations for a module as an algebra, revised XModAlgebraByModule * (26/06/24) added AlgebraActionByHomomorphism, diff --git a/PackageInfo.g b/PackageInfo.g index 0bc7eb7..30a6c52 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 := "26/06/2024", # dd/mm/yyyy format +Date := "01/07/2024", # dd/mm/yyyy format License := "GPL-2.0-or-later", Persons := [ diff --git a/doc/algebra.xml b/doc/algebra.xml index eb1ecef..e218674 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)*() ] ]]> @@ -214,6 +214,15 @@ 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. + + + @@ -228,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) ]]> @@ -256,13 +266,13 @@ Then B acts on A by b \cdot a = pa where p \in (\theta^{-1}b). 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. +and (p+k)a = pa+ka = pa+0.

Continuing with the previous example, -we construct the quotient algebra Q5c6 = A5c6/I5c6, -and the natural homomorphism \theta : A5c6 \to Q5c6. +we construct the quotient algebra Q3 = A3/I3, +and the natural homomorphism \theta : A3 \to Q3. The kernel of \theta is not contained in -the annihilator of A5c6, so an attempt to form the action fails. +the annihilator of A3, so an attempt to form the action fails.

An alternative example involves a single-generator matrix algebra. @@ -270,41 +280,42 @@ An alternative example involves a single-generator matrix algebra. 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 ] ]]> @@ -312,6 +323,12 @@ gap> [ Image(b2,m)=m^3, b2=b1^2 ]; <#Include Label="AlgebraActionByHomomorphism"> +

+ +
+ +Algebra modules + <#Include Label="AlgebraModules"> <#Include Label="ModuleAsAlgebra"> @@ -322,6 +339,25 @@ 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="AlgebraActionOnDirectSum"> + +<#Include Label="DirectSumAlgebraActions"> + +
+ +
+ +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/xmod.xml b/doc/xmod.xml index 85187a9..d6adf5d 100644 --- a/doc/xmod.xml +++ b/doc/xmod.xml @@ -180,13 +180,12 @@ Continuing with the example in that section, X3 := XModAlgebraBySurjection( nat3 );; -gap> Display( X3 ); - -Crossed module [A1->Q13] :- -: Source algebra A1 has generators: +gap> 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 Q13 has generators: +: Range algebra Q2 has generators: [ v.1, v.2 ] : Boundary homomorphism maps source generators to: [ v.1 ] diff --git a/examples/module.g b/examples/module.g new file mode 100644 index 0000000..23cc187 --- /dev/null +++ b/examples/module.g @@ -0,0 +1,107 @@ +############################################################################ +## +#W module3.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 ] );; +homB3 := AlgebraHomomorphismByImages( A3, MB3, [ m3 ], [ mg3 ] );; +actB3 := AlgebraActionByHomomorphism( homB3, B3 ); +Print ( "action actB3 of A3 on B3:\n", actB3, "\n" ); + +## 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 );; +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 embedding into A3B3:\n", Embedding( A3B3, 2 ), "\n" ); + +## Section 2.4.3 +actA3 := AlgebraActionByMultipliers( A3, A3, A3 );; +MA3 := AlgebraActedOn( actA3 );; +SetName( MA3, "MA3" ); +SetName( Image( actA3 ), "imactA3" ); +SetName( Image( actB3 ), "imactB3" ); + + +############################################################################ +## +#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/lib/algebra.gi b/lib/algebra.gi index f87e38e..d0344c7 100644 --- a/lib/algebra.gi +++ b/lib/algebra.gi @@ -546,7 +546,7 @@ function ( A, I, B ) act := MultiplierHomomorphism( M ); SetIsAlgebraAction( act, true ); SetAlgebraActionType( act, "multiplier" ); - SetAlgebraActedOn( act, M ); + SetAlgebraActedOn( act, B ); SetHasZeroModuleProduct( act, false ); return act; end ); diff --git a/lib/module.gd b/lib/module.gd index 72b55a7..f9a8046 100644 --- a/lib/module.gd +++ b/lib/module.gd @@ -21,25 +21,25 @@ ## AlgebraActionByHomomorphism( alpha, A ) ## attempts to return an action of B on A. ##

-## In the example the matrix algebra Am -## and the group algebra AG are isomorphic algebras, +## In the example the matrix algebra A3 +## and the group algebra B3 are isomorphic algebras, ## so the resulting action is equivalent to the multiplier -## action of AG on itself. +## action of B3 on itself. ## ## ## ## m := [ [0,1,0], [0,0,1], [1,0,0,] ];; -## gap> Am := Algebra( Rationals, [m] );; -## gap> SetName( Am, "Am" );; +## 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> AG := GroupRing( Rationals, G );; -## gap> SetName( AG, "GR(G)" ); -## gap> g := GeneratorsOfAlgebra( AG )[2];; -## gap> mug := RegularAlgebraMultiplier( AG, AG, g );; -## gap> MAG := AlgebraByGenerators( Rationals, [ mug ] );; -## gap> hom := AlgebraHomomorphismByImages( Am, MAG, [ m ], [ mug ] );; -## gap> act := AlgebraActionByHomomorphism( hom, AG ); +## 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> homB3 := AlgebraHomomorphismByImages( A3, MB3, [ m3 ], [ mg3 ] );; +## gap> actB3 := AlgebraActionByHomomorphism( homB3, 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)*() ## ] ] @@ -69,19 +69,19 @@ DeclareOperation( "AlgebraActionByHomomorphism", ## ## ## hom := AlgebraHomomorphismByImages( Am, MAG, [ m ], [ mug ] ); +## gap> bdyB3 := 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> bdy := AlgebraHomomorphismByImages( AG, Am, [ g ], [ m ] ); +## gap> bdyB3 := AlgebraHomomorphismByImages( B3, A3, [ g3 ], [ m3 ] ); ## [ (1)*(1,2,3) ] -> [ [ [ 0, 1, 0 ], [ 0, 0, 1 ], [ 1, 0, 0 ] ] ] -## gap> Xm := XModAlgebraByBoundaryAndAction( bdy, act ); -## [ GR(G) -> Am ] -## gap> Display( Xm ); -## Crossed module [GR(G) -> Am] :- +## gap> XB3 := XModAlgebraByBoundaryAndAction( bdy5, act3 ); +## [ GR(G) -> A3 ] +## gap> Display( XB3 ); +## Crossed module [GR(G) -> A3] :- ## : Source algebra GR(G) has generators: ## [ (1)*(), (1)*(1,2,3) ] -## : Range algebra Am has generators: +## : 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 ] ], @@ -101,7 +101,6 @@ DeclareOperation( "PreXModAlgebraByBoundaryAndAction", ############################################################################ ## ## <#GAPDoc Label="AlgebraModules"> -## Algebra modules ## Recall that a module can be made into an algebra ## by defining every product to be zero. ## When we apply this construction to a (left) algebra module, @@ -117,26 +116,25 @@ DeclareOperation( "PreXModAlgebraByBoundaryAndAction", ## ## ## m := [ [0,1,0], [0,0,1], [1,0,0] ];; -## gap> A3 := Rationals^[3,3];; -## 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 ); +## gap> m3 := [ [0,1,0], [0,0,1], [1,0,0] ];; +## gap> A4 := Rationals^[3,3];; +## 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> m*v2; +## gap> m3*v4; ## [ 4, 5, 3 ] -## gap> genM3 := GeneratorsOfLeftModule( M3 );; -## gap> u2 := 6*genM3[1] + 7*genM3[2] + 8*genM3[3]; +## gap> genM4 := GeneratorsOfLeftModule( M4 );; +## gap> u4 := 6*genM4[1] + 7*genM4[2] + 8*genM4[3]; ## [ 6, 7, 8 ] -## gap> u := ExtRepOfObj( u2 ); +## gap> u4 := ExtRepOfObj( u4 ); ## [ 6, 7, 8 ] ## ]]> ## -## ## <#/GAPDoc> ## @@ -158,7 +156,7 @@ DeclareOperation( "PreXModAlgebraByBoundaryAndAction", ##

## If the module M has been given a name, then the operation ## ModuleAsAlgebra assigns a name to the resulting algebra. -## The operation AlgebraByStyructureConstants assigns names +## The operation AlgebraByStructureConstants assigns names ## v_i to the basis vectors unless a list of names is provided. ## The operation ModuleAsAlgebra converts the basis elements of ## M into strings, with additional brackets added, and uses these @@ -168,15 +166,15 @@ DeclareOperation( "PreXModAlgebraByBoundaryAndAction", ## ## ## 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 ]] ] ## ]]> ## @@ -199,9 +197,9 @@ DeclareAttribute( "ModuleAsAlgebra", IsLeftModule ); ## ## ## IsModuleAsAlgebra( B3 ); +## gap> IsModuleAsAlgebra( B4 ); ## true -## gap> IsModuleAsAlgebra( A3 ); +## gap> IsModuleAsAlgebra( A4 ); ## false ## ]]> ## @@ -229,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 ## ]]> ## @@ -271,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> @@ -321,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: @@ -353,10 +344,10 @@ DeclareOperation( "XModAlgebraByModule", [ IsAlgebra, IsLeftModule ] ); ## ## 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 @@ -378,4 +369,127 @@ DeclareOperation( "XModAlgebraByModule", [ IsAlgebra, IsLeftModule ] ); ############################ 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> 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( ) -> +## [ 0*[[ 1, 0, 0 ]], 0*[[ 1, 0, 0 ]], 0*[[ 1, 0, 0 ]], [[ 1, 0, 0 ]], +## [[ 0, 1, 0 ]], [[ 0, 0, 1 ]] ] +## ]]> +## +## <#/GAPDoc> +## + +############################################################################ +## +## 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. +## +## +## +## actA3 := AlgebraActionByMultipliers( A3, A3, A3 );; +## gap> actAB := AlgebraActionOnDirectSum( actA3, actB3 ); +## [ [ [ 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 ] ); + +############################################################################ +## +## DirectSumAlgebraActions( ) +## +## <#GAPDoc Label="DirectSumAlgebraActions"> +## +## +## +## +## 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). +##

+## +## +## +## +## ]]> +## +## <#/GAPDoc> +## +DeclareOperation( "DirectSumAlgebraActions", + [ IsAlgebraAction, IsAlgebraAction ] ); diff --git a/lib/module.gi b/lib/module.gi index 19bb377..bb0f984 100644 --- a/lib/module.gi +++ b/lib/module.gi @@ -5,13 +5,39 @@ #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, A ) + 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 ( A = Source( genC[1] ) ) then + Info( InfoXModAlg, 1, "Range(hom) not isomorphisms of A" ); + return fail; + fi; + SetAlgebraActionType( hom, "homomorphism" ); + SetAlgebraActedOn( hom, A ); + 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; @@ -122,28 +148,109 @@ end ); ############################################################################# ## -#F AlgebraActionByHomomorphism( ) +#M Embedding ## -InstallMethod( AlgebraActionByHomomorphism, - "for an algebra homomorphism and an algebra", true, - [ IsAlgebraHomomorphism, IsAlgebra ], 0, -function ( hom, A ) - local C, genC; - if not IsAlgebraAction( hom ) then - Info( InfoXModAlg, 1, "hom is not an algebra action" ); - return fail; +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; - C := Range( hom ); - genC := GeneratorsOfAlgebra( C ); - if not ( A = Source( genC[1] ) ) then - Info( InfoXModAlg, 1, "Range(hom) not isomorphisms of A" ); - return fail; + if not ( i in [1,2] ) then + Error( "require i in [1,2]" ); fi; - SetAlgebraActionType( hom, "homomorphism" ); - SetAlgebraActedOn( hom, A ); + # 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 ); +end); -############################ direct sum operations ####################### + +############################################################################# +## +#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 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 ); + SetAlgebraActionType( act, "direct sum" ); + return act; +end ); 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/module.tst b/tst/module.tst index eeb35f1..2ddaddb 100644 --- a/tst/module.tst +++ b/tst/module.tst @@ -1,141 +1,141 @@ ############################################################################ ## -#W module3.tst XModAlg test files Chris Wensley +#W module.tst XModAlg test files Chris Wensley ## -#@local level,m,Am,G,AG,g,mug,MAG,hom,act,bdy,Xm,A3,V3,M3,famM3,v,v2,genM3,u2,u,D3,T3,B3a,B3,M2B3,B2M3,act3,a,X3,C3 +#@local level,m3,A3,G,B3,g3,mg3,MB3,homB3,actB3,bdyB3,XB3,A4,V4,M4,famM4,v4,genM4,u4,D4,T4,B4a,B4,M2B4,B2M4,act4,a4,X4,C4,A3B3,actA3,actAB -gap> START_TEST( "XModAlg package: module3.tst" ); +gap> START_TEST( "XModAlg package: module.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> Am := Algebra( Rationals, [m] );; -gap> SetName( Am, "Am" );; +## 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> AG := GroupRing( Rationals, G );; -gap> SetName( AG, "GR(G)" ); -gap> g := GeneratorsOfAlgebra( AG )[2];; -gap> mug := RegularAlgebraMultiplier( AG, AG, g );; -gap> MAG := AlgebraByGenerators( Rationals, [ mug ] );; -gap> hom := AlgebraHomomorphismByImages( Am, MAG, [ m ], [ mug ] );; -gap> act := AlgebraActionByHomomorphism( hom, AG ); +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> homB3 := AlgebraHomomorphismByImages( A3, MB3, [ m3 ], [ mg3 ] );; +gap> actB3 := AlgebraActionByHomomorphism( homB3, 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)*() ] ] -## Chapter 4, Section 4.1.6 -gap> hom := AlgebraHomomorphismByImages( Am, MAG, [ m ], [ mug ] ); +## Section 4.1.6 +gap> homB3 := 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> bdy := AlgebraHomomorphismByImages( AG, Am, [ g ], [ m ] ); +gap> bdyB3 := AlgebraHomomorphismByImages( B3, A3, [ g3 ], [ m3 ] ); [ (1)*(1,2,3) ] -> [ [ [ 0, 1, 0 ], [ 0, 0, 1 ], [ 1, 0, 0 ] ] ] -gap> Xm := XModAlgebraByBoundaryAndAction( bdy, act ); -[ GR(G) -> Am ] -gap> Display( Xm ); +gap> XB3 := XModAlgebraByBoundaryAndAction( bdyB3, actB3 ); +[ GR(G) -> A3 ] +gap> Display( XB3 ); -Crossed module [GR(G) -> Am] :- +Crossed module [GR(G) -> A3] :- : Source algebra GR(G) has generators: [ (1)*(), (1)*(1,2,3) ] -: Range algebra Am has generators: +: 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 ] ] ] -## Chapter 2, Section 2.2.4 -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 ); +## 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> m*v2; +gap> m3*v4; [ 4, 5, 3 ] -gap> genM3 := GeneratorsOfLeftModule( M3 );; -gap> u2 := 6*genM3[1] + 7*genM3[2] + 8*genM3[3]; +gap> genM4 := GeneratorsOfLeftModule( M4 );; +gap> u4 := 6*genM4[1] + 7*genM4[2] + 8*genM4[3]; [ 6, 7, 8 ] -gap> u := ExtRepOfObj( u2 ); +gap> u4 := ExtRepOfObj( u4 ); [ 6, 7, 8 ] -## Chapter 2, Section 2.2.5 -gap> D3 := LeftActingDomain( M3 );; -gap> T3 := EmptySCTable( Dimension(M3), Zero(D3), "symmetric" );; -gap> B3a := AlgebraByStructureConstants( D3, T3 ); +## Section 2.3.1 +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 ]] ] -## Chapter 2, Section 2.2.6 -gap> IsModuleAsAlgebra( B3 ); +## Section 2.3.2 +gap> IsModuleAsAlgebra( B4 ); true -gap> IsModuleAsAlgebra( A3 ); +gap> IsModuleAsAlgebra( A4 ); false -## Chapter 2, Section 2.2.7 -gap> KnownAttributesOfObject( B3 ); +## Section 2.3.3 +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 -## Chapter 2, Section 2.2.8 -gap> act3 := AlgebraActionByModule( A3, M3 ); +## 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> a := 2*m + 3*m^2; +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 ); -## Chapter 4, Section 4.1.7 -gap> X3 := XModAlgebraByModule( A3, M3 ); -[A(M3)->A3] -gap> Display( X3 ); +## Section 4.1.7 +gap> X4 := XModAlgebraByModule( A4, M4 ); +[A(M4)->A4] +gap> Display( X4 ); -Crossed module [A(M3)->A3] :- -: Source algebra A(M3) has generators: +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: +: 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 ] ] ] -## 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] :- +## 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 @@ -151,9 +151,33 @@ Cat1-algebra [A3 |X A(M3)=>A3] :- : kernel has generators: [ v.4, v.5, v.6 ] +## Section 2.4.1 +gap> A3B3 := DirectSumOfAlgebras( A3, 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> Embedding( A3B3, 2 ); +CanonicalBasis( GR(G) ) -> [ v.4, v.5, v.6 ] + +## Section 2.4.3 +gap> actA3 := AlgebraActionByMultipliers( A3, A3, A3 );; +gap> actAB := AlgebraActionOnDirectSum( actA3, actB3 ); +[ [ [ 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 ] ] + gap> SetInfoLevel( InfoXModAlg, level );; -gap> STOP_TEST( "module3.tst", 10000 ); +gap> STOP_TEST( "module.tst", 10000 ); ############################################################################ ## -#E module3.tst . . . . . . . . . . . . . . . . . . . . . . . . . ends here +#E module.tst . . . . . . . . . . . . . . . . . . . . . . . . . . ends here \ No newline at end of file diff --git a/tst/xmod.tst b/tst/xmod.tst index 05a1836..215e023 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);; @@ -72,13 +72,13 @@ IdentityMapping( ) gap> ############################ gap> ## Section 4.1.5 -gap> X3 := XModAlgebraBySurjection( nat3 );; -gap> Display( X3 ); +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 ] From cfdf1d2b6ce51422092337d1fbfd9206cadc3974 Mon Sep 17 00:00:00 2001 From: cdwensley Date: Mon, 8 Jul 2024 15:36:30 +0100 Subject: [PATCH 4/5] added operation DirectSumAlgebraActions --- CHANGES.md | 5 ++- PackageInfo.g | 2 +- doc/algebra.xml | 26 ++++++----- examples/module.g | 32 +++++++++----- lib/module.gd | 55 +++++++++++++++-------- lib/module.gi | 108 ++++++++++++++++++++++++++++++++++++++++++++-- tst/module.tst | 43 +++++++++++++----- 7 files changed, 214 insertions(+), 57 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 0b0a72b..a3b7616 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,8 +1,9 @@ # CHANGES to the 'XModAlg' package ## 1.25 -> 1.25dev (01/07/24) - * (01/07/24) renamed the actions and algebras in the tests/examples as - act1, act, ,,, and added AlgebraActionOnDirectSum + * (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, diff --git a/PackageInfo.g b/PackageInfo.g index 30a6c52..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 := "01/07/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 e218674..593cb88 100644 --- a/doc/algebra.xml +++ b/doc/algebra.xml @@ -260,21 +260,25 @@ gap> Image( act12, 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 = pa+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 Q3 = A3/I3, -and the natural homomorphism \theta : A3 \to Q3. -The kernel of \theta is not contained in -the annihilator of A3, 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]\}. diff --git a/examples/module.g b/examples/module.g index 23cc187..a6071c1 100644 --- a/examples/module.g +++ b/examples/module.g @@ -1,6 +1,6 @@ ############################################################################ ## -#W module3.g XModAlg example files Chris Wensley +#W module.g XModAlg example files Chris Wensley ## LoadPackage( "xmodalg" ); @@ -16,9 +16,9 @@ SetName( B3, "GR(G)" ); g3 := GeneratorsOfAlgebra( B3 )[2];; mg3 := RegularAlgebraMultiplier( B3, B3, g3 );; MB3 := AlgebraByGenerators( Rationals, [ mg3 ] );; -homB3 := AlgebraHomomorphismByImages( A3, MB3, [ m3 ], [ mg3 ] );; -actB3 := AlgebraActionByHomomorphism( homB3, B3 ); -Print ( "action actB3 of A3 on B3:\n", actB3, "\n" ); +hom3 := AlgebraHomomorphismByImages( A3, MB3, [ m3 ], [ mg3 ] );; +act3 := AlgebraActionByHomomorphism( hom3, B3 ); +Print ( "action act3 of A3 on B3:\n", act3, "\n" ); ## Section 2.3 m3 := [ [0,1,0], [0,0,1], [1,0,0] ];; @@ -86,21 +86,33 @@ 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 embedding into A3B3:\n", Embedding( A3B3, 2 ), "\n" ); +Print( "second projection from A3B3:\n", Projection( A3B3, 2 ), "\n" ); ## Section 2.4.3 -actA3 := AlgebraActionByMultipliers( A3, A3, A3 );; -MA3 := AlgebraActedOn( actA3 );; -SetName( MA3, "MA3" ); -SetName( Image( actA3 ), "imactA3" ); -SetName( Image( actB3 ), "imactB3" ); +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.4 +act6 := DirectSumAlgebraActions( 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" ); ############################################################################ ## diff --git a/lib/module.gd b/lib/module.gd index f9a8046..902966a 100644 --- a/lib/module.gd +++ b/lib/module.gd @@ -15,11 +15,11 @@ ## ## ## -## If \alpha : B \to C is an algebra homomorphism +## If \alpha : A \to C is an algebra homomorphism ## where C is an algebra of left module isomorphisms -## of an algebra A, then -## AlgebraActionByHomomorphism( alpha, A ) -## attempts to return an action of B on A. +## of an algebra B, then +## AlgebraActionByHomomorphism( alpha, B ) +## attempts to return an action of A on B. ##

## In the example the matrix algebra A3 ## and the group algebra B3 are isomorphic algebras, @@ -38,8 +38,8 @@ ## gap> g3 := GeneratorsOfAlgebra( B3 )[2];; ## gap> mg3 := RegularAlgebraMultiplier( B3, B3, g3 );; ## gap> MB3 := AlgebraByGenerators( Rationals, [ mg3 ] );; -## gap> homB3 := AlgebraHomomorphismByImages( A3, MB3, [ m3 ], [ mg3 ] );; -## gap> actB3 := AlgebraActionByHomomorphism( homB3, B3 ); +## 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)*() ## ] ] @@ -69,15 +69,15 @@ DeclareOperation( "AlgebraActionByHomomorphism", ## ## ## bdyB3 := AlgebraHomomorphismByImages( A3, MB3, [ m3 ], [ mg3 ] ); +## gap> bdy3 := 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> bdyB3 := AlgebraHomomorphismByImages( B3, A3, [ g3 ], [ m3 ] ); +## gap> bdy3 := AlgebraHomomorphismByImages( B3, A3, [ g3 ], [ m3 ] ); ## [ (1)*(1,2,3) ] -> [ [ [ 0, 1, 0 ], [ 0, 0, 1 ], [ 1, 0, 0 ] ] ] -## gap> XB3 := XModAlgebraByBoundaryAndAction( bdy5, act3 ); +## gap> X3 := XModAlgebraByBoundaryAndAction( bdy3, act3 ); ## [ GR(G) -> A3 ] -## gap> Display( XB3 ); +## gap> Display( X3 ); ## Crossed module [GR(G) -> A3] :- ## : Source algebra GR(G) has generators: ## [ (1)*(), (1)*(1,2,3) ] @@ -117,7 +117,7 @@ DeclareOperation( "PreXModAlgebraByBoundaryAndAction", ## ## m3 := [ [0,1,0], [0,0,1], [1,0,0] ];; -## gap> A4 := Rationals^[3,3];; +## gap> A4 := Algebra( Rationals, [m3] );; ## gap> SetName( A4, "A4" );; ## gap> V4 := Rationals^3;; ## gap> M4 := LeftAlgebraModule( A4, \*, V4 );; @@ -386,6 +386,7 @@ DeclareOperation( "XModAlgebraByModule", [ IsAlgebra, IsLeftModule ] ); ## ## 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 := [ ] ) ); @@ -419,9 +420,8 @@ DeclareAttribute( "DirectSumOfAlgebrasInfo", IsAlgebra, "mutable" ); ## [ [ 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( ) -> -## [ 0*[[ 1, 0, 0 ]], 0*[[ 1, 0, 0 ]], 0*[[ 1, 0, 0 ]], [[ 1, 0, 0 ]], -## [[ 0, 1, 0 ]], [[ 0, 0, 1 ]] ] +## CanonicalBasis( A3(+)GR(G) ) -> [ of ..., of ..., +## of ..., (1)*(), (1)*(1,2,3), (1)*(1,3,2) ] ## ]]> ## ## <#/GAPDoc> @@ -451,8 +451,8 @@ DeclareAttribute( "DirectSumOfAlgebrasInfo", IsAlgebra, "mutable" ); ## ## ## actA3 := AlgebraActionByMultipliers( A3, A3, A3 );; -## gap> actAB := AlgebraActionOnDirectSum( actA3, actB3 ); +## 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 ] ] ] -> @@ -476,16 +476,35 @@ DeclareOperation( "AlgebraActionOnDirectSum", ## ## ## Let -## If \alpha_1 : A_1 \to C_1 is an action on algebra B_1 +## 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 ##

## ## ## ## +## gap> act6 := DirectSumAlgebraActions( 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> diff --git a/lib/module.gi b/lib/module.gi index bb0f984..2b3fedd 100644 --- a/lib/module.gi +++ b/lib/module.gi @@ -14,7 +14,7 @@ InstallMethod( AlgebraActionByHomomorphism, "for an algebra homomorphism and an algebra", true, [ IsAlgebraHomomorphism, IsAlgebra ], 0, -function ( hom, A ) +function ( hom, B ) local C, genC; if not IsAlgebraAction( hom ) then Info( InfoXModAlg, 1, "hom is not an algebra action" ); @@ -22,12 +22,12 @@ function ( hom, A ) fi; C := Range( hom ); genC := GeneratorsOfAlgebra( C ); - if not ( A = Source( genC[1] ) ) then - Info( InfoXModAlg, 1, "Range(hom) not isomorphisms of A" ); + if not ( B = Source( genC[1] ) ) then + Info( InfoXModAlg, 1, "Range(hom) not isomorphisms of B" ); return fail; fi; SetAlgebraActionType( hom, "homomorphism" ); - SetAlgebraActedOn( hom, A ); + SetAlgebraActedOn( hom, B ); return hom; end ); @@ -116,6 +116,7 @@ function( A, M ) fi; act := AlgebraGeneralMappingByImages( A, C, genA, imact ); SetIsAlgebraAction( act, true ); + SetAlgebraActedOn( act, B ); SetAlgebraActionType( act, "module" ); return act; end ); @@ -249,8 +250,107 @@ function( act1, act2 ) 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 DirectSumAlgebraActions +## +InstallMethod( DirectSumAlgebraActions, "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 ); + + + diff --git a/tst/module.tst b/tst/module.tst index 2ddaddb..c69d414 100644 --- a/tst/module.tst +++ b/tst/module.tst @@ -2,7 +2,7 @@ ## #W module.tst XModAlg test files Chris Wensley ## -#@local level,m3,A3,G,B3,g3,mg3,MB3,homB3,actB3,bdyB3,XB3,A4,V4,M4,famM4,v4,genM4,u4,D4,T4,B4a,B4,M2B4,B2M4,act4,a4,X4,C4,A3B3,actA3,actAB +#@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,actMA3,act5,act6,A6,B6,em3,ea4 gap> START_TEST( "XModAlg package: module.tst" ); gap> level := InfoLevel( InfoXModAlg );; @@ -18,22 +18,22 @@ gap> SetName( B3, "GR(G)" ); gap> g3 := GeneratorsOfAlgebra( B3 )[2];; gap> mg3 := RegularAlgebraMultiplier( B3, B3, g3 );; gap> MB3 := AlgebraByGenerators( Rationals, [ mg3 ] );; -gap> homB3 := AlgebraHomomorphismByImages( A3, MB3, [ m3 ], [ mg3 ] );; -gap> actB3 := AlgebraActionByHomomorphism( homB3, B3 ); +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)*() ] ] ## Section 4.1.6 -gap> homB3 := AlgebraHomomorphismByImages( A3, MB3, [ m3 ], [ mg3 ] ); +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> bdyB3 := AlgebraHomomorphismByImages( B3, A3, [ g3 ], [ m3 ] ); +gap> bdy3 := AlgebraHomomorphismByImages( B3, A3, [ g3 ], [ m3 ] ); [ (1)*(1,2,3) ] -> [ [ [ 0, 1, 0 ], [ 0, 0, 1 ], [ 1, 0, 0 ] ] ] -gap> XB3 := XModAlgebraByBoundaryAndAction( bdyB3, actB3 ); +gap> X3 := XModAlgebraByBoundaryAndAction( bdy3, act3 ); [ GR(G) -> A3 ] -gap> Display( XB3 ); +gap> Display( X3 ); Crossed module [GR(G) -> A3] :- : Source algebra GR(G) has generators: @@ -153,6 +153,7 @@ Cat1-algebra [A4 |X A(M4)=>A4] :- ## 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 := [ ] ) );; @@ -162,12 +163,13 @@ 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> Embedding( A3B3, 2 ); -CanonicalBasis( GR(G) ) -> [ v.4, v.5, v.6 ] +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> actA3 := AlgebraActionByMultipliers( A3, A3, A3 );; -gap> actAB := AlgebraActionOnDirectSum( actA3, actB3 ); +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 ] ] ] -> @@ -175,6 +177,25 @@ gap> actAB := AlgebraActionOnDirectSum( actA3, actB3 ); [ 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.4 +gap> act6 := DirectSumAlgebraActions( 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 ); From c3c4d079dca27432451f921965b8a25427971af9 Mon Sep 17 00:00:00 2001 From: cdwensley Date: Mon, 8 Jul 2024 20:42:49 +0100 Subject: [PATCH 5/5] added DirectSumOfXModAlgebras --- doc/algebra.xml | 4 +- doc/xmod.xml | 113 ++++++++++++++++++++++++---------------------- examples/module.g | 15 +++++- init.g | 2 +- lib/alg2obj.gd | 7 +++ lib/alg2obj.gi | 33 ++++++++++++-- lib/module.gd | 80 +++++++++++++++++++++++++++++--- lib/module.gi | 81 +++++++++++++++++++++++++++++---- read.g | 2 +- tst/module.tst | 21 +++++++-- tst/xmod.tst | 8 ++-- 11 files changed, 277 insertions(+), 89 deletions(-) diff --git a/doc/algebra.xml b/doc/algebra.xml index 593cb88..b6841a9 100644 --- a/doc/algebra.xml +++ b/doc/algebra.xml @@ -353,9 +353,11 @@ gap> [ Image(b2,m2)=m2^3, b2=b1^2 ]; <#Include Label="EmbeddingForDirectSumOfAlgebras"> +<#Include Label="DirectSumOfAlgebraHomomorphisms"> + <#Include Label="AlgebraActionOnDirectSum"> -<#Include Label="DirectSumAlgebraActions"> +<#Include Label="DirectSumOfAlgebraActions">

diff --git a/doc/xmod.xml b/doc/xmod.xml index d6adf5d..f9b9cbb 100644 --- a/doc/xmod.xml +++ b/doc/xmod.xml @@ -141,61 +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, -

- - - - - 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"> - @@ -269,6 +214,64 @@ gap> KnownAttributesOfObject( 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, +

+ + + + + 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"> + + diff --git a/examples/module.g b/examples/module.g index a6071c1..baa5660 100644 --- a/examples/module.g +++ b/examples/module.g @@ -20,6 +20,13 @@ 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] );; @@ -96,12 +103,16 @@ 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.4 -act6 := DirectSumAlgebraActions( act3, act4 );; +## 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" ); 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 8119607..18defb5 100644 --- a/lib/alg2obj.gd +++ b/lib/alg2obj.gd @@ -39,13 +39,20 @@ 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 7311197..96b5c55 100644 --- a/lib/alg2obj.gi +++ b/lib/alg2obj.gi @@ -104,8 +104,9 @@ 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 ) @@ -129,7 +130,6 @@ function( bdy, act ) return fail; fi; fi; - ## create the object PM := rec(); ObjectifyWithAttributes( PM, type, @@ -140,7 +140,14 @@ function( bdy, 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 fail; @@ -382,11 +389,11 @@ end ); ############################################################################ ## #M PreXModAlgebraByBoundaryAndAction +#M PreXModAlgebraByBoundaryAndActionNC ## InstallMethod( PreXModAlgebraByBoundaryAndAction, "pre-crossed module from boundary and action maps", true, [ IsAlgebraHomomorphism, IsAlgebraAction ], 0, - function( bdy, act ) if not ( Source( act ) = Range( bdy ) ) then Info( InfoXModAlg, 1, "Source(act) <> Range(bdy)" ); @@ -395,17 +402,23 @@ function( bdy, act ) 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( "boundary and action only define a pre-crossed module" ); @@ -413,6 +426,16 @@ function( bdy, act ) 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 diff --git a/lib/module.gd b/lib/module.gd index 902966a..841c6aa 100644 --- a/lib/module.gd +++ b/lib/module.gd @@ -340,8 +340,7 @@ DeclareOperation( "XModAlgebraByModule", [ IsAlgebra, IsLeftModule ] ); ##

## As a second example, we convert the crossed module X3 ## constructed in - - +## ## ## C6 := Cat1AlgebraOfXModAlgebra( X6 ); @@ -427,6 +426,44 @@ DeclareAttribute( "DirectSumOfAlgebrasInfo", IsAlgebra, "mutable" ); ## <#/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( ) @@ -468,11 +505,11 @@ DeclareOperation( "AlgebraActionOnDirectSum", ############################################################################ ## -## DirectSumAlgebraActions( ) +## DirectSumOfAlgebraActions( ) ## -## <#GAPDoc Label="DirectSumAlgebraActions"> +## <#GAPDoc Label="DirectSumOfAlgebraActions"> ## -## +## ## ## ## Let @@ -488,7 +525,7 @@ DeclareOperation( "AlgebraActionOnDirectSum", ## ## ## act6 := DirectSumAlgebraActions( act3, act4 );; +## gap> act6 := DirectSumOfAlgebraActions( act3, act4 );; ## gap> A6 := Source( act6 ); ## A3(+)A4 ## gap> B6 := AlgebraActedOn( act6 ); @@ -509,6 +546,35 @@ DeclareOperation( "AlgebraActionOnDirectSum", ## ## <#/GAPDoc> ## -DeclareOperation( "DirectSumAlgebraActions", +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 2b3fedd..f0e02f1 100644 --- a/lib/module.gi +++ b/lib/module.gi @@ -139,7 +139,7 @@ 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 ); @@ -173,7 +173,6 @@ InstallMethod( Embedding, "algebra direct sum and integer", return hom; end); - ############################################################################# ## #M Projection @@ -209,6 +208,58 @@ InstallMethod( Projection, "algebra direct sum and integer", 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 @@ -257,9 +308,9 @@ end ); ############################################################################# ## -#M DirectSumAlgebraActions +#M DirectSumOfAlgebraActions ## -InstallMethod( DirectSumAlgebraActions, "for two algebra actions", true, +InstallMethod( DirectSumOfAlgebraActions, "for two algebra actions", true, [ IsAlgebraAction, IsAlgebraAction ], 0, function( act1, act2 ) local domA, A1, basA1, nA1, A2, basA2, nA2, A, basA, firstA, @@ -350,7 +401,21 @@ function( act1, act2 ) 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/module.tst b/tst/module.tst index c69d414..f1fe462 100644 --- a/tst/module.tst +++ b/tst/module.tst @@ -2,7 +2,7 @@ ## #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,actMA3,act5,act6,A6,B6,em3,ea4 +#@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 );; @@ -24,7 +24,7 @@ gap> act3 := AlgebraActionByHomomorphism( hom3, B3 ); [ [ (1)*(), (1)*(1,2,3), (1)*(1,3,2) ] -> [ (1)*(1,2,3), (1)*(1,3,2), (1)*() ] ] -## Section 4.1.6 +## .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)*() @@ -116,7 +116,7 @@ Basis( A(M4), [ [[ 1, 0, 0 ]], [[ 0, 1, 0 ]], [[ 0, 0, 1 ]] ] ) -> gap> Image( act4 ); -## Section 4.1.7 +## Section 4.1.8 gap> X4 := XModAlgebraByModule( A4, M4 ); [A(M4)->A4] gap> Display( X4 ); @@ -168,6 +168,17 @@ 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 ] ], @@ -177,8 +188,8 @@ gap> act5 := AlgebraActionOnDirectSum( actMA3, act3 ); [ 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.4 -gap> act6 := DirectSumAlgebraActions( act3, act4 );; +## Section 2.4.5 +gap> act6 := DirectSumOfAlgebraActions( act3, act4 );; gap> A6 := Source( act6 ); A3(+)A4 gap> B6 := AlgebraActedOn( act6 ); diff --git a/tst/xmod.tst b/tst/xmod.tst index 215e023..4bb2bf0 100644 --- a/tst/xmod.tst +++ b/tst/xmod.tst @@ -64,14 +64,14 @@ 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> ## Section 4.1.6 gap> X2 := XModAlgebraBySurjection( nat2 );; gap> Display( X2 ); @@ -84,7 +84,7 @@ Crossed module [A2->Q2] :- [ v.1 ] gap> ############################ -gap> ## Section 4.1.6 +gap> ## Section ??? gap> G := SmallGroup( 4, 2 ); gap> F := GaloisField( 4 ); @@ -143,7 +143,7 @@ gap> Set( kao ); "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] );;