/*
Nilpotent is not tested on non p-groups properly because
	(a) I dont know any nilpotent non p-groups
	(b) frattini is only implemented for p-groups.
*/

inform("Testing Permutation Groups.", 1);
inform("Defining Permutation Groups.", 2);

// Soluble group, degree 16
// Order 7962624 = 2^15 * 3^5   Base 1,2,3,4,5,6,8,10,11,13,14,15
s16<s16a, s16b, s16c, s16d> := sub<Sym(16) |
    (3,9),
    (1,9)(2,5)(3,6)(4,7),
    (1,6,2,7),
    (1,9,8,13)(2,5,11,15)(3,10,14,6)(4,12,16,7)
>;
w( false, "defn: s16.");

// Imprimitive group, degree 14, order 10752, blocks of size 2.
im14<im14a, im14b> := sub<Sym(14) |
    (1,2)(3,4)(5,6)(7,8)(9,10)(11,12),
    (1,13)(2,3,7,5)(6,9,11,8)(10,14)
>;
w( false, "defn: im14.");

// Imprimitive group, degree 21, order 2939328, blocks of size 3.
im21<im21a, im21b> := sub<Sym(21) |
    (1,2)(3,4)(5,6)(7,8)(9,10)(11,12)(13,14)(15,16),
    (17,18,1)(2,3,5)(4,7,9)(6,11,8)(10,19,13)(12,20,15)(14,21,16)
>;
w( false, "defn: im21.");

// Imprimitive group, degree 24, order 1351680, blocks of size 2.
im24<im24a, im24b> := sub<Sym(24) |
    (1,2)(3,4)(5,6)(7,8)(9,10)(11,12)(13,14)(15,16)(17,18)(19,20)(21,22)(23,24),
    (1,2,3)(4,5,7)(6,9,11)(8,10,13)(12,15,17)(14,19,18)(16,21,20)(22,23,24)
>;
w( false, "defn: im24.");

// 2^6.3.A6.2, degree 24 "
// Order 2^10 * 3^3 * 5 "
l302<l302a, l302b, l302c, l302d, l302e> := sub<Sym(24) |
    (1,3)(2,4)(5,11)(8,13)(9,16)(14,19)(17,20)(21,22),
    (1,2)(3,4)(5,13)(8,11)(9,20)(14,22)(16,17)(19,21),
    (2,8)(4,5)(7,10)(9,20)(12,17)(14,23)(16,24)(18,22),
    (3,6)(4,15)(5,7)(9,22)(10,13)(14,19)(16,20)(17,21),
    (6,9)(7,19)(10,21)(12,14)(15,20)(16,23)(17,18)(22,24)
>;
w( false, "defn: l302.");

// 2^6.3.A6, degree 24 "
// Order 2^9 * 3^3 * 5 "
// Derived subgroup of l302 "
l303<l303a, l303b, l303c, l303d> := sub<Sym(24) |
    (2,11,8)(4,13,5)(9,16,12)(14,23,19)(17,24,20)(18,21,22),
    (1,3,6)(2,4,15)(5,7,11)(8,13,10)(9,21,20)(16,17,22),
    (6,23)(7,12)(9,16)(10,24)(14,19)(15,18)(17,20)(21,22),
    (1,11)(2,8)(3,13)(4,5)(12,24)(14,22)(16,17)(18,23)
>;
w( false, "defn: l303.");

p10n7<p10n7a, p10n7b, p10n7c, p10n7d> := sub<Sym(10) |
    \[2,3,1,5,6,4,8,9,7,10],
    \[1,6,8,9,2,4,5,7,3,10],
    \[1,2,3,7,8,9,4,5,6,10],
    \[10,2,3,7,6,5,4,9,8,1]
>;
w( false, "defn: p10n7.");

// Primitive, degree 11, no 4
p11n4<p11n4a, p11n4b> := sub<Sym(11) |
    \[2,3,4,5,6,7,8,9,10,11,1],
    \[1,3,5,7,9,11,2,4,6,8,10]
>;
w( false, "defn: p11n4.");

// Primitive, degree 11, no 5
p11n5<p11n5a, p11n5b, p11n5c> := sub<Sym(11) |
    \[1,6,5,7,3,2,4,8,10,9,11],
    \[5,9,8,2,7,6,1,10,4,3,11],
    \[11,7,5,6,3,4,2,8,9,10,1]
>;
w( false, "defn: p11n5.");

// Primitive, degree 11, no 6
p11n6<p11n6a, p11n6b, p11n6c, p11n6d, p11n6e> := sub<Sym(11) |
    \[2,3,1,5,6,4,8,9,7,10,11],
    \[1,4,7,3,6,9,2,5,8,10,11],
    \[1,9,5,6,2,7,8,4,3,10,11],
    \[10,2,3,7,6,5,4,9,8,1,11],
    \[1,2,3,8,9,7,6,4,5,11,10]
>;
w( false, "defn: p11n6.");

// Primitive, degree 12, no 4
p12n4<p12n4a, p12n4b, p12n4c, p12n4d, p12n4e, p12n4f> :=  sub<Sym(12) |
    \[2,3,1,5,6,4,8,9,7,10,11,12],
    \[1,4,7,3,6,9,2,5,8,10,11,12],
    \[1,9,5,6,2,7,8,4,3,10,11,12],
    \[10,2,3,7,6,5,4,9,8,1,11,12],
    \[1,2,3,8,9,7,6,4,5,11,10,12],
    \[1,2,3,7,8,9,4,5,6,10,12,11]
>;
w( false, "defn: p12n4.");

// Primitive, degree 16, no 18
p16<p16a, p16b, p16c> := sub<Sym(16) |
    \[15,9,6,3,12,10,5,2,13,11,4,1,14,8,7,16],
    \[7,11,12,13,10,6,1,14,9,5,2,3,4,8,15,16],
    \[16,3,2,5,4,7,6,9,8,11,10,13,12,15,14,1]
>;
w( false, "defn: p16.");

// Primitive, degree 8, no 4
p8n4<p8n4a, p8n4b, p8n4c> := sub<Sym(8) |
    \[2,3,4,5,6,7,1,8],
    \[1,4,7,3,6,2,5,8],
    \[8,7,4,3,6,5,2,1]
>;
w( false, "defn: p8n4.");

// Primitive, degree 8, no 5
p8n5<p8n5a, p8n5b, p8n5c> := sub<Sym(8) |
    \[2,3,4,5,6,7,1,8],
    \[1,3,2,7,5,6,4,8],
    \[8,4,7,2,6,5,3,1]
>;
w( false, "defn: p8n5.");

// Soluble group, degree 12
// Order 648 = 2^3 * 3^4   Base 1,2,4,7
s12<s12a, s12b> := sub<Sym(12) |
    (1,6,7)(2,5,8,3,4,9)(11,12),
    (1,3)(4,9,12)(5,8,10,6,7,11)
>;
w( false, "defn: s12.");

t12<t12a, tb, tc> := sub<Sym(12) |
    (1,2,3,4)(9,10,11,12),
    (4,5,6)(7,8,9),
    (6,7)
>;
w( false, "defn: t12.");

a4 := AlternatingGroup(GrpPerm, 4);
w( false, "defn: a4.");

ra4 := CosetImage(a4, sub<a4 | Id(a4)>);
w( false, "defn: ra4.");

ir12a := t12 ! (1,2,3)(4,5,6)(7,8,9);
ir12b := t12 ! (1,2,3)(4,5,6)(10,11,12);
ir12c := t12 ! (1,2,3)(7,8,9)(10,11,12);
ir12 := sub<t12 | ir12a, ir12b, ir12c>;
w( false, "defn: ir12.");

r12 := CosetImage(ir12, sub<ir12 | Id(ir12)>);
w( false, "defn: r12.");

a437 := AbelianGroup(GrpPerm, [4,3,7]);
w( false, "defn: a437.");

a10 := AlternatingGroup(GrpPerm, 10);
w( false, "defn: a10.");

a10x := a10 ! (1,8,2,4,7,9)(3,10);
a10y := a10 ! (1,10,7,4,2,5,8,6,9);

t7<t7a, t7b, t7c> := sub<Sym(7) |
    (1,2,3,4,5,6),
    (1,2),
    (1,7)
>;
w( false, "defn: t7.");

int12 := sub<t12 |
    (1,2,3)(7,8,9),
    (4,5,6)(10,11,12),
    (4,5,6,7,8,9)
>;
w( false, "defn: int12.");

g12 := sub<t12 |
    (4,5,6)(7,8,9),
    (2,5,6)(7,8,11),
    (1,5,6)(7,8,10),
    (3,5,6)(7,8,12),
    (4,5,7)(6,8,9)
>;
w( false, "defn: g12.");

g16 := sub<p16 |
    (1,15,7,5,12)(2,9,13,14,8)(3,6,10,11,4),
    (1,16)(2,3)(4,5)(6,7)(8,9)(10,11)(12,13)(14,15),
    (1,10,3,7,15)(2,13,12,6,5)(4,8,14,11,9)
>;
w( false, "defn: g16.");

as12 := sub<t12 |
    (1,2,3,4,5,6),
    (1,2),
    (7,8)(9,10,11,12),
    (7,8,9)
>;
w( false, "defn: as12.");

d16 := DihedralGroup(GrpPerm, 16);
w( false, "defn: d16.");

c41 := CyclicGroup(GrpPerm, 41);
w( false, "defn: c41.");
