The same dichotomy between creation and group structure computation as the one discussed for GenericAbelianGroup applies for subgroups of generic abelian groups. That is, if H is a subgroup of the generic abelian group A, then, as a general rule, the structure of H is not computed at creation time. There are two exceptions to this rule: when the user specifically requests structure computation to be performed (via the ComputeStructure parameter), and when the structure of A is already known and H is given in terms of a set of generators, or H is a p-Sylow subgroup of A.
Construct the subgroup of the generic abelian group A generated by the elements specified by the terms of the generator list L. A term L[i] of the generator list may consist of any of the following objects:As seen in subsection Constructing an Element of a Generic Abelian Group an element liftable into A may be an element of A itself, or it may be an element of U (Universe(U)), U being as usual the domain over which A is defined.
- (a)
- An element liftable into A;
- (b)
- A sequence of integers representing an element of A;
- (c)
- A set or sequence of either of the two above described types.
For consistency with the construction of a generic abelian group, the following parameters may also be passed to the subgroup constructor:
Order: RngInt Default:
RandomIntrinsic: MonStg Default:
ComputeStructure: Bool Default: false
UseUserGenerators: Bool Default: false
PollardRhoRParam: RngInt Default: 20
PollardRhoTParam: RngInt Default: 8
PollardRhoVParam: RngInt Default: 3
In particular, it is possible to construct a subgroup by giving its order and a random function generating elements of the subgroup. In this case, the list L would be empty since computing the subgroup's structure will be achieved by building the p-Sylow subgroups from random elements (of the subgroup).
Also, if the group structure of A is already known/computed, and if the subgroup is defined in terms of a set of generators in L then the subgroup structure is computed at the time of creation.
> S := []; > for j in [1..2] do > P := Random(GA_Zm); > Include(~S, P); > end for; > S; [ 6395, 33037 ] > GH1_Zm := sub< GA_Zm | S>; > GH1_Zm; Generic Abelian Group over Residue class ring of integers modulo 34384 Abelian Group isomorphic to Z/6 + Z/612 Defined on 2 generators in supergroup GA_Zm: GH1_Zm.1 = GA_Zm.2 + GA_Zm.3 GH1_Zm.2 = GA_Zm.4 Relations: 6*GH1_Zm.1 = 0 612*GH1_Zm.2 = 0 > > > S := []; > for j in [1..5] do > P := Random(U); > Include(~S, P); > end for; > S; [ 18731, 2255, 14303, 3013, 14389 ] > GH2_Zm := sub< GA_Zm | S>; > GH2_Zm; Generic Abelian Group over Residue class ring of integers modulo 34384 Abelian Group isomorphic to Z/2 + Z/2 + Z/6 + Z/612 Defined on 4 generators in supergroup GA_Zm: GH2_Zm.1 = GA_Zm.1 GH2_Zm.2 = GA_Zm.2 GH2_Zm.3 = GA_Zm.3 GH2_Zm.4 = GA_Zm.4 Relations: 2*GH2_Zm.1 = 0 2*GH2_Zm.2 = 0 6*GH2_Zm.3 = 0 612*GH2_Zm.4 = 0The next statements create and compute two subgroups of GA_(qf). In both cases subgroup structure computation is automatic since the supergroup structures GA_(Zm) and GA_(qf) were already computed.
> S := []; > for j in [1..2] do > P := Random(GA_qf); > Include(~S, P); > end for; > S; [ <45,26,22226>, <937,-930,1298> ] > GH1_qf := sub< GA_qf | S>; > GH1_qf; Generic Abelian Group over Binary quadratic forms of discriminant -4000004 Abelian Group isomorphic to Z/2 + Z/258 Defined on 2 generators in supergroup GA_qf: GH1_qf.1 = GA_qf.1 GH1_qf.2 = 2*GA_qf.2 Relations: 2*GH1_qf.1 = 0 258*GH1_qf.2 = 0 > > > S := []; > for j in [1..2] do > P := Random(Q); > Include(~S, P); > end for; > S; [ <225,136,4465>, <270,-226,3751> ] > GH2_qf := sub< GA_qf | S>; > GH2_qf; Generic Abelian Group over Binary quadratic forms of discriminant -4000004 Abelian Group isomorphic to Z/516 Defined on 1 generator in supergroup GA_qf: GH2_qf.1 = GA_qf.1 + GA_qf.2 Relations: 516*GH2_qf.1 = 0
ComputeStructure: Bool Default: false
Create the p-Sylow subgroup of A. If ComputeStructure is true, or if the group structure of A is known, then the group structure is computed at the time of creation.
> order_fact := Factorization(#U); > for i in [1..#order_fact] do > p := order_fact[ i, 1 ]; > printf "%o-Sylow subgroup:", p; > GAp := Sylow(GA_Zm, p); > GAp; > end for; 2-Sylow subgroup: Generic Abelian Group over Residue class ring of integers modulo 34384 Abelian Group isomorphic to Z/2 + Z/2 + Z/2 + Z/4 Defined on 4 generators in supergroup GA_Zm: GAp.1 = GA_Zm.1 GAp.2 = GA_Zm.2 GAp.3 = 3*GA_Zm.3 GAp.4 = 153*GA_Zm.4 Relations: 2*GAp.1 = 0 2*GAp.2 = 0 2*GAp.3 = 0 4*GAp.4 = 0 3-Sylow subgroup: Generic Abelian Group over Residue class ring of integers modulo 34384 Abelian Group isomorphic to Z/3 + Z/9 Defined on 2 generators in supergroup GA_Zm: GAp.1 = 2*GA_Zm.3 GAp.2 = 68*GA_Zm.4 Relations: 3*GAp.1 = 0 9*GAp.2 = 0 17-Sylow subgroup: Generic Abelian Group over Residue class ring of integers modulo 34384 Abelian Group isomorphic to Z/17 Defined on 1 generator in supergroup GA_Zm: GAp.1 = 36*GA_Zm.4 Relations: 17*GAp.1 = 0