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
<Chapter Label="CongruenceSubgroups">
2
<Heading>Construction of congruence subgroups</Heading>
3
4
<Index Key="IsCongruenceSubgroup"><C>IsCongruenceSubgroup</C></Index>
5
The package &Congruence; provides functions to construct several
6
types of canonical congruence subgroups in <M>SL_2(&ZZ;)</M>, and also
7
intersections of a finite number of such subgroups. They will return
8
a matrix group in the category <C>IsCongruenceSubgroup</C>,
9
which is defined as a subcategory of <C>IsMatrixGroup</C>, and
10
which will have a distinguishing property determining whether it is
11
a congruence subgroup of one of the canonical types, or an intersection
12
of such congruence subgroups (if it can not be reduced to one of the
13
canonical congruence subgroups).
14
15
To start to work with the package, you need first to load it as follows:
16
17
<Log>
18
<![CDATA[
19
gap> LoadPackage("congruence");
20
-----------------------------------------------------------------------------
21
Loading Congruence 1.1.0 (Congruence subgroups of SL(2,Integers))
22
by Ann Dooms (http://homepages.vub.ac.be/~andooms),
23
Eric Jespers (http://homepages.vub.ac.be/~efjesper),
24
Alexander Konovalov (http://www.cs.st-andrews.ac.uk/~alexk/), and
25
Helena Verrill (http://www.math.lsu.edu/~verrill).
26
-----------------------------------------------------------------------------
27
true
28
]]>
29
</Log>
30
31
<Section Label="CongConstr">
32
<Heading>Construction of congruence subgroups</Heading>
33
34
<ManSection>
35
<Oper Name="PrincipalCongruenceSubgroup"
36
Arg="N"
37
Comm="" />
38
<Description>
39
Returns the principal congruence subgroup <M>\Gamma(N)</M> of level <A>N</A>
40
in <M>SL_2(&ZZ;)</M>.<P/>
41
This subgroup consists of
42
all matrices of the form
43
<Alt Only="LaTeX">
44
<Display>
45
<![CDATA[
46
\left(
47
\begin{array}{rr}
48
1+N a & N b \\
49
N c & 1+N d
50
\end{array}
51
\right)
52
]]>
53
</Display>
54
</Alt>
55
<Alt Only="Text,HTML"><Verb><![CDATA[
56
[1+N*a N*b]
57
[ N*c 1+N*d]
58
]]></Verb></Alt>
59
where <M>a</M>,<M>b</M>,<M>c</M>,<M>d</M> are integers.
60
The returned group will have the property
61
<Ref Prop="IsPrincipalCongruenceSubgroup" />.
62
</Description>
63
</ManSection>
64
65
<Example>
66
<![CDATA[
67
gap> G_8:=PrincipalCongruenceSubgroup(8);
68
<principal congruence subgroup of level 8 in SL_2(Z)>
69
gap> IsGroup(G_8);
70
true
71
gap> IsMatrixGroup(G_8);
72
true
73
gap> DimensionOfMatrixGroup(G_8);
74
2
75
gap> MultiplicativeNeutralElement(G_8);
76
[ [ 1, 0 ], [ 0, 1 ] ]
77
gap> One(G);
78
[ [ 1, 0 ], [ 0, 1 ] ]
79
gap> [[1,2],[3,4]] in G_8;
80
false
81
gap> [[1,8],[8,65]] in G_8;
82
true
83
gap> SL_2:=SL(2,Integers);
84
SL(2,Integers)
85
gap> IsSubgroup(SL_2,G_8);
86
true
87
]]>
88
</Example>
89
90
91
<ManSection>
92
<Oper Name="CongruenceSubgroupGamma0"
93
Arg="N"
94
Comm="" />
95
<Description>
96
Returns the congruence subgroup <M>\Gamma_0(N)</M>
97
of level <A>N</A> in <M>SL_2(&ZZ;)</M>.<P/>
98
This subgroup consists of
99
all matrices of the form
100
<Alt Only="LaTeX">
101
<Display>
102
<![CDATA[
103
\left(
104
\begin{array}{rr}
105
a & b \\
106
N c & d
107
\end{array}
108
\right)
109
]]>
110
</Display>
111
</Alt>
112
<Alt Only="Text,HTML"><Verb><![CDATA[
113
[a b]
114
[N*c d]
115
]]></Verb></Alt>
116
where <M>a</M>,<M>b</M>,<M>c</M>,<M>d</M> are integers.
117
The returned group will have the property
118
<Ref Prop="IsCongruenceSubgroupGamma0" />.
119
</Description>
120
</ManSection>
121
122
<Example>
123
<![CDATA[
124
gap> G0_4:=CongruenceSubgroupGamma0(4);
125
<congruence subgroup CongruenceSubgroupGamma_0(4) in SL_2(Z)>
126
]]>
127
</Example>
128
129
130
<ManSection>
131
<Oper Name="CongruenceSubgroupGammaUpper0"
132
Arg="N"
133
Comm="" />
134
<Description>
135
Returns the congruence subgroup <M>\Gamma^0(N)</M>
136
of level <A>N</A> in <M>SL_2(&ZZ;)</M>.<P/>
137
This subgroup consists of
138
all matrices of the form
139
<Alt Only="LaTeX">
140
<Display>
141
<![CDATA[
142
\left(
143
\begin{array}{rr}
144
a & N b \\
145
c & d
146
\end{array}
147
\right)
148
]]>
149
</Display>
150
</Alt>
151
<Alt Only="Text,HTML"><Verb><![CDATA[
152
[a N*b]
153
[c d]
154
]]></Verb></Alt>
155
where <M>a</M>,<M>b</M>,<M>c</M>,<M>d</M> are integers.
156
The returned group will have the property
157
<Ref Prop="IsCongruenceSubgroupGammaUpper0" />.
158
</Description>
159
</ManSection>
160
161
<Example>
162
<![CDATA[
163
gap> GU0_2:=CongruenceSubgroupGammaUpper0(2);
164
<congruence subgroup CongruenceSubgroupGamma^0(2) in SL_2(Z)>
165
]]>
166
</Example>
167
168
169
<ManSection>
170
<Oper Name="CongruenceSubgroupGamma1"
171
Arg="N"
172
Comm="" />
173
<Description>
174
Returns the congruence subgroup <M>\Gamma_1(N)</M>
175
of level <A>N</A> in <M>SL_2(&ZZ;)</M>.<P/>
176
This subgroup consists of
177
all matrices of the form
178
<Alt Only="LaTeX">
179
<Display>
180
<![CDATA[
181
\left(
182
\begin{array}{rr}
183
1+N a & b \\
184
N c & 1+N d
185
\end{array}
186
\right)
187
]]>
188
</Display>
189
</Alt>
190
<Alt Only="Text,HTML"><Verb><![CDATA[
191
[1+N*a b]
192
[ N*c 1+N*d]
193
]]></Verb></Alt>
194
where <M>a</M>,<M>b</M>,<M>c</M>,<M>d</M> are integers.
195
The returned group will have the property
196
<Ref Prop="IsCongruenceSubgroupGamma1" />.
197
</Description>
198
</ManSection>
199
200
<Example>
201
<![CDATA[
202
gap> G1_6:=CongruenceSubgroupGamma1(6);
203
<congruence subgroup CongruenceSubgroupGamma_1(6) in SL_2(Z)>
204
]]>
205
</Example>
206
207
208
<ManSection>
209
<Oper Name="CongruenceSubgroupGammaUpper1"
210
Arg="N"
211
Comm="" />
212
<Description>
213
Returns the congruence subgroup <M>\Gamma^1(N)</M>
214
of level <A>N</A> in <M>SL_2(&ZZ;)</M>.<P/>
215
This subgroup consists of
216
all matrices of the form
217
<Alt Only="LaTeX">
218
<Display>
219
<![CDATA[
220
\left(
221
\begin{array}{rr}
222
1+N a & N b \\
223
c & 1+N d
224
\end{array}
225
\right)
226
]]>
227
</Display>
228
</Alt>
229
<Alt Only="Text,HTML"><Verb><![CDATA[
230
[1+N*a N*b]
231
[ c 1+N*d]
232
]]></Verb></Alt>
233
where <M>a</M>,<M>b</M>,<M>c</M>,<M>d</M> are integers.
234
The returned group will have the property
235
<Ref Prop="IsCongruenceSubgroupGammaUpper1" />.
236
</Description>
237
</ManSection>
238
239
<Example>
240
<![CDATA[
241
gap> GU1_4:=CongruenceSubgroupGammaUpper1(4);
242
<congruence subgroup CongruenceSubgroupGamma^1(4) in SL_2(Z)>
243
]]>
244
</Example>
245
246
247
<ManSection>
248
<Func Name="IntersectionOfCongruenceSubgroups"
249
Arg="G1, G2, ..., GN" />
250
<Func Name="Intersection"
251
Arg="G1, G2, ..., GN" />
252
<Description>
253
Returns the intersection of its arguments, which can be
254
congruence subgroups or their intersections, constructed
255
with the same function. It is not necessary for the user
256
to use <C>IntersectionOfCongruenceSubgroups</C>, since
257
it will be called automatically from <C>Intersection</C>.<P/>
258
259
The returned group will have the property
260
<Ref Prop="IsIntersectionOfCongruenceSubgroups" />.<P/>
261
262
The list of congruence subgroups that form the intersection
263
can be obtained using <Ref Attr="DefiningCongruenceSubgroups"/>.
264
265
Note, that when the intersection appears to be one of the
266
canonical congruence subgroups, the package will recognize
267
this and will return a canonical subgroup of the
268
appropriate type.
269
270
</Description>
271
</ManSection>
272
273
<Example>
274
<![CDATA[
275
gap> I:=IntersectionOfCongruenceSubgroups(G0_4,GU1_4);
276
<principal congruence subgroup of level 4 in SL_2(Z)>
277
gap> J:=IntersectionOfCongruenceSubgroups(G0_4,G1_6);
278
<intersection of congruence subgroups of resulting level 12 in SL_2(Z)>
279
]]>
280
</Example>
281
282
</Section>
283
284
<!-- ********************************************************* -->
285
286
<Section Label="CongProperties">
287
<Heading>Properties of congruence subgroups</Heading>
288
289
A congruence subgroup constructed by one of the five above listed functions
290
will have certain properties determining its type. These properties will be
291
used for method selection by &Congruence; algorithms. Note that they do not
292
provide an actual test whether a certain matrix group is a congruence subgroup
293
or not.
294
295
<ManSection>
296
<Prop Name="IsPrincipalCongruenceSubgroup"
297
Arg="G"/>
298
<Description>
299
For a congruence subgroup <A>G</A> in the category
300
<C>IsCongruenceSubgroup</C>, returns <K>true</K> if <A>G</A> was
301
constructed by <Ref Func="PrincipalCongruenceSubgroup" />
302
(or reduced to one as a result of an intersection) and
303
returns <K>false</K> otherwise.
304
</Description>
305
</ManSection>
306
307
<Example>
308
<![CDATA[
309
gap> IsPrincipalCongruenceSubgroup(G_8);
310
true
311
gap> IsPrincipalCongruenceSubgroup(G0_4);
312
false
313
gap> IsPrincipalCongruenceSubgroup(I);
314
true
315
]]>
316
</Example>
317
318
319
<ManSection>
320
<Prop Name="IsCongruenceSubgroupGamma0"
321
Arg="G"/>
322
<Description>
323
For a congruence subgroup <A>G</A> in the category
324
<C>IsCongruenceSubgroup</C>, returns <K>true</K> if
325
<A>G</A> was constructed by <Ref Func="CongruenceSubgroupGamma0" /> (or reduced to one as a result of an intersection)
326
and returns <K>false</K> otherwise.
327
</Description>
328
</ManSection>
329
330
331
<ManSection>
332
<Prop Name="IsCongruenceSubgroupGammaUpper0"
333
Arg="G"/>
334
<Description>
335
For a congruence subgroup <A>G</A> in the category
336
<C>IsCongruenceSubgroup</C>, returns <K>true</K> if
337
<A>G</A> was constructed by <Ref Func="CongruenceSubgroupGammaUpper0" /> (or reduced to one as a result of an intersection)
338
and returns <K>false</K> otherwise.
339
</Description>
340
</ManSection>
341
342
343
<ManSection>
344
<Prop Name="IsCongruenceSubgroupGamma1"
345
Arg="G"/>
346
<Description>
347
For a congruence subgroup <A>G</A> in the category
348
<C>IsCongruenceSubgroup</C>, returns <K>true</K> if
349
<A>G</A> was constructed by <Ref Func="CongruenceSubgroupGamma1" /> (or reduced to one as a result of an intersection)
350
and returns <K>false</K> otherwise.
351
</Description>
352
</ManSection>
353
354
355
<ManSection>
356
<Prop Name="IsCongruenceSubgroupGammaUpper1"
357
Arg="G"/>
358
<Description>
359
For a congruence subgroup <A>G</A> in the category
360
<C>IsCongruenceSubgroup</C>, returns <K>true</K> if
361
<A>G</A> was constructed by <Ref Func="CongruenceSubgroupGammaUpper1" /> (or reduced to one as a result of an intersection)
362
and returns <K>false</K> otherwise.
363
</Description>
364
</ManSection>
365
366
367
<ManSection>
368
<Prop Name="IsIntersectionOfCongruenceSubgroups"
369
Arg="G"/>
370
<Description>
371
For a congruence subgroup <A>G</A> in the category
372
<C>IsCongruenceSubgroup</C>, returns <K>true</K> if
373
<A>G</A> was constructed by
374
<Ref Func="IntersectionOfCongruenceSubgroups"/> and
375
without being one of the canonical congruence
376
subgroups, otherwise it returns <K>false</K>.
377
</Description>
378
</ManSection>
379
380
<Example>
381
<![CDATA[
382
gap> IsIntersectionOfCongruenceSubgroups(I);
383
false
384
gap> IsIntersectionOfCongruenceSubgroups(J);
385
true
386
]]>
387
</Example>
388
389
</Section>
390
391
<!-- ********************************************************* -->
392
393
<Section Label="CongAttributes">
394
<Heading>Attributes of congruence subgroups</Heading>
395
396
The next three attributes store key properties of congruence subgroups.
397
398
<ManSection>
399
<Attr Name="LevelOfCongruenceSubgroup"
400
Arg="G"/>
401
<Description>
402
Stores the level of the congruence subgroup <A>G</A>. The (arithmetic) level of a congruence subgroup G is the smallest positive
403
number N such that G contains the principal congruence subgroup of level N.
404
</Description>
405
</ManSection>
406
407
<Example>
408
<![CDATA[
409
gap> LevelOfCongruenceSubgroup(G_8);
410
8
411
gap> LevelOfCongruenceSubgroup(G1_6);
412
6
413
gap> LevelOfCongruenceSubgroup(I);
414
4
415
gap> LevelOfCongruenceSubgroup(J);
416
12
417
]]>
418
</Example>
419
420
421
<ManSection>
422
<Attr Name="IndexInSL2Z"
423
Arg="G"/>
424
<Description>
425
Stores the index of the congruence subgroup <A>G</A> in <M>SL_2(&ZZ;)</M>.
426
</Description>
427
</ManSection>
428
429
<Example>
430
<![CDATA[
431
gap> IndexInSL2Z(G_8);
432
384
433
gap> G_2:=PrincipalCongruenceSubgroup(2);
434
<principal congruence subgroup of level 2 in SL_2(Z)>
435
gap> IndexInSL2Z(G_2);
436
12
437
gap> IndexInSL2Z(GU1_4);
438
12
439
]]>
440
</Example>
441
442
<ManSection>
443
<Attr Name="DefiningCongruenceSubgroups"
444
Arg="G" />
445
<Returns>
446
list of congruence subgroups
447
</Returns>
448
<Description>
449
For an intersection of congruence subgroups, returns
450
the list of congruence subgroups forming this intersection.
451
For a canonical congruence subgroup returns a list of length
452
one containing that subgroup.
453
</Description>
454
</ManSection>
455
456
<Example>
457
<![CDATA[
458
gap> DefiningCongruenceSubgroups(J);
459
[ <congruence subgroup CongruenceSubgroupGamma_0(4) in SL_2(Z)>,
460
<congruence subgroup CongruenceSubgroupGamma_1(6) in SL_2(Z)> ]
461
gap> P:=PrincipalCongruenceSubgroup(6);
462
<principal congruence subgroup of level 6 in SL_2(Z)>
463
gap> Q:=PrincipalCongruenceSubgroup(10);
464
<principal congruence subgroup of level 10 in SL_2(Z)>
465
gap> G:=IntersectionOfCongruenceSubgroups(Q,P);
466
<principal congruence subgroup of level 30 in SL_2(Z)>
467
gap> DefiningCongruenceSubgroups(G);
468
[ <principal congruence subgroup of level 30 in SL_2(Z)> ]
469
]]>
470
</Example>
471
472
</Section>
473
474
<!-- ********************************************************* -->
475
476
<Section Label="CongMethods">
477
<Heading>Operations for congruence subgroups</Heading>
478
479
&Congruence; installs several special methods for operations already
480
available in &GAP;.
481
482
<ManSection>
483
<Oper Name="Random"
484
Label="one and two argument versions"
485
Arg="G"/>
486
<Oper Name="Random"
487
Arg="G m"/>
488
<Description>
489
For a congruence subgroup <A>G</A> in the category
490
<C>IsCongruenceSubgroup</C>, returns random element.
491
In the two-argument form, the second parameter will
492
control the absolute value of randomly selected
493
entries of the matrix.
494
</Description>
495
</ManSection>
496
497
<Example>
498
<![CDATA[
499
gap> Random(G_2) in G_2;
500
true
501
gap> Random(G_8,2) in G_8;
502
true
503
]]>
504
</Example>
505
506
507
<ManSection>
508
<Oper Name="\in"
509
Arg="m G"/>
510
<Description>
511
It is easy to implement the membership test for
512
congruence subgroups and their intersections.
513
</Description>
514
</ManSection>
515
516
<Example>
517
<![CDATA[
518
gap> \in([ [ 21, 10 ], [ 2, 1 ] ],G_2);
519
true
520
gap> \in([ [ 21, 10 ], [ 2, 1 ] ],G_8);
521
false
522
]]>
523
</Example>
524
525
526
<ManSection>
527
<Oper Name="CanEasilyCompareCongruenceSubgroups"
528
Arg="G H"/>
529
<Description>
530
For congruence subgroups <A>G,H</A> in the category
531
<C>IsCongruenceSubgroup</C>, returns <K>true</K> if
532
<A>G</A> and <A>H</A> are of the same type listed in
533
<Ref Func="PrincipalCongruenceSubgroup" /> -->
534
<Ref Func="CongruenceSubgroupGammaUpper1" />
535
and have the same
536
<Ref Func="LevelOfCongruenceSubgroup"/> or if <A>G</A> and <A>H</A>
537
are of the type <Ref Func="IntersectionOfCongruenceSubgroups"/> and
538
the groups from
539
<Ref Func="DefiningCongruenceSubgroups"/> are in one
540
to one correspondence, otherwise it returns <K>false</K>.
541
</Description>
542
</ManSection>
543
544
545
<Example>
546
<![CDATA[
547
gap> CanEasilyCompareCongruenceSubgroups(G_8,I);
548
false
549
]]>
550
</Example>
551
552
<ManSection>
553
<Oper Name="IsSubset"
554
Arg="G H"/>
555
<Description>
556
&Congruence; provides methods for <C>IsSubset</C>
557
for congruence subgroups. <C>IsSubset</C> returns <K>true</K>
558
if <A>H</A> is a subset of <A>G</A>. These methods make it possible
559
to use <C>IsSubgroup</C> operation for congruence subgroups.
560
</Description>
561
</ManSection>
562
563
564
<Example>
565
<![CDATA[
566
gap> IsSubset(G_2,G_8);
567
true
568
gap> IsSubset(G_8,G_2);
569
false
570
gap> f:=[PrincipalCongruenceSubgroup,CongruenceSubgroupGamma1,CongruenceSubgroupGammaUpper1,CongruenceSubgroupGamma0,CongruenceSubgroupGammaUpper0];;
571
gap> g1:=List(f, t -> t(2));;
572
gap> g2:=List(f, t -> t(4));;
573
gap> for g in g2 do
574
> Print( List( g1, x -> IsSubgroup(x,g) ), "\n");
575
> od;
576
[ true, true, true, true, true ]
577
[ false, true, false, true, false ]
578
[ false, false, true, false, true ]
579
[ false, false, false, true, false ]
580
[ false, false, false, false, true ]
581
]]>
582
</Example>
583
584
585
<ManSection>
586
<Oper Name="Index"
587
Arg="G H"/>
588
<Description>
589
If a congruence subgroup <A>H</A> is a subgroup of a congruence
590
subgroup <A>G</A>, we can easily compute the index of <A>H</A> in
591
<A>G</A>, since we know the index of both subgroups in <M>SL_2(&ZZ;)</M>.
592
</Description>
593
</ManSection>
594
595
<Example>
596
<![CDATA[
597
gap> Index(G_2,G_8);
598
32
599
]]>
600
</Example>
601
602
</Section>
603
604
</Chapter>
605
606