17namespace layer1_foundations {
34 int &nb_perms,
int *&perms,
int verbose_level)
36 int f_v = (verbose_level >= 1);
37 int f_vv = (verbose_level >= 2);
42 cout <<
"group_generators_domain::generators_symmetric_group" << endl;
50 perms =
NEW_int(nb_perms * deg);
51 for (i = 0; i < nb_perms; i++) {
53 perms[i * deg + i] = i + 1;
54 perms[i * deg + i + 1] = i;
57 cout <<
"group_generators_domain::generators_symmetric_group generators are:" << endl;
60 for (i = 0; i < nb_perms; i++) {
66 cout <<
"group_generators_domain::generators_symmetric_group done" << endl;
71 int &nb_perms,
int *&perms,
int verbose_level)
73 int f_v = (verbose_level >= 1);
74 int f_vv = (verbose_level >= 2);
79 cout <<
"group_generators_domain::generators_cyclic_group" << endl;
87 perms =
NEW_int(nb_perms * deg);
88 for (j = 0; j < deg; j++) {
89 perms[i * deg + j] = j + 1;
91 perms[i * deg + i + deg - 1] = 0;
93 cout <<
"group_generators_domain::generators_cyclic_group generators are:" << endl;
96 for (i = 0; i < nb_perms; i++) {
102 cout <<
"group_generators_domain::generators_cyclic_group done" << endl;
107 int &nb_perms,
int *&perms,
int verbose_level)
109 int f_v = (verbose_level >= 1);
110 int f_vv = (verbose_level >= 2);
115 cout <<
"group_generators_domain::generators_dihedral_group" << endl;
124 perms =
NEW_int(nb_perms * deg);
125 for (j = 0; j < deg; j++) {
126 perms[i * deg + j] = j + 1;
128 perms[i * deg + i + deg - 1] = 0;
130 for (j = 0; j <= d2; j++) {
131 perms[i * deg + j] = deg - 1 - j;
132 perms[i * deg + deg - 1 - j] = j;
135 cout <<
"group_generators_domain::generators_dihedral_group "
136 "generators for dihedral group of degree "
137 << deg <<
" created" << endl;
140 for (i = 0; i < nb_perms; i++) {
146 cout <<
"group_generators_domain::generators_dihedral_group one" << endl;
151 int &nb_perms,
int *&perms,
int verbose_level)
153 int f_v = (verbose_level >= 1);
154 int f_vv = (verbose_level >= 2);
159 cout <<
"group_generators_domain::generators_dihedral_involution" << endl;
168 perms =
NEW_int(nb_perms * deg);
170 for (j = 0; j <= d2; j++) {
171 perms[i * deg + j] = deg - 1 - j;
172 perms[i * deg + deg - 1 - j] = j;
175 cout <<
"group_generators_domain::generators_dihedral_involution "
176 "generators for dihedral involution of degree "
177 << deg <<
" created" << endl;
180 for (i = 0; i < nb_perms; i++) {
186 cout <<
"group_generators_domain::generators_dihedral_involution done" << endl;
191 int &nb_perms,
int *&perms,
int verbose_level)
193 int f_v = (verbose_level >= 1);
194 int f_vv = (verbose_level >= 2);
199 cout <<
"group_generators_domain::generators_identity_group" << endl;
207 perms =
NEW_int(nb_perms * deg);
208 for (j = 0; j < deg; j++) {
212 cout <<
"group_generators_domain::generators_identity_group "
213 "generators for identity group of degree "
214 << deg <<
" created" << endl;
217 for (i = 0; i < nb_perms; i++) {
223 cout <<
"group_generators_domain::generators_identity_group done" << endl;
229 int &nb_perms,
int *&perms,
int °ree,
232 int f_v = (verbose_level >= 1);
233 int f_vv = (verbose_level >= 2);
238 cout <<
"group_generators_domain::generators_Hall_reflection" << endl;
240 degree = nb_pairs * 2;
242 perms =
NEW_int(nb_perms * degree);
244 for (i = 0; i < nb_pairs; i++) {
245 perms[2 * i] = 2 * i + 1;
246 perms[2 * i + 1] = 2 * i;
249 cout <<
"group_generators_domain::generators_Hall_reflection "
250 "generators for the Hall reflection group "
252 << degree <<
" created" << endl;
255 for (i = 0; i < 1; i++) {
256 Combi.
perm_print(cout, perms + i * degree, degree);
261 cout <<
"group_generators_domain::generators_Hall_reflection done" << endl;
267 int &nb_perms,
int *&perms,
int °ree,
270 int f_v = (verbose_level >= 1);
271 int f_vv = (verbose_level >= 2);
276 cout <<
"group_generators_domain::generators_Hall_reflection_normalizer_group" << endl;
278 degree = nb_pairs * 2;
279 nb_perms = nb_pairs + (nb_pairs - 1);
280 perms =
NEW_int(nb_perms * degree);
282 for (i = 0; i < nb_pairs; i++, h++) {
284 perms[h * degree + 2 * i] = 2 * i + 1;
285 perms[h * degree + 2 * i + 1] = 2 * i;
287 for (i = 0; i < nb_pairs - 1; i++, h++) {
289 perms[h * degree + 2 * i] = 2 * (i + 1);
290 perms[h * degree + 2 * i + 1] = 2 * (i + 1) + 1;
291 perms[h * degree + 2 * (i + 1)] = 2 * i;
292 perms[h * degree + 2 * (i + 1) + 1] = 2 * i + 1;
295 cout <<
"group_generators_domain::generators_Hall_reflection_normalizer_group "
296 "h != nb_perms" << endl;
300 cout <<
"group_generators_domain::generators_Hall_reflection_normalizer_group "
301 "generators for normalizer of the Hall reflection group "
303 << degree <<
" created" << endl;
306 for (i = 0; i < nb_perms; i++) {
307 Combi.
perm_print(cout, perms + i * degree, degree);
312 cout <<
"group_generators_domain::generators_Hall_reflection_normalizer_group done" << endl;
318 int *&factors,
int &nb_factors)
324 cout <<
"group_generators_domain::order_Hall_reflection_normalizer_factorized" << endl;
326 nb_perms = nb_pairs + nb_pairs - 1;
327 nb_factors = nb_perms;
330 for (i = 0; i < nb_pairs; i++, j++) {
333 for (i = 0; i < nb_pairs - 1; i++, j++) {
334 factors[j] = nb_pairs - i;
336 if (j != nb_factors) {
337 cout <<
"group_generators_domain:order_Hall_reflection_normalizer_factorized "
338 "j != nb_perms" << endl;
344 int n,
int *&factors,
int &nb_factors)
348 nb_factors = n + n - 1;
351 for (i = 0; i < n - 1; i++, j++) {
354 for (i = 0; i < n; i++, j++) {
357 if (j != nb_factors) {
358 cout <<
"group_generators_domain::order_Bn_group_factorized "
359 "j != nb_factors" << endl;
365 int n,
int °,
int &nb_perms,
int *&perms,
368 int f_v = (verbose_level >= 1);
369 int f_vv = (verbose_level >= 2);
374 cout <<
"group_generators_domain::generators_Bn_group" << endl;
377 nb_perms = n - 1 + n;
378 perms =
NEW_int(nb_perms * deg);
380 for (i = 0; i < n - 1; i++, j++) {
382 perms[j * deg + 2 * i] = 2 * (i + 1);
383 perms[j * deg + 2 * i + 1] = 2 * (i + 1) + 1;
384 perms[j * deg + 2 * (i + 1)] = 2 * i;
385 perms[j * deg + 2 * (i + 1) + 1] = 2 * i + 1;
387 for (i = 0; i < n; i++, j++) {
389 perms[j * deg + 2 * i] = 2 * i + 1;
390 perms[j * deg + 2 * i + 1] = 2 * i;
393 cout <<
"generators for Bn group of order n = " << n
394 <<
" and degree " << deg <<
" created" << endl;
397 cout <<
"generators_Bn_group j != nb_perms" << endl;
401 for (i = 0; i < nb_perms; i++) {
407 cout <<
"group_generators_domain::generators_Bn_group done" << endl;
412 int deg1,
int nb_perms1,
int *perms1,
413 int deg2,
int nb_perms2,
int *perms2,
414 int °3,
int &nb_perms3,
int *&perms3,
417 int f_v = (verbose_level >= 1);
418 int f_vv = (verbose_level >= 2);
424 cout <<
"group_generators_domain::generators_direct_product" << endl;
427 nb_perms3 = nb_perms1 + nb_perms2;
428 perms3 =
NEW_int(nb_perms3 * deg3);
434 for (i = 0; i < nb_perms1; i++) {
436 perms1 + i * deg1, id2, perms3 + k * deg3);
439 for (i = 0; i < nb_perms2; i++) {
441 perms2 + i * deg2, perms3 + k * deg3);
447 for (i = 0; i < nb_perms3; i++) {
448 Combi.
perm_print(cout, perms3 + i * deg3, deg3);
453 cout <<
"group_generators_domain::generators_direct_product done" << endl;
458 int deg1,
int nb_perms1,
int *perms1,
459 int deg2,
int nb_perms2,
int *perms2,
460 int °3,
int &nb_perms3,
int *&perms3,
463 int f_v = (verbose_level >= 1);
464 int f_vv = (verbose_level >= 2);
469 cout <<
"group_generators_domain::generators_concatenate" << endl;
472 cout <<
"group_generators_domain::generators_concatenate"
473 " deg1 != deg2" << endl;
477 nb_perms3 = nb_perms1 + nb_perms2;
478 perms3 =
NEW_int(nb_perms3 * deg3);
481 for (i = 0; i < nb_perms1; i++) {
482 Combi.
perm_move(perms1 + i * deg1, perms3 + k * deg3, deg3);
485 for (i = 0; i < nb_perms2; i++) {
486 Combi.
perm_move(perms2 + i * deg1, perms3 + k * deg3, deg3);
490 cout <<
"generators concatenated" << endl;
493 for (i = 0; i < nb_perms3; i++) {
494 Combi.
perm_print(cout, perms3 + i * deg3, deg3);
499 cout <<
"group_generators_domain::generators_concatenate done" << endl;
506 int f_semilinear,
int verbose_level)
508 int f_v = (verbose_level >= 1);
512 cout <<
"group_generators_domain::matrix_group_base_len_projective_group" << endl;
522 cout <<
"group_generators_domain::matrix_group_base_len_projective_group: "
523 "n=" << n <<
" q=" << q
524 <<
" f_semilinear=" << f_semilinear
525 <<
" base_len = " << base_len << endl;
528 cout <<
"group_generators_domain::matrix_group_base_len_projective_group done" << endl;
535 int f_semilinear,
int verbose_level)
537 int f_v = (verbose_level >= 1);
546 cout <<
"group_generators_domain::matrix_group_base_len_affine_group: "
547 "n=" << n <<
" q=" << q
548 <<
" f_semilinear=" << f_semilinear
549 <<
" base_len = " << base_len << endl;
556 int f_semilinear,
int verbose_level)
558 int f_v = (verbose_level >= 1);
567 cout <<
"group_generators_domain::matrix_group_base_len_general_linear_group: "
568 "n=" << n <<
" q=" << q
569 <<
" f_semilinear=" << f_semilinear
570 <<
" base_len = " << base_len << endl;
576 int epsilon,
int k,
int q,
580 int f_v = (verbose_level >= 1);
585 cout <<
"group_generators_domain::order_POmega_epsilon" << endl;
596 cout <<
"group_generators_domain::order_POmega_epsilon "
597 "done epsilon=" << epsilon
598 <<
" k=" << k <<
" q=" << q <<
" order=" << go << endl;
602 int f_v = (verbose_level >= 1);
605 n = Witt_index(epsilon, k);
607 cout <<
"Witt index is " << n << endl;
612 else if (epsilon == 1) {
613 order_Pomega_plusminus(1, n, q, go, verbose_level);
615 else if (epsilon == -1) {
616 order_Pomega_plusminus(-1, n, q, go, verbose_level);
624 int epsilon,
int k,
int q,
628 int f_v = (verbose_level >= 1);
634 cout <<
"group_generators_domain::order_PO_epsilon" << endl;
638 cout <<
"Witt index = " << m << endl;
640 order_PO(epsilon, m, q, go, verbose_level);
649 cout <<
"order_Pgroup_generators_domain::order_PO_epsilon done "
650 "f_semilinear=" << f_semilinear
651 <<
" epsilon=" << epsilon <<
" k=" << k
652 <<
" q=" << q <<
" order=" << go << endl;
657 int epsilon,
int m,
int q,
660 int f_v = (verbose_level >= 1);
663 cout <<
"group_generators_domain::order_PO epsilon = " << epsilon
664 <<
" m=" << m <<
" q=" << q << endl;
670 else if (epsilon == 1) {
673 else if (epsilon == -1) {
677 cout <<
"group_generators_domain::order_PO fatal: epsilon = " << epsilon << endl;
683 int epsilon,
int m,
int q,
689 else if (epsilon == 1) {
692 else if (epsilon == -1) {
696 cout <<
"group_generators_domain::order_Pomega "
697 "fatal: epsilon = " << epsilon << endl;
707 int f_v = (verbose_level >= 1);
714 Two.
create(2, __FILE__, __LINE__);
715 minusone.
create(-1, __FILE__, __LINE__);
716 Q.
create(q, __FILE__, __LINE__);
719 cout <<
"group_generators_domain::order_PO_plus " << q <<
"^(" << m <<
"*"
720 << m - 1 <<
") = " << Q << endl;
724 O.
create(1, __FILE__, __LINE__);
725 for (i = 1; i <= m - 1; i++) {
726 R.
create(q, __FILE__, __LINE__);
728 D.
add(R, minusone, S);
730 cout <<
"group_generators_domain::order_PO_plus " << q <<
"^"
731 << 2 * i <<
" - 1 = " << S << endl;
738 R.
create(q, __FILE__, __LINE__);
740 D.
add(R, minusone, S);
742 cout <<
"group_generators_domain::order_PO_plus " << q <<
"^" << m <<
" - 1 = " << S << endl;
759 cout <<
"group_generators_domain::order_PO_plus the order of PO" <<
"("
761 << q <<
") is " << o << endl;
770 int f_v = (verbose_level >= 1);
777 Two.
create(2, __FILE__, __LINE__);
778 plusone.
create(1, __FILE__, __LINE__);
779 minusone.
create(-1, __FILE__, __LINE__);
780 Q.
create(q, __FILE__, __LINE__);
783 cout <<
"group_generators_domain::order_PO_minus " << q <<
"^(" << m <<
"*"
784 << m + 1 <<
") = " << Q << endl;
788 O.
create(1, __FILE__, __LINE__);
789 for (i = 1; i <= m; i++) {
790 R.
create(q, __FILE__, __LINE__);
792 D.
add(R, minusone, S);
794 cout <<
"group_generators_domain::order_PO_minus " << q <<
"^" << 2 * i
795 <<
" - 1 = " << S << endl;
802 R.
create(q, __FILE__, __LINE__);
804 D.
add(R, plusone, S);
806 cout <<
"group_generators_domain::order_PO_minus " << q <<
"^" << m + 1
807 <<
" + 1 = " << S << endl;
824 cout <<
"group_generators_domain::order_PO_minus the order of PO^-" <<
"("
826 << q <<
") is " << o << endl;
835 int f_v = (verbose_level >= 1);
842 minusone.
create(-1, __FILE__, __LINE__);
843 Q.
create(q, __FILE__, __LINE__);
846 cout <<
"group_generators_domain::order_PO_parabolic " << q <<
"^(" << m
847 <<
"^2" <<
") = " << Q << endl;
851 O.
create(1, __FILE__, __LINE__);
852 for (i = 1; i <= m; i++) {
853 R.
create(q, __FILE__, __LINE__);
855 D.
add(R, minusone, S);
857 cout <<
"group_generators_domain::order_PO_parabolic " << q <<
"^"
858 << 2 * i <<
" - 1 = " << S << endl;
870 cout <<
"group_generators_domain::order_PO_parabolic the order of PO" <<
"("
872 << q <<
") is " << o << endl;
882 int f_v = (verbose_level >= 1);
890 cout <<
"group_generators_domain::order_Pomega_plus" << endl;
892 minusone.
create(-1, __FILE__, __LINE__);
893 Q.
create(q, __FILE__, __LINE__);
896 cout << q <<
"^(" << m <<
"*" << m - 1 <<
") = " << Q << endl;
898 O.
create(1, __FILE__, __LINE__);
899 for (i = 1; i <= m - 1; i++) {
900 R.
create(q, __FILE__, __LINE__);
902 D.
add(R, minusone, S);
904 cout << q <<
"^" << 2 * i <<
" - 1 = " << S << endl;
910 R.
create(q, __FILE__, __LINE__);
912 D.
add(R, minusone, S);
914 cout << q <<
"^" << m <<
" - 1 = " << S << endl;
933 cout <<
"group_generators_domain::order_Pomega_plus "
934 "the order of P\\Omega^1" <<
"("
936 << q <<
") is " << o << endl;
946 int f_v = (verbose_level >= 1);
953 cout <<
"group_generators_domain::order_Pomega_minus m=" << m <<
" q=" << q << endl;
955 minusone.
create(-1, __FILE__, __LINE__);
956 plusone.
create(1, __FILE__, __LINE__);
957 Q.
create(q, __FILE__, __LINE__);
960 cout << q <<
"^(" << m <<
"*" << m - 1 <<
") = " << Q << endl;
962 O.
create(1, __FILE__, __LINE__);
963 for (i = 1; i <= m - 1; i++) {
964 R.
create(q, __FILE__, __LINE__);
966 D.
add(R, minusone, S);
968 cout << q <<
"^" << 2 * i <<
" - 1 = " << S << endl;
974 R.
create(q, __FILE__, __LINE__);
976 D.
add(R, plusone, S);
978 cout << q <<
"^" << m <<
" + 1 = " << S << endl;
983 cout <<
"divide by 2" << endl;
990 cout <<
"divide by 2" << endl;
1003 cout <<
"group_generators_domain::order_Pomega_minus "
1004 "the order of P\\Omega^-1" <<
"("
1006 << q <<
") is " << o << endl;
1015 int f_v = (verbose_level >= 1);
1022 minusone.
create(-1, __FILE__, __LINE__);
1023 Q.
create(q, __FILE__, __LINE__);
1026 cout << q <<
"^(" << m <<
"^2) = " << Q << endl;
1028 O.
create(1, __FILE__, __LINE__);
1029 for (i = 1; i <= m; i++) {
1030 R.
create(q, __FILE__, __LINE__);
1032 D.
add(R, minusone, S);
1034 cout << q <<
"^" << 2 * i <<
" - 1 = " << S << endl;
1047 cout <<
"group_generators_domain::order_Pomega_parabolic the order of P\\Omega" <<
"("
1049 << q <<
") is " << o << endl;
1054 int epsilon,
int m,
int q,
int verbose_level)
1082 if (epsilon == -1) {
1101 if (epsilon == -1) {
1102 cout <<
"index_POmega_in_PO epsilon = -1 not "
1103 "yet implemented, returning 1" << endl;
1108 cout <<
"index_POmega_in_PO epsilon not recognized, "
1109 "epsilon=" << epsilon << endl;
1114 long int *orbit,
long int *orbit_inv,
int verbose_level)
1116 int f_v = (verbose_level >= 1);
1125 cout <<
"group_generators_domain::diagonal_orbit_perm" << endl;
1131 for (i = 0; i < l; i++) {
1135 for (i = 0; i < ll; i++) {
1138 for (j = 1; j < n; j++) {
1143 for (j = 0; j < n; j++) {
1144 cout << v[j] <<
" ";
1149 cout <<
" : " << a << endl;
1160 cout <<
"group_generators_domain::diagonal_orbit_perm done" << endl;
1165 long int *orbit,
long int *orbit_inv,
1168 int f_v = (verbose_level >= 1);
1178 cout <<
"group_generators_domain::frobenius_orbit_perm n=" << n
1179 <<
" (vector space dimension)" << endl;
1184 cout <<
"group_generators_domain::frobenius_orbit_perm l=" << l << endl;
1187 cout <<
"group_generators_domain::frobenius_orbit_perm GFq.e == 1" << endl;
1191 for (i = 0; i < l; i++) {
1196 cout <<
"before PG_element_unrank_modified("
1197 << n + F->
p <<
")" << endl;
1201 cout <<
"after PG_element_unrank_modified("
1202 << n + F->
p <<
")" << endl;
1204 for (i = 0; i < ll; i++) {
1207 for (j = 0; j < n; j++) {
1208 cout << v[j] <<
" ";
1213 cout <<
" : " << a << endl;
1225 cout <<
"group_generators_domain::frobenius_orbit_perm done" << endl;
1231 int base_len,
int degree,
1232 long int *base,
int *transversal_length,
1233 long int **orbit,
long int **orbit_inv,
1236 int f_v = (verbose_level >= 1);
1243 cout <<
"group_generators_domain::projective_matrix_group_base_and_orbits "
1244 "base_len=" << base_len << endl;
1246 for (i = 0; i < base_len; i++) {
1249 for (i = 0; i < base_len; i++) {
1250 transversal_length[i] = i;
1253 cout <<
"group_generators_domain::projective_matrix_group_base_and_orbits "
1254 "transversal_length: ";
1259 base[base_len - 1] = n + F->
p;
1266 for (i = 0; i < n; i++) {
1267 transversal_length[i] =
1270 cout <<
"group_generators_domain::projective_matrix_group_base_and_orbits "
1271 "transversal " << i <<
" of length "
1272 << transversal_length[i] << endl;
1275 cout <<
"group_generators_domain::projective_matrix_group_base_and_orbits "
1276 "before PG_element_modified_not_in_subspace_perm" << endl;
1279 orbit[i], orbit_inv[i], 0);
1282 cout <<
"group_generators_domain::projective_matrix_group_base_and_orbits "
1283 "after PG_element_modified_not_in_subspace_perm" << endl;
1296 cout <<
"group_generators_domain::projective_matrix_group_base_and_orbits: "
1297 "diagonal transversal " << i <<
" of length "
1298 << transversal_length[i] << endl;
1301 cout <<
"finite_field::projective_matrix_group_base_and_orbits "
1302 "before diagonal_orbit_perm" << endl;
1307 cout <<
"projective_matrix_group_base_and_orbits "
1308 "after diagonal_orbit_perm" << endl;
1320 transversal_length[i] = F->
e;
1322 cout <<
"group_generators_domain::projective_matrix_group_base_and_orbits: "
1323 "frobenius transversal " << i <<
" of length "
1324 << transversal_length[i] << endl;
1327 cout <<
"finite_field::projective_matrix_group_base_and_orbits "
1328 "before frobenius_orbit_perm" << endl;
1331 orbit[i], orbit_inv[i], verbose_level - 2);
1334 cout <<
"group_generators_domain::projective_matrix_group_base_and_orbits "
1335 "after frobenius_orbit_perm" << endl;
1346 if (i != base_len) {
1347 cout <<
"group_generators_domain::projective_matrix_group_base_and_orbits "
1348 "i != base_len" << endl;
1349 cout <<
"i=" << i << endl;
1350 cout <<
"base_len=" << base_len << endl;
1354 cout <<
"group_generators_domain::projective_matrix_group_base_and_orbits base: ";
1357 cout <<
"projective_matrix_group_base_and_orbits "
1358 "transversal_length: ";
1363 cout <<
"group_generators_domain::projective_matrix_group_base_and_orbits done" << endl;
1369 int base_len,
int degree,
1370 long int *base,
int *transversal_length,
1373 int f_v = (verbose_level >= 1);
1374 int f_vv = (verbose_level >= 2);
1380 cout <<
"group_generators_domain::projective_matrix_group_base_and_transversal_length" << endl;
1382 for (i = 0; i < base_len; i++) {
1386 base[base_len - 1] = n + F->
p;
1393 for (i = 0; i < n; i++) {
1394 transversal_length[i] =
1397 cout <<
"group_generators_domain::projective_matrix_group_base_and_transversal_length "
1398 "transversal " << i <<
" of length "
1399 << transversal_length[i] << endl;
1405 cout <<
"group_generators_domain::projective_matrix_group_base_and_transversal_length: "
1406 "diagonal transversal " << i <<
" of length "
1407 << transversal_length[i] << endl;
1412 transversal_length[i] = F->
e;
1414 cout <<
"group_generators_domain::projective_matrix_group_base_and_transversal_length: "
1415 "frobenius transversal " << i <<
" of length "
1416 << transversal_length[i] << endl;
1421 cout <<
"group_generators_domain::projective_matrix_group_base_and_transversal_length base: ";
1424 cout <<
"finite_field::projective_matrix_group_base_and_transversal_length "
1425 "transversal_length: ";
1430 cout <<
"group_generators_domain::projective_matrix_group_base_and_transversal_length done" << endl;
1436 int base_len,
int degree,
1437 long int *base,
int *transversal_length,
1440 int f_v = (verbose_level >= 1);
1441 int f_vv = (verbose_level >= 2);
1447 cout <<
"group_generators_domain::affine_matrix_group_base_and_transversal_length" << endl;
1451 transversal_length[c] = NT.
i_power_j(F->
q, n);
1453 for (i = 0; i < n; i++) {
1459 base[c] = F->
q + F->
p;
1460 transversal_length[c] = F->
e;
1463 if (c != base_len) {
1464 cout <<
"group_generators_domain::affine_matrix_group_base_and_transversal_length "
1465 "c != base_len" << endl;
1469 cout <<
"group_generators_domain::affine_matrix_group_base_and_transversal_length base: ";
1472 cout <<
"finite_field::affine_matrix_group_base_and_transversal_length "
1473 "transversal_length: ";
1478 cout <<
"group_generators_domain::affine_matrix_group_base_and_transversal_length done" << endl;
1485 int base_len,
int degree,
1486 long int *base,
int *transversal_length,
1489 int f_v = (verbose_level >= 1);
1490 int f_vv = (verbose_level >= 2);
1496 cout <<
"group_generators_domain::general_linear_matrix_group_base_and_transversal_length" << endl;
1499 for (i = 0; i < n; i++) {
1505 base[c] = F->
q + F->
p;
1506 transversal_length[c] = F->
e;
1509 if (c != base_len) {
1510 cout <<
"group_generators_domain::general_linear_matrix_group_base_and_"
1511 "transversal_length c != base_len" << endl;
1512 cout <<
"c=" << c << endl;
1513 cout <<
"base_len=" << base_len << endl;
1517 cout <<
"group_generators_domain::general_linear_matrix_group_base_and_"
1518 "transversal_length base: ";
1521 cout <<
"group_generators_domain::general_linear_matrix_group_base_and_"
1522 "transversal_length transversal_length: ";
1527 cout <<
"group_generators_domain::general_linear_matrix_group_base_and_transversal_length done" << endl;
1535 int *&data,
int &size,
int &nb_gens,
1538 int f_v = (verbose_level >= 1);
1539 int f_vv = (verbose_level >= 2);
1545 cout <<
"group_generators_domain::strong_generators_for_projective_linear_group" << endl;
1558 nb_gens += (n - 1) * F->
e;
1560 data =
NEW_int(size * nb_gens);
1576 for (h = 0; h < n - 1; h++) {
1578 cout <<
"generators for primitive elements "
1579 "on the diagonal:" << endl;
1592 for (h = 0; h < n - 1; h++) {
1594 cout <<
"generators for entries in the last row "
1595 "(e=" << F->
e <<
"):" << endl;
1597 for (u = 0; u < F->
e; u++) {
1609 for (h = n - 2; h >= 0; h--) {
1611 cout <<
"generators for swaps along the diagonal:" << endl;
1615 M[h * n + h + 1] = 1;
1616 M[(h + 1) * n + h] = 1;
1617 M[(h + 1) * n + h + 1] = 0;
1625 if (cur != nb_gens) {
1626 cout <<
"group_generators_domain::strong_generators_for_projective_linear_group "
1627 "cur != nb_gens" << endl;
1633 cout <<
"group_generators_domain::strong_generators_for_projective_linear_group "
1642 int *&data,
int &size,
int &nb_gens,
1645 int f_v = (verbose_level >= 1);
1646 int f_vv = (verbose_level >= 2);
1651 cout <<
"group_generators_domain::strong_generators_for_affine_linear_group" << endl;
1661 nb_gens += (n - 1) * F->
e;
1669 nb_gens += n * F->
e;
1671 data =
NEW_int(size * nb_gens);
1677 data[cur * size + n * n + n] = 1;
1682 for (h = 0; h < n - 1; h++) {
1684 cout <<
"generators for entries in the last row "
1685 "(e=" << F->
e <<
"):" << endl;
1687 for (u = 0; u < F->
e; u++) {
1691 data[cur * size + (n - 1) * n + h] = NT.
i_power_j(F->
p, u);
1693 data[cur * size + n * n + n] = 0;
1703 cout <<
"generators for primitive element "
1704 "on the last diagonal:" << endl;
1711 data[cur * size + n * n + n] = 0;
1718 for (h = n - 2; h >= 0; h--) {
1720 cout <<
"generators for swaps along the diagonal:" << endl;
1724 data[cur * size + h * n + h] = 0;
1725 data[cur * size + h * n + h + 1] = 1;
1726 data[cur * size + (h + 1) * n + h] = 1;
1727 data[cur * size + (h + 1) * n + h + 1] = 0;
1729 data[cur * size + n * n + n] = 0;
1735 for (h = 0; h < n; h++) {
1736 for (u = 0; u < F->
e; u++) {
1740 data[cur * size + n * n + h] = NT.
i_power_j(F->
p, u);
1742 data[cur * size + n * n + n] = 0;
1748 if (cur != nb_gens) {
1749 cout <<
"group_generators_domain::strong_generators_for_affine_linear_group "
1750 "cur != nb_gens" << endl;
1754 cout <<
"group_generators_domain::strong_generators_for_affine_linear_group done" << endl;
1761 int *&data,
int &size,
int &nb_gens,
1764 int f_v = (verbose_level >= 1);
1765 int f_vv = (verbose_level >= 2);
1770 cout <<
"group_generators_domain::strong_generators_for_general_linear_group" << endl;
1780 nb_gens += (n - 1) * F->
e;
1789 data =
NEW_int(size * nb_gens);
1795 data[cur * size + n * n] = 1;
1800 for (h = 0; h < n - 1; h++) {
1802 cout <<
"generators for entries in the last row "
1803 "(e=" << F->
e <<
"):" << endl;
1805 for (u = 0; u < F->
e; u++) {
1809 data[cur * size + (n - 1) * n + h] = NT.
i_power_j(F->
p, u);
1811 data[cur * size + n * n] = 0;
1821 cout <<
"generators for primitive element "
1822 "on the last diagonal:" << endl;
1829 data[cur * size + n * n] = 0;
1836 for (h = n - 2; h >= 0; h--) {
1838 cout <<
"generators for swaps along the diagonal:" << endl;
1842 data[cur * size + h * n + h] = 0;
1843 data[cur * size + h * n + h + 1] = 1;
1844 data[cur * size + (h + 1) * n + h] = 1;
1845 data[cur * size + (h + 1) * n + h + 1] = 0;
1847 data[cur * size + n * n] = 0;
1853 if (cur != nb_gens) {
1854 cout <<
"group_generators_domain::strong_generators_for_general_linear_group "
1855 "cur != nb_gens" << endl;
1859 cout <<
"group_generators_domain::strong_generators_for_general_linear_group done" << endl;
1865 int f_semilinear,
int k,
1866 int *&data,
int &size,
int &nb_gens,
1869 int f_v = (verbose_level >= 1);
1870 int f_vv = (verbose_level >= 2);
1876 cout <<
"group_generators_domain::generators_for_parabolic_subgroup" << endl;
1898 for (h = 0; h < k - 1; h++) {
1899 for (u = 0; u < F->
e; u++) {
1904 for (h = k; h < n - 1; h++) {
1905 for (u = 0; u < F->
e; u++) {
1911 nb_gens += k * (n - k) * F->
e;
1914 for (h = n - 2; h >= k; h--) {
1917 for (h = k - 2; h >= 0; h--) {
1921 if (k > 1 && k < n - 1) {
1930 data =
NEW_int(size * nb_gens);
1946 cout <<
"generators for primitive elements "
1947 "on the diagonal, cur=" << cur << endl;
1950 for (h = 0; h < n - 1; h++) {
1963 cout <<
"generators for the entries in the last row "
1964 "of a diagonal block, cur=" << cur << endl;
1966 for (h = 0; h < k - 1; h++) {
1967 for (u = 0; u < F->
e; u++) {
1979 for (h = k; h < n - 1; h++) {
1980 for (u = 0; u < F->
e; u++) {
1993 cout <<
"generators for the entries in the lower left block, "
1994 "cur=" << cur << endl;
1996 for (g = k; g < n; g++) {
1997 for (h = 0; h < k; h++) {
1998 for (u = 0; u < F->
e; u++) {
2012 cout <<
"generators for swaps along the diagonal, "
2013 "cur=" << cur << endl;
2015 for (h = n - 2; h >= k; h--) {
2018 M[h * n + h + 1] = 1;
2019 M[(h + 1) * n + h] = 1;
2020 M[(h + 1) * n + h + 1] = 0;
2027 for (h = k - 2; h >= 0; h--) {
2030 M[h * n + h + 1] = 1;
2031 M[(h + 1) * n + h] = 1;
2032 M[(h + 1) * n + h + 1] = 0;
2040 if (cur != nb_gens) {
2041 cout <<
"group_generators_domain::generators_for_parabolic_subgroup "
2042 "cur != nb_gens" << endl;
2043 cout <<
"cur = " << cur << endl;
2044 cout <<
"nb_gens = " << nb_gens << endl;
2050 cout <<
"group_generators_domain::generators_for_parabolic_subgroup done" << endl;
2056 int *&data,
int &size,
int &nb_gens,
2059 int f_v = (verbose_level >= 1);
2060 int f_vv = (verbose_level >= 2);
2067 cout <<
"group_generators_domain::generators_for_stabilizer_of_three_collinear_"
2068 "points_in_PGL4" << endl;
2086 nb_gens += 4 * F->
e;
2091 data =
NEW_int(size * nb_gens);
2106 cout <<
"generators for Sym_3 in top left block, "
2107 "cur=" << cur << endl;
2122 M[1 * 4 + 0] = F->
negate(1);
2123 M[1 * 4 + 1] = F->
negate(1);
2150 for (i = 2; i < 4; i++) {
2151 for (j = 0; j < 2; j++) {
2152 for (u = 0; u < F->
e; u++) {
2177 for (u = 0; u < F->
e; u++) {
2190 if (cur != nb_gens) {
2191 cout <<
"group_generators_domain::generators_for_stabilizer_of_three_"
2192 "collinear_points_in_PGL4 cur != nb_gens" << endl;
2193 cout <<
"cur = " << cur << endl;
2194 cout <<
"nb_gens = " << nb_gens << endl;
2200 cout <<
"group_generators_domain::generators_for_stabilizer_of_three_"
2201 "collinear_points_in_PGL4 done" << endl;
2208 int *&data,
int &size,
int &nb_gens,
2211 int f_v = (verbose_level >= 1);
2212 int f_vv = (verbose_level >= 2);
2219 cout <<
"group_generators_domain::generators_for_stabilizer_of_triangle_in_PGL4" << endl;
2236 nb_gens += 3 * F->
e;
2238 data =
NEW_int(size * nb_gens);
2253 cout <<
"generators for Sym_3 in top left block, "
2254 "cur=" << cur << endl;
2312 for (j = 0; j < 3; j++) {
2313 for (u = 0; u < F->
e; u++) {
2325 if (cur != nb_gens) {
2326 cout <<
"group_generators_domain::generators_for_stabilizer_of_triangle_in_PGL4 "
2327 "cur != nb_gens" << endl;
2328 cout <<
"cur = " << cur << endl;
2329 cout <<
"nb_gens = " << nb_gens << endl;
2335 cout <<
"group_generators_domain::generators_for_stabilizer_of_triangle_in_PGL4 done" << endl;
2343 int f_v = (verbose_level >= 1);
2344 int f_vv = (verbose_level >= 2);
2346 int transversal_length;
2351 cout <<
"group_generators_domain::builtin_transversal_rep_GLnq "
2352 "GL(" << n <<
"," << F->
q <<
") i = " << i
2353 <<
" j = " << j << endl;
2357 for (ii = 0; ii < n * n; ii++) {
2360 for (ii = 0; ii < i; ii++) {
2367 if ((i == n + 1 && F->
q > 2) || (i == n && F->
q == 2)) {
2368 if (!f_semilinear) {
2369 cout <<
"group_generators_domain::builtin_transversal_rep_GLnq "
2370 "must be semilinear to access transversal " << n << endl;
2375 else if (i == n && F->
q > 2) {
2377 if (j >= transversal_length) {
2378 cout <<
"group_generators_domain::builtin_transversal_rep_GLnq "
2379 "j = " << j <<
" >= transversal_length = "
2380 << transversal_length << endl;
2386 for (jj = 0; jj < n - 1; jj++) {
2387 A[(jj + 1) * n + (jj + 1)] = v[jj] + 1;
2397 A + i, n, n, i - 1, j);
2400 for (ii = 0; ii < n; ii++) {
2402 if (ii >= i && i0 == -1 && a != 0) {
2407 cout <<
"i0 = " << i0 << endl;
2409 for (jj = i; jj < i0; jj++) {
2410 A[jj * n + jj + 1] = 1;
2412 for (jj = i0 + 1; jj < n; jj++) {
2420 cout <<
"group_generators_domain::transversal_rep_GLnq[" << i <<
"][" << j <<
"] = \n";
2426 int coordinate_idx,
int field_base_idx,
int *perm,
int verbose_level)
2433 int f_v = (verbose_level >= 1);
2434 long int i, j, l, a;
2440 cout <<
"group_generators_domain::affine_translation "
2441 "coordinate_idx=" << coordinate_idx
2442 <<
" field_base_idx=" << field_base_idx << endl;
2447 for (i = 0; i < l; i++) {
2449 v[coordinate_idx] = F->
add(v[coordinate_idx], a);
2457 int multiplication_order,
int *perm,
int verbose_level)
2462 int f_v = (verbose_level >= 1);
2463 long int i, j, l, k;
2469 cout <<
"group_generators_domain::affine_multiplication" << endl;
2472 alpha_power = (F->
q - 1) / multiplication_order;
2473 if (alpha_power * multiplication_order != F->
q - 1) {
2474 cout <<
"group_generators_domain::affine_multiplication: "
2475 "multiplication_order does not divide F->q - 1" << endl;
2480 for (i = 0; i < l; i++) {
2482 for (k = 0; k < n; k++) {
2483 v[k] = F->
mult(v[k], a);
2492 int k,
int *perm,
int verbose_level)
2498 int f_v = (verbose_level >= 1);
2499 long int i, j, l, u;
2504 cout <<
"group_generators_domain::affine_frobenius" << endl;
2508 for (i = 0; i < l; i++) {
2510 for (u = 0; u < n; u++) {
2536 for (i = 0; i < n; i++) {
2537 for (j = 0; j < F->
e; j++, k++) {
2545 int f_semilinear,
int frobenius_power,
2546 int f_multiplication,
int multiplication_order,
2547 int &nb_gens,
int °ree,
int *&gens,
2548 int &base_len,
long int *&the_base,
int verbose_level)
2550 int f_v = (verbose_level >= 1);
2555 cout <<
"group_generators_domain::affine_generators" << endl;
2560 if (f_translations) {
2564 if (f_multiplication) {
2573 gens =
NEW_int(nb_gens * degree);
2577 if (f_translations) {
2582 if (f_multiplication) {
2584 gens + k * degree, 0 );
2591 the_base[h++] = F->
p;
2594 cout <<
"group_generators_domain::affine_generators done" << endl;
2600 long int *orbit,
long int *orbit_inv,
2603 int f_v = (verbose_level >= 1);
2608 long int i, j1 = 0, j2 = ll, f_in, j;
2611 cout <<
"group_generators_domain::PG_element_modified_not_in_subspace_perm" << endl;
2613 for (i = 0; i < l; i++) {
2618 for (j = 0; j < n + 1; j++) {
2619 cout << v[j] <<
" ";
2624 cout <<
" is in the subspace" << endl;
2632 cout <<
" is not in the subspace" << endl;
2640 cout <<
"j1 != ll" << endl;
2644 cout <<
"j2 != l" << endl;
2649 cout <<
"group_generators_domain::PG_element_modified_not_in_subspace_perm done" << endl;
void all_affine_translations(int n, field_theory::finite_field *F, int *gens)
void general_linear_matrix_group_base_and_transversal_length(int n, field_theory::finite_field *F, int f_semilinear, int base_len, int degree, long int *base, int *transversal_length, int verbose_level)
int matrix_group_base_len_projective_group(int n, int q, int f_semilinear, int verbose_level)
void generators_for_stabilizer_of_triangle_in_PGL4(int f_semilinear, field_theory::finite_field *F, int *&data, int &size, int &nb_gens, int verbose_level)
void generators_concatenate(int deg1, int nb_perms1, int *perms1, int deg2, int nb_perms2, int *perms2, int °3, int &nb_perms3, int *&perms3, int verbose_level)
void order_Pomega_plus(int m, int q, ring_theory::longinteger_object &o, int verbose_level)
void generators_dihedral_involution(int deg, int &nb_perms, int *&perms, int verbose_level)
void order_Pomega_parabolic(int m, int q, ring_theory::longinteger_object &o, int verbose_level)
void generators_symmetric_group(int deg, int &nb_perms, int *&perms, int verbose_level)
int all_affine_translations_nb_gens(int n, field_theory::finite_field *F)
int matrix_group_base_len_general_linear_group(int n, int q, int f_semilinear, int verbose_level)
void builtin_transversal_rep_GLnq(int *A, int n, field_theory::finite_field *F, int f_semilinear, int i, int j, int verbose_level)
void generators_dihedral_group(int deg, int &nb_perms, int *&perms, int verbose_level)
void generators_Hall_reflection(int nb_pairs, int &nb_perms, int *&perms, int °ree, int verbose_level)
void order_PO_plus(int m, int q, ring_theory::longinteger_object &o, int verbose_level)
void generators_Bn_group(int n, int °, int &nb_perms, int *&perms, int verbose_level)
void order_Hall_reflection_normalizer_factorized(int nb_pairs, int *&factors, int &nb_factors)
group_generators_domain()
void order_Pomega(int epsilon, int k, int q, ring_theory::longinteger_object &go, int verbose_level)
void frobenius_orbit_perm(int n, field_theory::finite_field *F, long int *orbit, long int *orbit_inv, int verbose_level)
void order_Bn_group_factorized(int n, int *&factors, int &nb_factors)
void affine_translation(int n, field_theory::finite_field *F, int coordinate_idx, int field_base_idx, int *perm, int verbose_level)
void generators_direct_product(int deg1, int nb_perms1, int *perms1, int deg2, int nb_perms2, int *perms2, int °3, int &nb_perms3, int *&perms3, int verbose_levels)
int matrix_group_base_len_affine_group(int n, int q, int f_semilinear, int verbose_level)
void generators_identity_group(int deg, int &nb_perms, int *&perms, int verbose_level)
void strong_generators_for_affine_linear_group(int n, field_theory::finite_field *F, int f_semilinear, int *&data, int &size, int &nb_gens, int verbose_level)
void projective_matrix_group_base_and_orbits(int n, field_theory::finite_field *F, int f_semilinear, int base_len, int degree, long int *base, int *transversal_length, long int **orbit, long int **orbit_inv, int verbose_level)
void generators_cyclic_group(int deg, int &nb_perms, int *&perms, int verbose_level)
void order_PO_epsilon(int f_semilinear, int epsilon, int k, int q, ring_theory::longinteger_object &go, int verbose_level)
void generators_for_parabolic_subgroup(int n, field_theory::finite_field *F, int f_semilinear, int k, int *&data, int &size, int &nb_gens, int verbose_level)
void affine_multiplication(int n, field_theory::finite_field *F, int multiplication_order, int *perm, int verbose_level)
void order_PO_minus(int m, int q, ring_theory::longinteger_object &o, int verbose_level)
void projective_matrix_group_base_and_transversal_length(int n, field_theory::finite_field *F, int f_semilinear, int base_len, int degree, long int *base, int *transversal_length, int verbose_level)
void diagonal_orbit_perm(int n, field_theory::finite_field *F, long int *orbit, long int *orbit_inv, int verbose_level)
void affine_frobenius(int n, field_theory::finite_field *F, int k, int *perm, int verbose_level)
void affine_matrix_group_base_and_transversal_length(int n, field_theory::finite_field *F, int f_semilinear, int base_len, int degree, long int *base, int *transversal_length, int verbose_level)
void generators_for_stabilizer_of_three_collinear_points_in_PGL4(int f_semilinear, field_theory::finite_field *F, int *&data, int &size, int &nb_gens, int verbose_level)
void affine_generators(int n, field_theory::finite_field *F, int f_translations, int f_semilinear, int frobenius_power, int f_multiplication, int multiplication_order, int &nb_gens, int °ree, int *&gens, int &base_len, long int *&the_base, int verbose_level)
void order_POmega_epsilon(int epsilon, int m, int q, ring_theory::longinteger_object &o, int verbose_level)
int index_POmega_in_PO(int epsilon, int m, int q, int verbose_level)
void order_Pomega_minus(int m, int q, ring_theory::longinteger_object &o, int verbose_level)
void generators_Hall_reflection_normalizer_group(int nb_pairs, int &nb_perms, int *&perms, int °ree, int verbose_level)
void strong_generators_for_projective_linear_group(int n, field_theory::finite_field *F, int f_semilinear, int *&data, int &size, int &nb_gens, int verbose_level)
void order_PO(int epsilon, int m, int q, ring_theory::longinteger_object &o, int verbose_level)
~group_generators_domain()
void PG_element_modified_not_in_subspace_perm(field_theory::finite_field *F, int n, int m, long int *orbit, long int *orbit_inv, int verbose_level)
void order_PO_parabolic(int m, int q, ring_theory::longinteger_object &o, int verbose_level)
void strong_generators_for_general_linear_group(int n, field_theory::finite_field *F, int f_semilinear, int *&data, int &size, int &nb_gens, int verbose_level)
a collection of combinatorial functions
void perm_direct_product(long int n1, long int n2, int *perm1, int *perm2, int *perm3)
void perm_move(int *from, int *to, long int n)
void perm_print(std::ostream &ost, int *a, int n)
void perm_identity(int *a, long int n)
void PG_element_unrank_modified(int *v, int stride, int len, int a)
int frobenius_power(int a, int frob_power)
void PG_element_unrank_modified_lint(int *v, int stride, int len, long int a)
void PG_element_unrank_modified_not_in_subspace(int *v, int stride, int len, int m, long int a)
linear_algebra::linear_algebra * Linear_algebra
void PG_element_rank_modified_lint(int *v, int stride, int len, long int &a)
void PG_element_apply_frobenius(int n, int *v, int f)
various functions related to geometries
void AG_element_unrank(int q, int *v, int stride, int len, long int a)
int Witt_index(int epsilon, int k)
long int nb_PG_elements(int n, int q)
int dimension_given_Witt_index(int epsilon, int n)
long int nb_AG_elements(int n, int q)
int PG_element_modified_is_in_subspace(int n, int m, int *v)
long int nb_PG_elements_not_in_subspace(int n, int m, int q)
long int AG_element_rank(int q, int *v, int stride, int len)
void identity_matrix(int *A, int n)
void transpose_matrix_in_place(int *A, int m)
basic number theoretic functions
int i_power_j(int i, int j)
long int i_power_j_lint(long int i, long int j)
void factor_prime_power(int q, int &p, int &e)
domain to compute with objects of type longinteger
void add(longinteger_object &a, longinteger_object &b, longinteger_object &c)
void integral_division_by_int(longinteger_object &a, int b, longinteger_object &q, int &r)
void mult(longinteger_object &a, longinteger_object &b, longinteger_object &c)
void power_int(longinteger_object &a, int n)
void mult_integer_in_place(longinteger_object &a, int b)
a class to represent arbitrary precision integers
void assign_to(longinteger_object &b)
void create(long int i, const char *file, int line)
#define Int_vec_print_integer_matrix(A, B, C, D)
#define Int_vec_zero(A, B)
#define Lint_vec_print(A, B, C)
#define Int_vec_copy(A, B, C)
#define Int_vec_print(A, B, C)
the orbiter library for the classification of combinatorial objects