CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutSign UpSign In

Real-time collaboration for Jupyter Notebooks, Linux Terminals, LaTeX, VS Code, R IDE, and more,
all in one place.

| Download

GAP 4.8.9 installation with standard packages -- copy to your CoCalc project to get it

Views: 418346
1
2
5 Private Extensions of the AtlasRep Package
3
4
It may be interesting to use the functions of the GAP interface also for
5
representations or programs that are not part of the ATLAS of Group
6
Representations. This chapter describes how to achieve this.
7
8
The main idea is that users can notify directories containing the private
9
data files, which may consist of
10
11
1 new faithful representations and programs for groups that are declared
12
already in the official ATLAS of Group Representations,
13
14
2 the declaration of groups that are not declared in the official ATLAS
15
of Group Representations, and representations and programs for them,
16
and
17
18
3 the definition of new kinds of representations and programs.
19
20
The first two issues are dealt with in Section 5.1 and Section 5.2. The last
21
is described in Section 7.5.
22
23
Finally, an example of using private extensions is given in Section 5.3.
24
25
Several of the sanity checks for the official part of the AtlasRep package
26
make sense also for private extensions, see Section 7.8 for more
27
information.
28
29
30
5.1 Adding a Private Data Directory
31
32
After the AtlasRep package has been loaded into the GAP session, one can add
33
private data. However, one should not add private files to the local data
34
directories of the package, or modify files in these directories. Instead,
35
additional data should be put into separate directories. It should be noted
36
that a data file is fetched from a server only if the local data directories
37
do not contain a file with this name, independent of the contents of the
38
files. (As a consequence, corrupted files in the local data directories are
39
not automatically replaced by a correct server file.)
40
41
5.1-1 AtlasOfGroupRepresentationsNotifyPrivateDirectory
42
43
AtlasOfGroupRepresentationsNotifyPrivateDirectory( dir[, dirid][, test] )  function
44
Returns: true if none of the filenames with admissible format in the
45
directory dir is contained in other data directories and if the
46
data belongs to groups whose names have been declared, otherwise
47
false.
48
49
Let dir be a directory (see 'Reference: Directories') or a string denoting
50
the name of a directory (such that the GAP object describing this directory
51
can be obtained by calling Directory (Reference: Directory) with the
52
argument dir). In the following, let dirname be the name of the directory.
53
So dirname can be an absolute path or a path relative to the home directory
54
of the user (starting with a tilde character ~) or a path relative to the
55
directory where GAP was started.
56
57
If the optional argument dirid is given, it must be a string. This value
58
will be used in the identifier components of the records that are returned
59
by interface functions (see Section 3.5) for data contained in the directory
60
dir. Note that the directory name may be different in different GAP sessions
61
or for different users who want to access the same data, whereas the
62
identifier components shall be independent of such differences. The default
63
for dirid is dirname.
64
65
If the optional argument test is given, it must be true or false. In the
66
true case, consistency checks are switched on while the file toc.g is read.
67
This costs some extra time, but it is recommended after each extension of
68
the file toc.g. The default for test is false.
69
70
AtlasOfGroupRepresentationsNotifyPrivateDirectory notifies the data in the
71
directory dir to the AtlasRep package. First the pair [ dirname, dirid ] is
72
added to the private component of AtlasOfGroupRepresentationsInfo (7.1-6).
73
If the directory contains a file with the name toc.g then this file is read;
74
this file is useful for adding new group names using AGR.GNAN and for adding
75
describing data about the representations, see Section 7.7. Next the table
76
of contents of the private directory is built from the list of files
77
contained in the private directory or in its subdirectories (one layer
78
deep).
79
80
Only those files are considered whose names match an admissible format (see
81
Section 7.6). Filenames that are already contained in another data directory
82
of the AtlasRep package are ignored, and messages about these filenames are
83
printed if the info level of InfoAtlasRep (7.1-1) is at least 1.
84
85
Note that this implies that the files of the official (i.e. non-private)
86
data directories have priority over files in private directories.
87
88
If the directory contains files for groups whose names have not been
89
declared before and if the info level of InfoAtlasRep (7.1-1) is at least 1
90
then a message about these names is printed.
91
92
For convenience, the user may collect the notifications of private data
93
directories in the file gaprc (see Section 'Reference: The gap.ini and gaprc
94
files').
95
96
5.1-2 AtlasOfGroupRepresentationsForgetPrivateDirectory
97
98
AtlasOfGroupRepresentationsForgetPrivateDirectory( dirid )  function
99
100
If dirid is the identifier of a private data directory that has been
101
notified with AtlasOfGroupRepresentationsNotifyPrivateDirectory (5.1-1) then
102
AtlasOfGroupRepresentationsForgetPrivateDirectory removes the directory from
103
the list of notified private directories; this means that from then on, the
104
data in this directory cannot be accessed anymore in the current session.
105
106
107
5.2 The Effect of Private Extensions on the User Interface
108
109
First suppose that only new groups or new data for known groups are added.
110
111
In this case, DisplayAtlasInfo (3.5-1) lists the private representations and
112
programs in the same way as the official data, except that private parts are
113
marked with the string stored in the component markprivate of
114
AtlasOfGroupRepresentationsInfo (7.1-6); by default, this is a star *. The
115
ordering of representations listed by DisplayAtlasInfo (3.5-1) (and referred
116
to by AtlasGenerators (3.5-2)) will in general change when private
117
directories are notified. If several private directories are used then the
118
ordering of data may depend on the ordering of notifications. For the other
119
interface functions described in Chapter 3, the only difference is that also
120
the private data can be accessed. In particular the free format
121
groupnameGi-XdescrWn for straight line programs (see Section 7.6) may be
122
used in private directories; the data can be accessed with AtlasProgram
123
(3.5-3), where the last two arguments are the strings "other" and descr.
124
125
If also private data types are introduced (see Section 7.5) then additional
126
columns or rows can appear in the output of DisplayAtlasInfo (3.5-1), and
127
new inputs can become meaningful for all interface functions. Examples for
128
these changes can be found in Section 5.3.
129
130
131
5.3 An Example of Extending the AtlasRep Package
132
133
In the beginning we set the info level of InfoAtlasRep (7.1-1) to 1.
134
135
 Example 
136
gap> level:= InfoLevel( InfoAtlasRep );;
137
gap> SetInfoLevel( InfoAtlasRep, 1 );
138

139
140
Let us assume that the directory privdir contains data for the cyclic group
141
C_4 of order 4 and for the alternating group A_5 on 5 points, respectively.
142
Note that it is obvious what the term standard generators means for the
143
group C_4.
144
145
Further let us assume that privdir contains the following files.
146
147
C4G1-p4B0.m1
148
a faithful permutation representation of C_4 on 4 points,
149
150
C4G1-max1W1
151
the straight line program that returns the square of its unique input,
152
153
C4G1-a2W1
154
the straight line program that raises its unique input to the third
155
power,
156
157
C4G1-XtestW1
158
the straight line program that returns the square of its unique input,
159
160
A5G1-p60B0.m1 and A5G1-p60B0.m2
161
the regular permutation representation of A_5.
162
163
The directory and the files can be created as follows.
164
165
 Example 
166
gap> prv:= DirectoryTemporary( "privdir" );;
167
gap> FileString( Filename( prv, "C4G1-p4B0.m1" ),
168
>  MeatAxeString( [ (1,2,3,4) ], 4 ) );;
169
gap> FileString( Filename( prv, "C4G1-max1W1" ),
170
>  "inp 1\npwr 2 1 2\noup 1 2\n" );;
171
gap> FileString( Filename( prv, "C4G1-XtestW1" ),
172
>  "inp 1\npwr 2 1 2\noup 1 2\n" );;
173
gap> FileString( Filename( prv, "C4G1-a2W1" ),
174
>  "inp 1\npwr 3 1 2\noup 1 2\n" );;
175
gap> FileString( Filename( prv, "C4G1-Ar1aB0.g" ),
176
>  "return rec( generators:= [ [[E(4)]] ] );\n" );;
177
gap> points:= Elements( AlternatingGroup( 5 ) );;
178
gap> FileString( Filename( prv, "A5G1-p60B0.m1" ),
179
>  MeatAxeString( [ Permutation( (1,2)(3,4), points, OnRight ) ], 60 ) );;
180
gap> FileString( Filename( prv, "A5G1-p60B0.m2" ),
181
>  MeatAxeString( [ Permutation( (1,3,5), points, OnRight ) ], 60 ) );;
182

183
184
(We could also introduce intermediate directories C4 and A5, say, each with
185
the data for one group only. Here we do not show this because creating
186
directories programmatically seems to be possible only with the GAP package
187
IO.)
188
189
The official part of the AtlasRep package does not contain information about
190
C_4, so we first notify this group, in the file privdir/toc.g. Besides the
191
name of the group, we store the following information: the group order, the
192
number of (classes of) maximal subgroups, their orders, their structures,
193
and describing data about the two permutation representations. (The group
194
A_5 is known with name A5 in the official part of the AtlasRep package, so
195
it cannot be notified again.)
196
197
 Example 
198
gap> FileString( Filename( prv, "toc.g" ), Concatenation( [
199
>  "AGR.GNAN(\"C4\",\"C4\");\n",
200
>  "AGR.GRS(\"C4\",4);\n",
201
>  "AGR.MXN(\"C4\",1);\n",
202
>  "AGR.MXO(\"C4\",[2]);\n",
203
>  "AGR.MXS(\"C4\",[\"C2\"]);\n",
204
>  "AGR.API(\"C4G1-p4B0\",[1,4,\"imprim\",\"1 < C2\"]);\n",
205
>  "AGR.API(\"A5G1-p60B0\",[1,60,\"imprim\",\"1 < A4\"]);\n",
206
>  ] ) );;
207

208
209
Then we notify the private directory.
210
211
 Example 
212
gap> AtlasOfGroupRepresentationsNotifyPrivateDirectory( prv, "priv", true );
213
true
214

215
216
Now we can use the interface functions for accessing the data in the private
217
directory.
218
219
 Example 
220
gap> DisplayAtlasInfo( [ "C4" ] );
221
group | # | maxes | cl | cyc | out | fnd | chk | prs
222
------+---+-------+----+-----+-----+-----+-----+----
223
C4* | 2 | 1 | | | 2 | | | 
224
gap> DisplayAtlasInfo( "C4" );
225
Representations for G = C4: (all refer to std. generators 1)
226
---------------------------
227
1: G <= Sym(4)* rank 4, on cosets of 1 < C2
228
2: G <= GL(1a,C)* 
229

230
Programs for G = C4: (all refer to std. generators 1)
231
--------------------
232
automorphisms:
233
 2*
234
maxes (all 1):
235
 1*: C2
236
other scripts:
237
 "test"*
238
gap> DisplayAtlasInfo( "C4", IsPermGroup, true );
239
Representations for G = C4: (all refer to std. generators 1)
240
---------------------------
241
1: G <= Sym(4)* rank 4, on cosets of 1 < C2
242
gap> DisplayAtlasInfo( "C4", IsMatrixGroup );
243
Representations for G = C4: (all refer to std. generators 1)
244
---------------------------
245
2: G <= GL(1a,C)* 
246
gap> DisplayAtlasInfo( "C4", Dimension, 2 );
247
gap> DisplayAtlasInfo( "A5", NrMovedPoints, 60 );
248
Representations for G = A5: (all refer to std. generators 1)
249
---------------------------
250
4: G <= Sym(60)* rank 60, on cosets of 1 < A4
251
gap> info:= OneAtlasGeneratingSetInfo( "C4" );
252
rec( groupname := "C4", id := "", 
253
 identifier := [ [ "priv", "C4" ], [ "C4G1-p4B0.m1" ], 1, 4 ], 
254
 isPrimitive := false, p := 4, rankAction := 4, 
255
 repname := "C4G1-p4B0", repnr := 1, size := 4, 
256
 stabilizer := "1 < C2", standardization := 1, transitivity := 1, 
257
 type := "perm" )
258
gap> AtlasGenerators( info.identifier );
259
rec( generators := [ (1,2,3,4) ], groupname := "C4", id := "", 
260
 identifier := [ [ "priv", "C4" ], [ "C4G1-p4B0.m1" ], 1, 4 ], 
261
 isPrimitive := false, p := 4, rankAction := 4, 
262
 repname := "C4G1-p4B0", repnr := 1, size := 4, 
263
 stabilizer := "1 < C2", standardization := 1, transitivity := 1, 
264
 type := "perm" )
265
gap> AtlasProgram( "C4", 1 );
266
rec( groupname := "C4", 
267
 identifier := [ [ "priv", "C4" ], "C4G1-max1W1", 1 ], 
268
 program := <straight line program>, size := 2, standardization := 1,
269
 subgroupname := "C2" )
270
gap> AtlasProgram( "C4", "maxes", 1 );
271
rec( groupname := "C4", 
272
 identifier := [ [ "priv", "C4" ], "C4G1-max1W1", 1 ], 
273
 program := <straight line program>, size := 2, standardization := 1,
274
 subgroupname := "C2" )
275
gap> AtlasProgram( "C4", "maxes", 2 );
276
fail
277
gap> AtlasGenerators( "C4", 1 );
278
rec( generators := [ (1,2,3,4) ], groupname := "C4", id := "", 
279
 identifier := [ [ "priv", "C4" ], [ "C4G1-p4B0.m1" ], 1, 4 ], 
280
 isPrimitive := false, p := 4, rankAction := 4, 
281
 repname := "C4G1-p4B0", repnr := 1, size := 4, 
282
 stabilizer := "1 < C2", standardization := 1, transitivity := 1, 
283
 type := "perm" )
284
gap> AtlasGenerators( "C4", 2 );
285
rec( dim := 1, generators := [ [ [ E(4) ] ] ], groupname := "C4", 
286
 id := "a", identifier := [ [ "priv", "C4" ], "C4G1-Ar1aB0.g", 1, 1 ]
287
 , repname := "C4G1-Ar1aB0", repnr := 2, size := 4, 
288
 standardization := 1, type := "matalg" )
289
gap> AtlasGenerators( "C4", 3 );
290
fail
291
gap> AtlasProgram( "C4", "other", "test" );
292
rec( groupname := "C4", 
293
 identifier := [ [ "priv", "C4" ], "C4G1-XtestW1", 1 ], 
294
 program := <straight line program>, standardization := 1 )
295

296
297
We can restrict the data shown by DisplayAtlasInfo (3.5-1) to the private
298
directory, as follows.
299
300
 Example 
301
gap> DisplayAtlasInfo( "contents", "priv" );
302
group | # | maxes | cl | cyc | out | fnd | chk | p*
303
-------------------------+---+-------+----+-----+-----+-----+-----+--*
304
A5* | 1 | | | | | | | *
305
C4* | 2 | 1 | | | 2 | | | *
306

307
308
For checking the data in the private directory, we apply the relevant sanity
309
checks (see Section 7.8).
310
311
 Example 
312
gap> if not IsBound( AGR.Test ) then
313
>  ReadPackage( "atlasrep", "gap/test.g" );
314
>  fi;
315
gap> AGR.Test.Words( "priv" );
316
true
317
gap> AGR.Test.FileHeaders( "priv" );
318
true
319
gap> AGR.Test.Files( "priv" );
320
true
321
gap> AGR.Test.BinaryFormat( "priv" );
322
true
323
gap> AGR.Test.Primitivity( "priv" );
324
true
325
gap> AGR.Test.Characters( "priv" );
326
true
327

328
329
Finally, we uninstall the private directory, and reset the info level that
330
had been set to 1 in the beginning. (Also the group name C4 is removed this
331
way, which is an advantage of using a toc.g file over calling AGRGNAN
332
directly.), Note that we need not remove the data in the temporary
333
directory, GAP will do this automatically.
334
335
 Example 
336
gap> AtlasOfGroupRepresentationsForgetPrivateDirectory( "priv" );
337
gap> SetInfoLevel( InfoAtlasRep, level );
338

339
340
341