Orbiter 2022
Combinatorial Objects
strong_generators_groups.cpp
Go to the documentation of this file.
1// strong_generators_groups.cpp
2//
3// Anton Betten
4
5// started: December 4, 2013
6// moved here: Dec 21, 2015
7
8
10#include "group_actions.h"
11
12
13using namespace std;
14
15
16
17namespace orbiter {
18namespace layer3_group_actions {
19namespace groups {
20
21
27 int verbose_level)
28{
29 int f_v = (verbose_level >= 1);
30 int f_vv = (verbose_level >= 2);
31
32 if (f_v) {
33 cout << "strong_generators::init_linear_group_from_scratch" << endl;
34 }
35
36
39
40 int f_basis = TRUE;
41 int f_init_sims = FALSE;
42
43 if (Descr->f_projective) {
44 if (f_v) {
45 cout << "strong_generators::init_linear_group_from_scratch "
46 "before A->init_projective_group" << endl;
47 }
49 f_basis, f_init_sims,
50 nice_gens,
51 verbose_level - 1);
52 if (f_v) {
53 cout << "strong_generators::init_linear_group_from_scratch "
54 "after A->init_projective_group" << endl;
55 }
56 }
57 else if (Descr->f_general) {
58 if (f_v) {
59 cout << "strong_generators::init_linear_group_from_scratch "
60 "before A->init_general_linear_group" << endl;
61 }
63 f_basis, f_init_sims,
64 nice_gens,
65 verbose_level - 1);
66 if (f_v) {
67 cout << "strong_generators::init_linear_group_from_scratch "
68 "after A->init_general_linear_group" << endl;
69 }
70 }
71 else if (Descr->f_affine) {
72 if (f_v) {
73 cout << "strong_generators::init_linear_group_from_scratch "
74 "before A->init_affine_group" << endl;
75 }
76 A->init_affine_group(n, F, Descr->f_semilinear,
77 f_basis, f_init_sims,
78 nice_gens,
79 verbose_level - 1);
80 if (f_v) {
81 cout << "strong_generators::init_linear_group_from_scratch "
82 "after A->init_affine_group" << endl;
83 }
84 }
85 else if (Descr->f_GL_d_q_wr_Sym_n) {
86 if (f_v) {
87 cout << "strong_generators::init_linear_group_from_scratch "
88 "before init_wreath_product_group" << endl;
89 }
91 Descr->GL_wreath_Sym_n /* nb_factors */,
92 Descr->GL_wreath_Sym_d /* n */, F, nice_gens,
93 verbose_level);
94 if (f_v) {
95 cout << "strong_generators::init_linear_group_from_scratch "
96 "after init_wreath_product_group" << endl;
97 }
98 }
99 else if (Descr->f_orthogonal || Descr->f_orthogonal_p || Descr->f_orthogonal_m) {
100 if (f_v) {
101 cout << "strong_generators::init_linear_group_from_scratch "
102 "detected orthogonal group" << endl;
103 }
104 int epsilon;
105 if (Descr->f_orthogonal) {
106 epsilon = 0;
107 }
108 else if (Descr->f_orthogonal_p) {
109 epsilon = 1;
110 }
111 else if (Descr->f_orthogonal_m) {
112 epsilon = -1;
113 }
114 else {
115 cout << "cannot reach this" << endl;
116 exit(1);
117 }
118 A->init_orthogonal_group(epsilon,
119 n, F,
120 TRUE /* f_on_points */, FALSE /* f_on_lines */,
121 FALSE /* f_on_points_and_lines */,
122 Descr->f_semilinear,
123 TRUE /* f_basis */, verbose_level);
124
125
126 }
127 else {
128 cout << "strong_generators::init_linear_group_from_scratch "
129 "the type of group is not specified" << endl;
130 exit(1);
131 }
132
133
135 cout << "strong_generators::init_linear_group_from_scratch "
136 "fatal: !A->f_has_strong_generators" << endl;
137 }
138
139 if (Descr->f_special) {
140
141
142 if (f_v) {
143 cout << "strong_generators::init_linear_group_from_scratch "
144 "special linear group" << endl;
145 }
146
147 special_subgroup(verbose_level);
148
149 if (f_v) {
150 cout << "strong_generators::init_linear_group_from_scratch "
151 "special linear group done" << endl;
152 }
153 }
154 else {
155
156 if (f_init_sims) {
157 if (f_v) {
158 cout << "strong_generators::init_linear_group_from_scratch "
159 "creating sims and collecting generators" << endl;
160 }
161 sims *S;
162 S = A->Strong_gens->create_sims(0 /* verbose_level */);
163 init_from_sims(S, verbose_level);
164 FREE_OBJECT(S);
165 }
166 else {
167 if (f_v) {
168 cout << "strong_generators::init_linear_group_from_scratch "
169 "before init_copy" << endl;
170 }
171 init_copy(A->Strong_gens, verbose_level);
172 if (f_v) {
173 cout << "strong_generators::init_linear_group_from_scratch "
174 "before init_copy" << endl;
175 }
176 }
177 }
178 if (f_v) {
179 cout << "strong_generators::init_linear_group_from_scratch "
180 "strong generators have been created" << endl;
181 }
182
183 if (f_vv) {
184 print_generators(cout);
186 }
187
188
189 if (f_v) {
190 cout << "strong_generators::init_linear_group_from_scratch "
191 "done" << endl;
192 }
193}
194
196{
197 int f_v = (verbose_level >= 1);
198
199 actions::action A_on_det;
201
202 if (f_v) {
203 cout << "strong_generators::special_subgroup "
204 "setting up action on determinant" << endl;
205 }
206 if (A->Sims == NULL) {
207 if (f_v) {
208 cout << "strong_generators::special_subgroup "
209 "before A->init_sims_from_generators" << endl;
210 }
211 A->init_sims_from_generators(verbose_level);
212 if (f_v) {
213 cout << "strong_generators::special_subgroup "
214 "after A->init_sims_from_generators" << endl;
215 }
216 }
217 A_on_det.induced_action_on_determinant(A->Sims, verbose_level);
218 if (f_v) {
219 cout << "strong_generators::special_subgroup "
220 "induced_action_on_determinant finished" << endl;
221 }
222 A_on_det.Kernel->group_order(go);
223 if (f_v) {
224 cout << "strong_generators::special_subgroup "
225 "kernel has order " << go << endl;
226 }
227
228
229 init_from_sims(A_on_det.Kernel, verbose_level);
230
231 if (f_v) {
232 cout << "strong_generators::special_subgroup "
233 "special linear group done" << endl;
234 }
235}
236
238{
239 int f_v = (verbose_level >= 1);
240
241 actions::action A_on_Galois;
243
244 if (f_v) {
245 cout << "strong_generators::projectivity_subgroup "
246 "setting up action on Galois group" << endl;
247 }
248 A_on_Galois.induced_action_on_Galois_group(S, verbose_level - 2);
249 if (f_v) {
250 cout << "strong_generators::projectivity_subgroup "
251 "induced_action_on_Galois_group finished" << endl;
252 }
253 A_on_Galois.Kernel->group_order(go);
254 if (f_v) {
255 cout << "strong_generators::projectivity_subgroup "
256 "kernel has order " << go << endl;
257 }
258
259
260 if (f_v) {
261 cout << "strong_generators::projectivity_subgroup "
262 "before init_from_sims" << endl;
263 }
264 init_from_sims(A_on_Galois.Kernel, verbose_level - 2);
265 if (f_v) {
266 cout << "strong_generators::projectivity_subgroup "
267 "after init_from_sims" << endl;
268 }
269
270 if (f_v) {
271 cout << "strong_generators::projectivity_subgroup "
272 "projectivity subgroup done" << endl;
273 }
274}
275
276void strong_generators::even_subgroup(int verbose_level)
277{
278 int f_v = (verbose_level >= 1);
279
280 actions::action A_on_sign;
282
283 if (f_v) {
284 cout << "strong_generators::even_subgroup "
285 "setting up action on sign" << endl;
286 }
287 A_on_sign.induced_action_on_sign(A->Sims, verbose_level);
288 if (f_v) {
289 cout << "strong_generators::even_subgroup "
290 "induced_action_on_sign finished" << endl;
291 }
292 A_on_sign.Kernel->group_order(go);
293 if (f_v) {
294 cout << "strong_generators::even_subgroup "
295 "kernel has order " << go << endl;
296 }
297
298
299 init_from_sims(A_on_sign.Kernel, verbose_level);
300
301 if (f_v) {
302 cout << "strong_generators::even_subgroup "
303 "special linear group done" << endl;
304 }
305}
306
307void strong_generators::Sylow_subgroup(sims *S, int p, int verbose_level)
308{
309 int f_v = (verbose_level >= 1);
310 sims *P;
312
313 if (f_v) {
314 cout << "strong_generators::Sylow_subgroup " << endl;
315 }
316
317 P = NEW_OBJECT(sims);
318 S->sylow_subgroup(p, P, verbose_level);
319 init_from_sims(P, verbose_level);
320 FREE_OBJECT(P);
321
322 if (f_v) {
323 cout << "strong_generators::Sylow_subgroup done" << endl;
324 }
325}
326
328 int *Elt, int verbose_level)
329{
330 int f_v = (verbose_level >= 1);
331 sims *S;
332
333 if (f_v) {
334 cout << "strong_generators::init_single" << endl;
335 }
337 Elt, verbose_level);
338 init_from_sims(S, verbose_level);
339 FREE_OBJECT(S);
340
341 if (f_v) {
342 cout << "strong_generators::init_single "
343 "done" << endl;
344 }
345}
346
348 int *Elt, int target_go, int verbose_level)
349{
350 int f_v = (verbose_level >= 1);
351 sims *S;
352
353 if (f_v) {
354 cout << "strong_generators::init_single_with_target_go" << endl;
355 }
357 Elt, verbose_level);
358 init_from_sims(S, verbose_level);
359 FREE_OBJECT(S);
360
361 if (f_v) {
362 cout << "strong_generators::init_single_with_target_go "
363 "done" << endl;
364 }
365}
366
368 int verbose_level)
369{
370 int f_v = (verbose_level >= 1);
371 //int f_vv = (verbose_level >= 2);
372 int i;
373
374 if (f_v) {
375 cout << "strong_generators::init_trivial_group" << endl;
376 }
378 tl = NEW_int(A->base_len());
379 for (i = 0; i < A->base_len(); i++) {
380 tl[i] = 1;
381 }
383 gens->init(A, verbose_level - 2);
384 gens->allocate(0, verbose_level - 2);
385 //S->extract_strong_generators_in_order(*gens,
386 // tl, 0 /*verbose_level*/);
387 if (f_v) {
388 cout << "strong_generators::init_trivial_group done" << endl;
389 }
390}
391
394 matrix_group *Mtx, int verbose_level)
395{
396 int f_v = (verbose_level >= 1);
397 int f_vv = (verbose_level >= 2);
398 int *Elt1;
399 sims *S;
403 int *go_factored;
404 int n, q, pos_frobenius;
406 int *data;
407 int i, h, hh, h1, j, a, b, nb_gens;
409
410 if (f_v) {
411 cout << "strong_generators::generators_for_the_monomial_group "
412 "initializing monomial group" << endl;
413 }
415 F = Mtx->GFq;
416 q = F->q;
417 n = Mtx->n;
418 if (f_v) {
419 cout << "n=" << n << " q=" << q << endl;
420 }
421 Elt1 = NEW_int(A->elt_size_in_int);
422 go_factored = NEW_int(3 * n + 1);
423 data = NEW_int(n * n + n + 1);
424
425 pos_frobenius = 0;
426 if (Mtx->f_projective) {
427 if (f_v) {
428 cout << "strong_generators::generators_for_the_monomial_group "
429 "type is projective" << endl;
430 }
431 pos_frobenius = n * n;
432 }
433
434 if (Mtx->f_affine) {
435 if (f_v) {
436 cout << "strong_generators::generators_for_the_monomial_group "
437 "type is affine" << endl;
438 }
439 pos_frobenius = n * n + n;
440 //exit(1);
441 }
442
443 if (Mtx->f_general_linear) {
444 if (f_v) {
445 cout << "strong_generators::generators_for_the_monomial_group "
446 "type is general_linear" << endl;
447 }
448 pos_frobenius = n * n;
449 }
450
451
452 // group order
453 // = n! * (q - 1)^(n-1) * e if projective
454 // = n! * (q - 1)^n * e if general linear
455 // = n! * (q - 1)^n * q^n * e if affine
456 // where e is the degree of the field if f_semilinear is TRUE
457 // and e = 1 otherwise
458
459 for (i = 0; i < n; i++) {
460 go_factored[i] = n - i;
461 }
462 for (i = 0; i < n; i++) {
463 if (i == n - 1) {
464 go_factored[n + i] = 1; // because it is projective
465 }
466 else {
467 go_factored[n + i] = q - 1;
468 }
469 }
470 for (i = 0; i < n; i++) {
471 if (Mtx->f_affine) {
472 go_factored[2 * n + i] = q;
473 }
474 else {
475 go_factored[2 * n + i] = 1;
476 }
477 }
478 if (Mtx->f_semilinear) {
479 go_factored[3 * n] = F->e;
480 }
481 else {
482 go_factored[3 * n] = 1;
483 }
484 D.multiply_up(target_go, go_factored, 3 * n + 1, 0 /* verbose_level */);
485 if (f_v) {
486 cout << "group order factored: ";
487 Int_vec_print(cout, go_factored, 3 * n + 1);
488 cout << endl;
489 cout << "target_go=" << target_go << endl;
490 }
492 my_gens->init(A, verbose_level - 2);
493 nb_gens = n - 1 + 1 + 1;
494 if (Mtx->f_affine) {
495 nb_gens += n * F->e;
496 }
497 my_gens->allocate(nb_gens, verbose_level - 2);
498 for (h = 0; h < nb_gens; h++) {
499
500 if (f_v) {
501 cout << "strong_generators::generators_for_the_monomial_group "
502 "generator " << h << " / " << nb_gens << ":" << endl;
503 }
504 F->Linear_algebra->identity_matrix(data, n);
505 if (Mtx->f_affine) {
506 Int_vec_zero(data + n * n, n);
507 }
508
509 if (h < n - 1) {
510 // swap basis vector h and h + 1:
511 hh = h + 1;
512 data[h * n + h] = 0;
513 data[hh * n + hh] = 0;
514 data[h * n + hh] = 1;
515 data[hh * n + h] = 1;
516 }
517 else if (h == n - 1) {
518 data[0] = F->alpha_power(1);
519 }
520 else if (h == n) {
521 if (Mtx->f_semilinear) {
522 data[pos_frobenius] = 1;
523 }
524 }
525 else if (Mtx->f_affine) {
526 h1 = h - n - 1;
527 a = h1 / F->e;
528 b = h1 % F->e;
529 for (j = 0; j < n; j++) {
530 data[n * n + j] = 0;
531 }
532 data[n * n + a] = NT.i_power_j(F->p, b);
533 // elements of a field basis of F_q over F_p
534 }
535 if (f_v) {
536 cout << "strong_generators::generators_for_the_monomial_group "
537 "generator " << h << " / "
538 << nb_gens << ", before A->make_element" << endl;
539 cout << "data = ";
540 Int_vec_print(cout, data, Mtx->elt_size_int_half);
541 cout << endl;
542 cout << "in action " << A->label << endl;
543 }
544 A->make_element(Elt1, data, verbose_level - 1);
545 if (f_vv) {
546 cout << "generator " << h << ":" << endl;
547 A->element_print_quick(Elt1, cout);
548 }
549 my_gens->copy_in(h, Elt1);
550 }
551 if (f_v) {
552 cout << "strong_generators::generators_for_the_monomial_group "
553 "creating group" << endl;
554 }
556 my_gens, TRUE /* f_target_go */,
557 target_go, 0 /*verbose_level - 1*/);
558 if (f_v) {
559 cout << "strong_generators::generators_for_the_monomial_group "
560 "after creating group" << endl;
561 }
562 init_from_sims(S, 0);
563 if (f_v) {
564 cout << "strong_generators::generators_for_the_monomial_group "
565 "after extracting strong generators" << endl;
566 }
567 if (f_vv) {
568 int f_print_as_permutation = FALSE;
569 int f_offset = FALSE;
570 int offset = 0;
571 int f_do_it_anyway_even_for_big_degree = FALSE;
572 int f_print_cycles_of_length_one = FALSE;
573
575
576 cout << "computing the group order:" << endl;
577 group_order(go);
578 cout << "The group order is " << go << endl;
579
580 cout << "strong generators are:" << endl;
581 gens->print(cout, f_print_as_permutation,
582 f_offset, offset, f_do_it_anyway_even_for_big_degree,
583 f_print_cycles_of_length_one);
584 }
585 FREE_OBJECT(S);
586 FREE_OBJECT(my_gens);
587 FREE_int(data);
588 FREE_int(go_factored);
589 FREE_int(Elt1);
590 if (f_v) {
591 cout << "strong_generators::generators_for_the_monomial_group done" << endl;
592 }
593}
594
596 matrix_group *Mtx, int verbose_level)
597{
598 int f_v = (verbose_level >= 1);
599 int f_vv = (verbose_level >= 2);
600 int *Elt1;
601 sims *S;
605 int *go_factored;
606 int n, q;
608 int *data;
609 int i, h;
610
611 if (f_v) {
612 cout << "strong_generators::generators_for_the_diagonal_group "
613 "initializing diagonal group" << endl;
614 }
616 F = Mtx->GFq;
617 q = F->q;
618 n = Mtx->n;
619 if (f_v) {
620 cout << "n=" << n << " q=" << q << endl;
621 }
622 Elt1 = NEW_int(A->elt_size_in_int);
623 go_factored = NEW_int(n + 1);
624 data = NEW_int(n * n + 1);
625
626 // group order
627 // = q^n * e if not projective
628 // = q^(n-1) * e if projective
629 // where e is the degree of the field if f_semilinear is TRUE
630 // and e = 1 otherwise
631
632 for (i = 0; i < n; i++) {
633 if (i == n - 1) {
634 go_factored[i] = 1; // because it is projective
635 }
636 else {
637 go_factored[i] = q - 1;
638 }
639 }
640
641 if (Mtx->f_projective) {
642 cout << "strong_generators::generators_for_the_diagonal_group "
643 "type is projective" << endl;
644 }
645
646 if (Mtx->f_affine) {
647 cout << "strong_generators::generators_for_the_diagonal_group "
648 "type should not be affine" << endl;
649 exit(1);
650 }
651
652 if (Mtx->f_general_linear) {
653 cout << "strong_generators::generators_for_the_diagonal_group "
654 "type is general_linear" << endl;
655 }
656
657 if (Mtx->f_semilinear) {
658 go_factored[n] = F->e;
659 }
660 else {
661 go_factored[n] = 1;
662 }
663 D.multiply_up(target_go, go_factored, n + 1, 0 /* verbose_level */);
664 if (f_v) {
665 cout << "group order factored: ";
666 Int_vec_print(cout, go_factored, n + 1);
667 cout << endl;
668 cout << "target_go=" << target_go << endl;
669 }
671 my_gens->init(A, verbose_level - 2);
672 my_gens->allocate(n + 1, verbose_level - 2);
673 for (h = 0; h < n + 1; h++) {
674
675 F->Linear_algebra->identity_matrix(data, n);
676
677 if (h < n) {
678 data[h * n + h] = F->alpha_power(1);
679 }
680 else if (h == n) {
681 if (Mtx->f_semilinear) {
682 data[n * n] = 1;
683 }
684 }
685 A->make_element(Elt1, data, 0 /*verbose_level - 1*/);
686 if (f_vv) {
687 cout << "generator " << h << ":" << endl;
688 A->element_print_quick(Elt1, cout);
689 }
690 my_gens->copy_in(h, Elt1);
691 }
692 if (f_v) {
693 cout << "strong_generators::generators_for_the_diagonal_group "
694 "creating group" << endl;
695 }
697 my_gens, TRUE /* f_target_go */,
698 target_go, 0 /*verbose_level - 1*/);
699 if (f_v) {
700 cout << "strong_generators::generators_for_the_diagonal_group "
701 "after creating group" << endl;
702 }
703 init_from_sims(S, 0);
704 if (f_v) {
705 cout << "strong_generators::generators_for_the_diagonal_group "
706 "after extracting strong generators" << endl;
707 }
708 if (f_vv) {
709 int f_print_as_permutation = FALSE;
710 int f_offset = FALSE;
711 int offset = 0;
712 int f_do_it_anyway_even_for_big_degree = FALSE;
713 int f_print_cycles_of_length_one = FALSE;
714
716
717 cout << "computing the group order:" << endl;
718 group_order(go);
719 cout << "The group order is " << go << endl;
720
721 cout << "strong generators are:" << endl;
722 gens->print(cout, f_print_as_permutation,
723 f_offset, offset, f_do_it_anyway_even_for_big_degree,
724 f_print_cycles_of_length_one);
725 }
726 FREE_OBJECT(S);
727 FREE_OBJECT(my_gens);
728 FREE_int(data);
729 FREE_int(go_factored);
730 FREE_int(Elt1);
731 if (f_v) {
732 cout << "strong_generators::generators_for_the_diagonal_group done" << endl;
733 }
734}
735
738 matrix_group *Mtx, int power_of_singer,
740 int verbose_level)
741{
742 int f_v = (verbose_level >= 1);
743 int f_vv = (verbose_level >= 2);
744 int *Elt1;
745 sims *S;
749 long int *go_factored;
750 int n, q;
751 //vector_ge *my_gens;
752 int *data;
753 int i;
756
757 if (f_v) {
758 cout << "strong_generators::generators_for_the_singer_cycle "
759 "initializing singer group "
760 "power_of_singer=" << power_of_singer << endl;
761 }
762 F = Mtx->GFq;
763 q = F->q;
764 n = Mtx->n;
765 if (f_v) {
766 cout << "n=" << n << " q=" << q << endl;
767 }
768 Elt1 = NEW_int(A->elt_size_in_int);
769 go_factored = NEW_lint(1);
770 data = NEW_int(n * n + 1);
771
772 // group order
773 // = (q^n - 1) / (q - 1) if projective
774 // = q^n - 1 if general_linear
775
776 go_factored[0] = Gg.nb_PG_elements(n - 1, q);
777 long int g;
778 g = NT.gcd_lint(go_factored[0], power_of_singer);
779 go_factored[0] = go_factored[0] / g;
780
781 D.multiply_up_lint(target_go, go_factored, 1, 0 /* verbose_level */);
782 if (f_v) {
783 cout << "group order factored: ";
784 Lint_vec_print(cout, go_factored, 1);
785 cout << endl;
786 cout << "target_go=" << target_go << endl;
787 }
789 nice_gens->init(A, verbose_level - 2);
790 nice_gens->allocate(1, verbose_level - 2);
791
792
793
794 {
796
797#if 0
798 if (!NT.is_prime(q)) {
799 cout << "strong_generators::generators_for_the_singer_cycle "
800 "field order must be a prime" << endl;
801 exit(1);
802 }
803#endif
804
805 Fq.finite_field_init(q, FALSE /* f_without_tables */, 0 /*verbose_level*/);
807
810
811 FX.create_object_by_rank(m, 0, __FILE__, __LINE__, verbose_level);
812
813 if (f_v) {
814 cout << "strong_generators::generators_for_the_singer_cycle "
815 "before FX.get_a_primitive_polynomial "
816 "q=" << q << " degree=" << n << endl;
817 }
818 FX.get_a_primitive_polynomial(m, n, verbose_level - 1);
819 if (f_v) {
820 cout << "strong_generators::generators_for_the_singer_cycle "
821 "after FX.get_a_primitive_polynomial" << endl;
822 cout << "m=";
823 FX.print_object(m, cout);
824 cout << endl;
825 }
826
827 Int_vec_zero(data, n * n);
828
829 // create upper diagonal:
830 for (i = 0; i < n - 1; i++) {
831 data[i * n + i + 1] = 1;
832 }
833
834 int a, b;
835
836 // create the lower row:
837 for (i = 0; i < n; i++) {
838 a = FX.s_i(m, i);
839 b = F->negate(a);
840 data[(n - 1) * n + i] = b;
841 }
842
843 if (Mtx->f_semilinear) {
844 data[n * n] = 0;
845 }
846 }
847
848
849 A->make_element(Elt1, data, 0 /*verbose_level - 1*/);
850 if (f_v) {
851 cout << "generator :" << endl;
852 A->element_print_quick(Elt1, cout);
853 }
854
856 power_of_singer, 0 /* verbose_level */);
857
858 if (f_v) {
859 cout << "generator after raising to the "
860 "power of " << power_of_singer << ":" << endl;
861 A->element_print_quick(Elt1, cout);
862 }
863 nice_gens->copy_in(0, Elt1);
864
865
866 if (f_v) {
867 cout << "strong_generators::generators_for_the_"
868 "singer_cycle creating group" << endl;
869 }
870 if (f_v) {
871 cout << "group order factored: ";
872 Lint_vec_print(cout, go_factored, 1);
873 cout << endl;
874 cout << "target_go=" << target_go << endl;
875 }
877 nice_gens,
878 TRUE /* f_target_go */,
879 target_go, 0 /*verbose_level - 1*/);
880 if (f_v) {
881 cout << "strong_generators::generators_for_the_"
882 "singer_cycle after creating group" << endl;
883 }
884 init_from_sims(S, 0);
885 if (f_v) {
886 cout << "strong_generators::generators_for_the_"
887 "singer_cycle after extracting "
888 "strong generators" << endl;
889 }
890 if (f_vv) {
891 int f_print_as_permutation = FALSE;
892 int f_offset = FALSE;
893 int offset = 0;
894 int f_do_it_anyway_even_for_big_degree = FALSE;
895 int f_print_cycles_of_length_one = FALSE;
896
897 cout << "strong generators are:" << endl;
898 gens->print(cout, f_print_as_permutation,
899 f_offset, offset, f_do_it_anyway_even_for_big_degree,
900 f_print_cycles_of_length_one);
901 }
902 FREE_OBJECT(S);
903 //FREE_OBJECT(nice_gens);
904 FREE_int(data);
905 FREE_lint(go_factored);
906 FREE_int(Elt1);
907 if (f_v) {
908 cout << "strong_generators::generators_for_the_singer_cycle done" << endl;
909 }
910}
911
914 matrix_group *Mtx, int power_of_singer,
916 int verbose_level)
917{
918 int f_v = (verbose_level >= 1);
919 int f_vv = (verbose_level >= 2);
920 int *Elt1;
921 sims *S;
925 long int *go_factored;
926 int n, q;
927 //vector_ge *my_gens;
928 int *data1;
929 int *data2;
930 int i;
933
934 if (f_v) {
935 cout << "strong_generators::generators_for_the_singer_cycle_and_the_Frobenius "
936 "initializing singer group power_of_singer="
937 << power_of_singer << endl;
938 }
939 F = Mtx->GFq;
940 q = F->q;
941 n = Mtx->n;
942 if (f_v) {
943 cout << "n=" << n << " q=" << q << endl;
944 }
945 Elt1 = NEW_int(A->elt_size_in_int);
946 go_factored = NEW_lint(2);
947 data1 = NEW_int(n * n + 1);
948 data2 = NEW_int(n * n + 1);
949
950 // group order
951 // = (q^n - 1) / (q - 1) if projective
952 // = q^n - 1 if general_linear
953
954 go_factored[0] = Gg.nb_PG_elements(n - 1, q);
955 long int g;
956 g = NT.gcd_lint(go_factored[0], power_of_singer);
957 go_factored[0] = go_factored[0] / g;
958 go_factored[1] = n;
959
960 D.multiply_up_lint(target_go, go_factored, 2, 0 /* verbose_level */);
961 if (f_v) {
962 cout << "group order factored: ";
963 Lint_vec_print(cout, go_factored, 2);
964 cout << endl;
965 cout << "target_go=" << target_go << endl;
966 }
968 nice_gens->init(A, verbose_level - 2);
969 nice_gens->allocate(2, verbose_level - 2);
970
971
972
973 {
975
976 if (!NT.is_prime(q)) {
977 cout << "strong_generators::generators_for_the_singer_cycle_and_the_Frobenius "
978 "field order must be a prime" << endl;
979 exit(1);
980 }
981
982 Fp.finite_field_init(q, FALSE /* f_without_tables */, 0 /*verbose_level*/);
984
987
988 FX.create_object_by_rank(m, 0, __FILE__, __LINE__, verbose_level);
989
990 if (f_v) {
991 cout << "search_for_primitive_polynomial_of_given_degree "
992 "p=" << q << " degree=" << n << endl;
993 }
994 FX.get_a_primitive_polynomial(m, n, verbose_level - 1);
995
996 Int_vec_zero(data1, n * n);
997
998 // create upper diagonal:
999 for (i = 0; i < n - 1; i++) {
1000 data1[i * n + i + 1] = 1;
1001 }
1002
1003 int a, b;
1004
1005 // create the lower row:
1006 for (i = 0; i < n; i++) {
1007 a = FX.s_i(m, i);
1008 b = F->negate(a);
1009 data1[(n - 1) * n + i] = b;
1010 }
1011
1012 if (Mtx->f_semilinear) {
1013 data1[n * n] = 0;
1014 }
1015
1016 Int_vec_zero(data2, n * n);
1017
1018 FX.Frobenius_matrix_by_rows(data2, m,
1019 verbose_level);
1020
1021 if (Mtx->f_semilinear) {
1022 data2[n * n] = 0;
1023 }
1024
1025 }
1026
1027
1028 A->make_element(Elt1, data1, 0 /*verbose_level - 1*/);
1029 if (f_v) {
1030 cout << "singer cycle 0:" << endl;
1031 A->element_print_quick(Elt1, cout);
1032 }
1033
1035 power_of_singer, 0 /* verbose_level */);
1036
1037 if (f_v) {
1038 cout << "generator after raising to the "
1039 "power of " << power_of_singer << ":" << endl;
1040 A->element_print_quick(Elt1, cout);
1041 }
1042 nice_gens->copy_in(0, Elt1);
1043
1044 A->make_element(Elt1, data2, 0 /*verbose_level - 1*/);
1045 if (f_v) {
1046 cout << "Frob:" << endl;
1047 A->element_print_quick(Elt1, cout);
1048 }
1049 nice_gens->copy_in(1, Elt1);
1050
1051
1052
1053 if (f_v) {
1054 cout << "strong_generators::generators_for_the_singer_cycle_and_the_Frobenius "
1055 "creating group" << endl;
1056 }
1057 if (f_v) {
1058 cout << "group order factored: ";
1059 Lint_vec_print(cout, go_factored, 1);
1060 cout << endl;
1061 cout << "target_go=" << target_go << endl;
1062 }
1064 nice_gens,
1065 TRUE /* f_target_go */,
1066 target_go, 0 /*verbose_level - 1*/);
1067 if (f_v) {
1068 cout << "strong_generators::generators_for_the_singer_cycle_and_the_Frobenius "
1069 "after creating group" << endl;
1070 }
1071 init_from_sims(S, 0);
1072 if (f_v) {
1073 cout << "strong_generators::generators_for_the_singer_cycle_and_the_Frobenius "
1074 "after extracting strong generators" << endl;
1075 }
1076 if (f_vv) {
1077 int f_print_as_permutation = FALSE;
1078 int f_offset = FALSE;
1079 int offset = 0;
1080 int f_do_it_anyway_even_for_big_degree = FALSE;
1081 int f_print_cycles_of_length_one = FALSE;
1082
1083 cout << "strong generators are:" << endl;
1084 gens->print(cout, f_print_as_permutation,
1085 f_offset, offset, f_do_it_anyway_even_for_big_degree,
1086 f_print_cycles_of_length_one);
1087 }
1088 FREE_OBJECT(S);
1089 //FREE_OBJECT(nice_gens);
1090 FREE_int(data1);
1091 FREE_int(data2);
1092 FREE_lint(go_factored);
1093 FREE_int(Elt1);
1094 if (f_v) {
1095 cout << "strong_generators::generators_for_the_singer_cycle_and_the_Frobenius done" << endl;
1096 }
1097}
1098
1100 actions::action *A,
1101 matrix_group *Mtx, int verbose_level)
1102{
1103 int f_v = (verbose_level >= 1);
1104 //int f_vv = (verbose_level >= 2);
1106 int n, q;
1107
1108 if (f_v) {
1109 cout << "strong_generators::generators_for_the_null_polarity_group" << endl;
1110 }
1111 F = Mtx->GFq;
1112 q = F->q;
1113 n = Mtx->n;
1114 if (f_v) {
1115 cout << "n=" << n << " q=" << q << endl;
1116 }
1117
1119
1121
1122
1123 if (f_v) {
1124 cout << "strong_generators::generators_for_the_null_polarity_group calling "
1125 "null_polarity_generator::init" << endl;
1126 }
1127 N->init(F, n, verbose_level);
1128
1130
1131 init_from_data(A, N->Data,
1132 N->nb_gens, n * n, N->transversal_length,
1133 nice_gens,
1134 verbose_level);
1135
1136
1137 FREE_OBJECT(N);
1138 FREE_OBJECT(nice_gens);
1139
1140 if (f_v) {
1141 cout << "strong_generators::generators_for_the_null_polarity_group done" << endl;
1142 }
1143}
1144
1146 actions::action *A,
1147 matrix_group *Mtx, int verbose_level)
1148{
1149 int f_v = (verbose_level >= 1);
1150 //int f_vv = (verbose_level >= 2);
1152 int n, q;
1153
1154 if (f_v) {
1155 cout << "strong_generators::generators_for_symplectic_group" << endl;
1156 }
1157 F = Mtx->GFq;
1158 q = F->q;
1159 n = Mtx->n;
1160 if (f_v) {
1161 cout << "n=" << n << " q=" << q << endl;
1162 }
1163
1165
1167
1168
1169 if (f_v) {
1170 cout << "strong_generators::generators_for_symplectic_group calling "
1171 "generators_symplectic_group::init" << endl;
1172 }
1173 N->init(F, n, verbose_level);
1174
1175 // warning, N->transversal_length[n]
1176 // but A->base_len = n + 1
1177
1179 int *t_len;
1180 int i;
1181
1182 t_len = NEW_int(A->base_len());
1183 for (i = 0; i < A->base_len(); i++) {
1184 if (i < n) {
1185 t_len[i] = N->transversal_length[i];
1186 }
1187 else {
1188 t_len[i] = 1;
1189 }
1190 }
1191 if (f_v) {
1192 cout << "strong_generators::generators_for_symplectic_group t_len=";
1193 Int_vec_print(cout, t_len, A->base_len());
1194 cout << endl;
1195 }
1196
1197 if (f_v) {
1198 cout << "strong_generators::generators_for_symplectic_group calling "
1199 "init_from_data" << endl;
1200 }
1201 init_from_data(A, N->Data,
1202 N->nb_gens, n * n, t_len,
1203 nice_gens,
1204 verbose_level);
1205
1206
1207 FREE_int(t_len);
1208 FREE_OBJECT(nice_gens);
1209 FREE_OBJECT(N);
1210
1211 if (f_v) {
1212 cout << "strong_generators::generators_for_the_symplectic_group done" << endl;
1213 }
1214}
1215
1217 actions::action *A, int *Mtx, int verbose_level)
1218{
1219 int f_v = (verbose_level >= 1);
1220 //int f_vv = (verbose_level >= 2);
1221 sims *S;
1222
1223 if (f_v) {
1224 cout << "strong_generators::init_centralizer_of_matrix" << endl;
1225 }
1227 Mtx, verbose_level - 1);
1228 init_from_sims(S, 0 /* verbose_level */);
1229 FREE_OBJECT(S);
1230 if (f_v) {
1231 cout << "strong_generators::init_centralizer_of_matrix done" << endl;
1232 }
1233}
1234
1236 actions::action *A_projective, actions::action *A_general_linear, int *Mtx,
1237 int verbose_level)
1238{
1239 int f_v = (verbose_level >= 1);
1240 //int f_vv = (verbose_level >= 2);
1241 sims *S;
1242 strong_generators *SG1;
1245 matrix_group *M;
1247 int *data;
1248 int q, n, i;
1249
1250 if (f_v) {
1251 cout << "strong_generators::init_centralizer_of_matrix_general_linear" << endl;
1252 }
1253 S = A_projective->create_sims_for_centralizer_of_matrix(
1254 Mtx, 0/* verbose_level */);
1256 SG1->init_from_sims(S, 0 /* verbose_level */);
1257 FREE_OBJECT(S);
1258
1259 M = A_projective->G.matrix_grp;
1260 q = M->GFq->q;
1261 n = M->n;
1262
1263 SG1->group_order(go1);
1264 Q.create(q - 1, __FILE__, __LINE__);
1265 D.mult(go1, Q, go);
1266
1267 if (f_v) {
1268 cout << "strong_generators::init_centralizer_of_matrix_general_linear "
1269 "created centralizer "
1270 "in the projective linear group of "
1271 "order " << go1 << endl;
1272 }
1273
1275 new_gens->init(A_general_linear, verbose_level - 2);
1276 new_gens->allocate(SG1->gens->len + 1, verbose_level - 2);
1277 data = NEW_int(n * n + n + 1);
1278 for (i = 0; i < SG1->gens->len; i++) {
1279 Int_vec_copy(SG1->gens->ith(i), data, n * n);
1280 if (M->f_semilinear) {
1281 data[n * n] = SG1->gens->ith(i)[n * n];
1282 }
1283 A_general_linear->make_element(
1284 new_gens->ith(i), data, 0);
1285 }
1287 if (M->f_semilinear) {
1288 data[n * n] = 0;
1289 }
1290 A_general_linear->make_element(
1291 new_gens->ith(SG1->gens->len), data, 0);
1292
1293
1294 if (f_v) {
1295 cout << "strong_generators::init_centralizer_of_matrix_general_linear "
1296 "creating sims for the general "
1297 "linear centralizer of order " << go << endl;
1298 }
1300 new_gens, go, 0 /* verbose_level */);
1301 if (f_v) {
1302 cout << "strong_generators::init_centralizer_of_matrix_general_linear "
1303 "creating sims for the general "
1304 "linear centralizer of order " << go << " done" << endl;
1305 }
1306 init_from_sims(S, 0 /* verbose_level */);
1307 FREE_OBJECT(S);
1308
1309
1310 FREE_int(data);
1311 FREE_OBJECT(new_gens);
1312 FREE_OBJECT(SG1);
1313 if (f_v) {
1314 cout << "strong_generators::init_centralizer_of_matrix_general_linear done" << endl;
1315 }
1316}
1317
1319 actions::action *Aq,
1320 int n, int s, field_theory::finite_field *Fq,
1321 int verbose_level)
1322{
1323 int f_v = (verbose_level >= 1);
1324 int q, Q, m, t;
1326 actions::action *AQ;
1328 sims *Sims;
1329 int *EltQ;
1330 int *Eltq;
1331 int *Mtx;
1333
1334 if (f_v) {
1335 cout << "strong_generators::field_reduction" << endl;
1336 }
1337 q = Fq->q;
1338 Q = NT.i_power_j(q, s);
1339 m = n / s;
1340 if (m * s != n) {
1341 cout << "strong_generators::field_reduction "
1342 "s must divide n" << endl;
1343 exit(1);
1344 }
1345 if (f_v) {
1346 cout << "strong_generators::field_reduction "
1347 "creating subfield structure" << endl;
1348 }
1349 if (f_v) {
1350 cout << "n=" << n << endl;
1351 cout << "s=" << s << endl;
1352 cout << "m=" << m << endl;
1353 cout << "q=" << q << endl;
1354 cout << "Q=" << Q << endl;
1355 }
1357 FQ->finite_field_init(Q, FALSE /* f_without_tables */, 0);
1358
1360
1361 if (f_v) {
1362 cout << "strong_generators::field_reduction "
1363 "creating AQ" << endl;
1364 }
1365
1367
1369 FQ,
1370 FALSE /* f_semilinear */,
1371 TRUE /* f_basis */, FALSE /* f_init_sims */,
1372 nice_gens,
1373 verbose_level - 2);
1374 if (f_v) {
1375 cout << "strong_generators::field_reduction "
1376 "creating AQ done" << endl;
1377 }
1378 FREE_OBJECT(nice_gens);
1379
1383 int r;
1384
1385 AQ->group_order(order_GLmQ);
1386
1387
1388 if (f_v) {
1389 cout << "strong_generators::field_reduction "
1390 "order of GL(m,Q) = " << order_GLmQ << endl;
1391 }
1392 D.integral_division_by_int(order_GLmQ,
1393 q - 1, target_go, r);
1394 if (f_v) {
1395 cout << "strong_generators::field_reduction "
1396 "target_go = " << target_go << endl;
1397 }
1398
1400 S->init(FQ, Fq, verbose_level);
1401
1402 if (f_v) {
1403 cout << "strong_generators::field_reduction "
1404 "creating subfield structure done" << endl;
1405 }
1406
1409 int nb_gens;
1410
1411 gens = AQ->Strong_gens->gens;
1412 nb_gens = gens->len;
1413
1415
1416 Eltq = NEW_int(Aq->elt_size_in_int);
1417 Mtx = NEW_int(n * n);
1418
1419 if (f_v) {
1420 cout << "strong_generators::field_reduction "
1421 "lifting generators" << endl;
1422 }
1423 gens1->init(Aq, verbose_level - 2);
1424 gens1->allocate(nb_gens, verbose_level - 2);
1425 for (t = 0; t < nb_gens; t++) {
1426 cout << "strong_generators::field_reduction " << t
1427 << " / " << nb_gens << endl;
1428 EltQ = gens->ith(t);
1429 S->lift_matrix(EltQ, m, Mtx, 0 /* verbose_level */);
1430 if (f_v) {
1431 cout << "lifted matrix:" << endl;
1432 Int_matrix_print(Mtx, n, n);
1433 }
1434 Aq->make_element(Eltq, Mtx, verbose_level - 1);
1435 if (f_v) {
1436 cout << "after make_element:" << endl;
1437 Aq->element_print_quick(Eltq, cout);
1438 }
1439 Aq->element_move(Eltq, gens1->ith(t), 0);
1440 cout << "strong_generators::field_reduction " << t
1441 << " / " << nb_gens << " done" << endl;
1442 }
1443
1444 if (f_v) {
1445 cout << "strong_generators::field_reduction "
1446 "creating lifted group:" << endl;
1447 }
1449 gens1, target_go, 0 /* verbose_level */);
1450
1451#if 0
1453 gens1, MINIMUM(2, verbose_level - 3));
1454#endif
1455
1456 if (f_v) {
1457 cout << "strong_generators::field_reduction "
1458 "creating lifted group done" << endl;
1459 }
1460
1462
1463 Sims->group_order(go);
1464
1465 if (f_v) {
1466 cout << "go=" << go << endl;
1467 }
1468
1469 init_from_sims(Sims, 0 /* verbose_level */);
1470 if (f_v) {
1471 cout << "strong_generators::field_reduction "
1472 "strong generators are:" << endl;
1473 print_generators(cout);
1474 }
1475
1476 FREE_OBJECT(gens1);
1477 FREE_int(Eltq);
1478 FREE_int(Mtx);
1479 FREE_OBJECT(Sims);
1480 FREE_OBJECT(S);
1481 FREE_OBJECT(AQ);
1482 FREE_OBJECT(FQ);
1483 if (f_v) {
1484 cout << "strong_generators::field_reduction done" << endl;
1485 }
1486
1487}
1488
1490 actions::action *A_PGL_n1_q, actions::action *A_PGL_n_q,
1491 matrix_group *Mtx_n1, matrix_group *Mtx_n,
1492 data_structures_groups::vector_ge *spread_stab_gens,
1493 ring_theory::longinteger_object &spread_stab_go,
1494 int verbose_level)
1495{
1496 int f_v = (verbose_level >= 1);
1497 int f_vv = (verbose_level >= 2);
1499 int n, n1, q;
1501 int *M, *M1;
1502 int sz;
1503
1504 if (f_v) {
1505 cout << "strong_generators::generators_for_translation_plane_in_andre_model" << endl;
1506 }
1507 F = Mtx_n->GFq;
1508 q = F->q;
1509 n = Mtx_n->n;
1510 n1 = Mtx_n1->n;
1511
1512 if (f_v) {
1513 cout << "strong_generators::generators_for_translation_plane_in_andre_model n=" << n << " n1=" << n1 << endl;
1514 }
1515 int f_semilinear;
1516 int nb_gens, h, cnt, i, j, a, u;
1517
1518
1519 f_semilinear = Mtx_n1->f_semilinear;
1520 nb_gens = spread_stab_gens->len + 1 + n * F->e;
1521 //nb_gens = spread_stab_gens->len + /* 1 + */ n * F->e;
1522
1523 int alpha;
1524
1525 alpha = F->primitive_root();
1526
1527 if (f_v) {
1528 cout << "strong_generators::generators_for_translation_plane_in_andre_model nb_gens=" << nb_gens << endl;
1529 }
1530 sz = n1 * n1 + 1;
1531 M = NEW_int(sz * nb_gens);
1533 my_gens->init(A_PGL_n1_q, verbose_level - 2);
1534 my_gens->allocate(nb_gens, verbose_level - 2);
1535
1536
1537 if (f_v) {
1538 cout << "strong_generators::generators_for_translation_plane_in_andre_model making generators of "
1539 "the first kind:" << endl;
1540 }
1541 cnt = 0;
1542 for (h = 0; h < spread_stab_gens->len; h++, cnt++) {
1543 if (f_vv) {
1544 cout << "making generator " << h << ":" << endl;
1545 //int_matrix_print(spread_stab_gens->ith(h), n, n);
1546 }
1547
1548 M1 = M + cnt * sz;
1549 Int_vec_zero(M1, n1 * n1);
1550 for (i = 0; i < n1; i++) {
1551 M1[i * n1 + i] = 1;
1552 }
1553 if (f_semilinear) {
1554 M1[n1 * n1] = 0;
1555 }
1556 for (i = 0; i < n; i++) {
1557 for (j = 0; j < n; j++) {
1558 a = spread_stab_gens->ith(h)[i * n + j];
1559 M1[i * n1 + j] = a;
1560 }
1561 }
1562 if (f_semilinear) {
1563 a = spread_stab_gens->ith(h)[n * n];
1564 M1[n1 * n1] = a;
1565 }
1566 }
1567
1568#if 1
1569 if (f_v) {
1570 cout << "strong_generators::generators_for_translation_plane_in_andre_model making generators of "
1571 "the second kind:" << endl;
1572 }
1573 M1 = M + cnt * sz;
1574 Int_vec_zero(M1, n1 * n1);
1575 for (i = 0; i < n1; i++) {
1576 if (i < n1 - 1) {
1577 M1[i * n1 + i] = alpha;
1578 }
1579 else {
1580 M1[i * n1 + i] = 1;
1581 }
1582 }
1583 if (f_semilinear) {
1584 M1[n1 * n1] = 0;
1585 }
1586 cnt++;
1587#endif
1588
1589
1590 if (f_v) {
1591 cout << "strong_generators::generators_for_translation_plane_in_andre_model making generators of "
1592 "the third kind:" << endl;
1593 }
1594
1595 for (h = 0; h < n; h++) {
1596 for (u = 0; u < F->e; u++, cnt++) {
1597 M1 = M + cnt * sz;
1598 Int_vec_zero(M1, n1 * n1);
1599 for (i = 0; i < n1; i++) {
1600 M1[i * n1 + i] = 1;
1601 }
1602 M1[(n1 - 1) * n1 + h] = F->power(alpha, u);
1603 // no: computes alpha^{p^u}
1604 if (f_semilinear) {
1605 M1[n1 * n1] = 0;
1606 }
1607 }
1608 }
1609
1610 if (cnt != nb_gens) {
1611 cout << "strong_generators::generators_for_translation_plane_in_andre_model cnt != nb_gens" << endl;
1612 exit(1);
1613 }
1614
1615 if (f_v) {
1616 cout << "strong_generators::generators_for_translation_plane_in_andre_model making generators:" << endl;
1617 }
1618 for (h = 0; h < nb_gens; h++) {
1619 M1 = M + h * sz;
1620 if (f_v) {
1621 cout << "strong_generators::generators_for_translation_plane_in_andre_model generator " << h << " / "
1622 << nb_gens << endl;
1623 Int_matrix_print(M1, n1, n1);
1624 //cout << endl;
1625 }
1626 A_PGL_n1_q->make_element(my_gens->ith(h), M1, 0 /* verbose_level */);
1627 }
1628
1630 ring_theory::longinteger_object target_go, aa, b, bb, c, go;
1631
1632
1633 spread_stab_go.assign_to(aa);
1634 //D.multiply_up(aa, spread_stab_tl, A_PGL_n_q->base_len);
1635
1636 if (f_v) {
1637 cout << "strong_generators::generators_for_translation_plane_in_andre_model spread stabilizer "
1638 "has order " << aa << endl;
1639 }
1640 b.create_i_power_j(q, n);
1641 D.mult(aa, b, bb);
1642 c.create(q - 1, __FILE__, __LINE__);
1643 D.mult(bb, c, target_go);
1644 if (f_v) {
1645 cout << "strong_generators::generators_for_translation_plane_in_andre_model plane stabilizer "
1646 "target_go=" << target_go << endl;
1647 }
1648
1649 sims *S;
1650
1651
1652 if (f_v) {
1653 cout << "strong_generators::generators_for_translation_plane_in_andre_model creating group" << endl;
1654 }
1656 my_gens, target_go, 0 /*verbose_level*/);
1657 if (f_v) {
1658 cout << "strong_generators::generators_for_translation_plane_in_andre_model group has been created" << endl;
1659 }
1660
1661 S->group_order(go);
1662
1663 if (f_v) {
1664 cout << "strong_generators::generators_for_translation_plane_in_andre_model created group of "
1665 "order " << go << endl;
1666 }
1667
1668 init_from_sims(S, 0 /* verbose_level */);
1669
1670 FREE_OBJECT(S);
1671 FREE_int(M);
1672 FREE_OBJECT(my_gens);
1673
1674 if (f_v) {
1675 cout << "strong_generators::generators_for_translation_plane_in_andre_model done" << endl;
1676 }
1677}
1678
1680 actions::action *A_PGL_n_q,
1681 matrix_group *Mtx, int verbose_level)
1682{
1683 int f_v = (verbose_level >= 1);
1685 int n, k, q;
1687 actions::action *A_PGL_k_q;
1688
1689 if (f_v) {
1690 cout << "strong_generators::generators_for_the_stabilizer_of_two_components" << endl;
1691 }
1692 F = Mtx->GFq;
1693 q = F->q;
1694 n = Mtx->n;
1695 k = n >> 1;
1696 if (ODD(n)) {
1697 cout << "strong_generators::generators_for_the_stabilizer_of_two_components "
1698 "n must be even" << endl;
1699 exit(1);
1700 }
1701 if (f_v) {
1702 cout << "n=" << n << " k=" << k << " q=" << q << endl;
1703 }
1704
1706
1707
1708 A_PGL_k_q = NEW_OBJECT(actions::action);
1709 A_PGL_k_q->init_projective_group(k,
1710 F, FALSE /*f_semilinear */, TRUE /* f_init_sims */,
1711 TRUE /* f_basis */,
1712 nice_gens,
1713 0 /* verbose_level */);
1714
1715 FREE_OBJECT(nice_gens);
1717
1718 if (f_v) {
1719 cout << "strong_generators::generators_for_the_stabilizer_of_two_components "
1720 "before make_generators_stabilizer_of_two_components" << endl;
1721 }
1722
1724
1725 AG.make_generators_stabilizer_of_two_components(A_PGL_n_q, A_PGL_k_q,
1726 k, my_gens, verbose_level - 1);
1727
1728 if (f_v) {
1729 cout << "strong_generators::generators_for_the_stabilizer_of_two_components "
1730 "after make_generators_stabilizer_of_two_components" << endl;
1731 }
1732
1733 ring_theory::longinteger_object go_linear, a, two, target_go;
1735
1736 two.create(1, __FILE__, __LINE__);
1737 A_PGL_k_q->group_order(go_linear);
1738 D.mult(go_linear, go_linear, a);
1739 D.mult(a, two, target_go);
1740
1741 if (f_v) {
1742 cout << "strong_generators::generators_for_the_stabilizer_of_two_components "
1743 "before generators_to_strong_generators target_go=" << target_go << endl;
1744 }
1745
1747
1749 TRUE /* f_target_go */, target_go,
1750 my_gens, SG, verbose_level - 3);
1751
1752 if (f_v) {
1753 cout << "strong_generators::generators_for_the_stabilizer_of_two_components "
1754 "after generators_to_strong_generators" << endl;
1755 }
1756
1757 init_copy(SG, 0);
1758
1759
1760 FREE_OBJECT(SG);
1761 FREE_OBJECT(A_PGL_k_q);
1762 FREE_OBJECT(my_gens);
1763
1764 if (f_v) {
1765 cout << "strong_generators::generators_for_the_stabilizer_of_two_components done" << endl;
1766 }
1767}
1768
1770 matrix_group *Mtx, int verbose_level)
1771{
1772 int f_v = (verbose_level >= 1);
1773 int f_vv = (verbose_level >= 2);
1775 int n, k, q;
1777 actions::action *A_PGL_k_q;
1778 ring_theory::longinteger_object go, a, b, target_go;
1780 int *P;
1781 int len1, len;
1782 int h1, h;
1783 int Identity[4] = {0,1,1,0};
1784 int *Q;
1785 int *Elt1;
1787
1788 if (f_v) {
1789 cout << "strong_generators::regulus_stabilizer" << endl;
1790 }
1791 F = Mtx->GFq;
1792 q = F->q;
1793 n = Mtx->n;
1794 if (n != 4) {
1795 cout << "strong_generators::regulus_stabilizer "
1796 "n must be 4" << endl;
1797 exit(1);
1798 }
1799 k = n >> 1;
1800 if (ODD(n)) {
1801 cout << "strong_generators::regulus_stabilizer "
1802 "n must be even" << endl;
1803 exit(1);
1804 }
1805 if (f_v) {
1806 cout << "n=" << n << " k=" << k << " q=" << q << endl;
1807 }
1808
1810
1811 A_PGL_k_q = NEW_OBJECT(actions::action);
1812 A_PGL_k_q->init_projective_group(k,
1813 F, FALSE /*f_semilinear */, TRUE /* f_init_sims */,
1814 TRUE /* f_basis */,
1815 nice_gens,
1816 0 /* verbose_level */);
1817 FREE_OBJECT(nice_gens);
1818 A_PGL_k_q->group_order(go);
1819 D.mult(go, go, a);
1820 if (Mtx->f_semilinear) {
1821 b.create(F->e, __FILE__, __LINE__);
1822 }
1823 else {
1824 b.create(1, __FILE__, __LINE__);
1825 }
1826 D.mult(a, b, target_go);
1827 if (f_v) {
1828 cout << "strong_generators::regulus_stabilizer "
1829 "target_go=" << target_go
1830 << " = order of PGL(" << k << "," << q << ")^2 * "
1831 << b << " = " << go << "^2 * " << b << endl;
1832 cout << "action A_PGL_k_q: ";
1833 A_PGL_k_q->print_info();
1834 }
1835
1836 Elt1 = NEW_int(A_PGL_n_q->elt_size_in_int);
1838 my_gens->init(A_PGL_n_q, verbose_level - 2);
1839
1840 gens1 = A_PGL_k_q->Strong_gens->gens;
1841 len1 = gens1->len;
1842 if (f_v) {
1843 cout << "There are " << len1 << " generators in gen1" << endl;
1844 }
1845 len = 2 * len1;
1846 if (Mtx->f_semilinear) {
1847 len++;
1848 }
1849 Q = NEW_int(n * n + 1);
1850 my_gens->allocate(len, verbose_level - 2);
1851
1852
1853 if (f_vv) {
1854 cout << "strong_generators::regulus_stabilizer "
1855 "creating generators for the stabilizer:" << endl;
1856 }
1857 for (h = 0; h < len; h++) {
1858 if (f_vv) {
1859 cout << "strong_generators::regulus_stabilizer "
1860 "h=" << h << " / " << len << endl;
1861 }
1862
1863 if (h < 2 * len1) {
1864 h1 = h >> 1;
1865 P = gens1->ith(h1);
1866 if (f_vv) {
1867 cout << "strong_generators::regulus_stabilizer "
1868 "generator:" << endl;
1869 A_PGL_k_q->print_quick(cout, P);
1870 }
1871
1872 if ((h % 2) == 0) {
1873 F->Linear_algebra->Kronecker_product(P, Identity, 2, Q);
1874 }
1875 else {
1876 F->Linear_algebra->Kronecker_product(Identity, P, 2, Q);
1877 }
1878 if (Mtx->f_semilinear) {
1879 Q[n * n] = P[k * k];
1880 }
1881 }
1882 else {
1884 Q[n * n] = 1;
1885 }
1886 if (f_vv) {
1887 cout << "strong_generators::regulus_stabilizer "
1888 "h = " << h << " before make_element:" << endl;
1889 Int_matrix_print(Q, n, n);
1890 if (Mtx->f_semilinear) {
1891 cout << "strong_generators::regulus_stabilizer "
1892 "semilinear part = " << Q[n * n] << endl;
1893 }
1894 }
1895 A_PGL_n_q->make_element(Elt1, Q, 0);
1896 if (f_vv) {
1897 cout << "strong_generators::regulus_stabilizer "
1898 "after make_element:" << endl;
1899 A_PGL_n_q->print_quick(cout, Elt1);
1900 }
1901 A_PGL_n_q->move(Elt1, my_gens->ith(h));
1902
1903 }
1904 if (f_vv) {
1905 for (h = 0; h < len; h++) {
1906 cout << "strong_generators::regulus_stabilizer "
1907 "generator " << h << ":" << endl;
1908 A_PGL_n_q->element_print(my_gens->ith(h), cout);
1909 }
1910 }
1911
1912 if (f_v) {
1913 cout << "strong_generators::regulus_stabilizer "
1914 "before generators_to_strong_generators "
1915 "target_go=" << target_go << endl;
1916 }
1917
1919
1921 TRUE /* f_target_go */, target_go,
1922 my_gens, SG, verbose_level - 3);
1923
1924 if (f_v) {
1925 cout << "strong_generators::regulus_stabilizer "
1926 "after generators_to_strong_generators" << endl;
1927 }
1928
1929 init_copy(SG, 0);
1930
1931
1932 FREE_OBJECT(SG);
1933 FREE_OBJECT(A_PGL_k_q);
1934 FREE_OBJECT(my_gens);
1935 FREE_int(Elt1);
1936 FREE_int(Q);
1937
1938 if (f_v) {
1939 cout << "strong_generators::regulus_stabilizer "
1940 "done" << endl;
1941 }
1942}
1943
1945 actions::action *A_linear,
1946 matrix_group *Mtx, int verbose_level)
1947{
1948 int f_v = (verbose_level >= 1);
1949 int f_vv = (verbose_level >= 2);
1950 int *Elt1;
1953 int *Q;
1954 int n, i, j, h, alpha, len, q;
1955
1956 if (f_v) {
1957 cout << "strong_generators::generators_for_the_borel_subgroup_upper" << endl;
1958 }
1959 F = Mtx->GFq;
1960 q = F->q;
1961 n = Mtx->n;
1962 Elt1 = NEW_int(A_linear->elt_size_in_int);
1964 my_gens->init(A_linear, verbose_level - 2);
1965
1966 len = n + ((n * (n - 1)) >> 1);
1967 if (f_v) {
1968 cout << "strong_generators::generators_for_the_borel_subgroup_upper len=" << len << endl;
1969 }
1970 my_gens->allocate(len, verbose_level - 2);
1971 Q = NEW_int(n * n + 1);
1972
1973
1974 if (f_vv) {
1975 cout << "strong_generators::generators_for_the_borel_subgroup_upper creating generators "
1976 "for the stabilizer:" << endl;
1977 }
1978 h = 0;
1979 alpha = F->primitive_root();
1980 for (i = 0; i < n; i++, h++) {
1982 Q[i * n + i] = alpha;
1983 if (Mtx->f_semilinear) {
1984 Q[n * n] = 0;
1985 }
1986 A_linear->make_element(Elt1, Q, 0);
1987 if (f_vv) {
1988 cout << "strong_generators::generators_for_the_borel_subgroup_upper after make_element:" << endl;
1989 A_linear->print_quick(cout, Elt1);
1990 }
1991 A_linear->move(Elt1, my_gens->ith(h));
1992 }
1993 for (i = 0; i < n; i++) {
1994 for (j = i + 1; j < n; j++) {
1996 Q[i * n + j] = 1;
1997 if (Mtx->f_semilinear) {
1998 Q[n * n] = 0;
1999 }
2000 A_linear->make_element(Elt1, Q, 0);
2001 if (f_vv) {
2002 cout << "strong_generators::generators_for_the_borel_subgroup_upper after make_element:" << endl;
2003 A_linear->print_quick(cout, Elt1);
2004 }
2005 A_linear->move(Elt1, my_gens->ith(h));
2006 h++;
2007 }
2008 }
2009 if (h != len) {
2010 cout << "strong_generators::generators_for_the_borel_subgroup_upper n != len" << endl;
2011 cout << "h=" << h << endl;
2012 cout << "len=" << len << endl;
2013 exit(1);
2014 }
2015
2016
2017 if (f_vv) {
2018 for (h = 0; h < len; h++) {
2019 cout << "strong_generators::generators_for_the_borel_subgroup_upper generator "
2020 << h << " / " << len << endl;
2021 A_linear->element_print(my_gens->ith(h), cout);
2022 }
2023 }
2025
2026 int *factors;
2027 int nb_factors;
2028 nb_factors = len;
2029 factors = NEW_int(nb_factors);
2030 h = 0;
2031 for (i = 0; i < n; i++) {
2032 factors[h++] = q - 1;
2033 }
2034 for (i = 0; i < n; i++) {
2035 for (j = i + 1; j < n; j++) {
2036 factors[h++] = q;
2037 }
2038 }
2039
2040 target_go.create_product(nb_factors, factors);
2041 FREE_int(factors);
2042
2043 if (f_v) {
2044 cout << "strong_generators::generators_for_the_borel_subgroup_upper before generators_to_"
2045 "strong_generators target_go=" << target_go << endl;
2046 }
2047
2048
2050
2052 TRUE /* f_target_go */, target_go,
2053 my_gens, SG, verbose_level - 3);
2054
2055 if (f_v) {
2056 cout << "strong_generators::generators_for_the_borel_subgroup_upper after generators_to_"
2057 "strong_generators" << endl;
2058 }
2059
2060 init_copy(SG, 0);
2061
2062 FREE_OBJECT(SG);
2063 FREE_OBJECT(my_gens);
2064 FREE_int(Elt1);
2065 FREE_int(Q);
2066}
2067
2069 actions::action *A_linear,
2070 matrix_group *Mtx, int verbose_level)
2071{
2072 int f_v = (verbose_level >= 1);
2073 int f_vv = (verbose_level >= 2);
2074 int *Elt1;
2077 int *Q;
2078 int n, i, j, h, alpha, len, q;
2079
2080 if (f_v) {
2081 cout << "strong_generators::generators_for_the_borel_subgroup_lower" << endl;
2082 }
2083 F = Mtx->GFq;
2084 q = F->q;
2085 n = Mtx->n;
2086 Elt1 = NEW_int(A_linear->elt_size_in_int);
2088 my_gens->init(A_linear, verbose_level - 2);
2089
2090 len = n + ((n * (n - 1)) >> 1);
2091 if (f_v) {
2092 cout << "strong_generators::generators_for_the_borel_subgroup_lower len=" << len << endl;
2093 }
2094 my_gens->allocate(len, verbose_level - 2);
2095 Q = NEW_int(n * n + 1);
2096
2097
2098 if (f_vv) {
2099 cout << "strong_generators::generators_for_the_borel_subgroup_lower creating generators "
2100 "for the stabilizer:" << endl;
2101 }
2102 h = 0;
2103 alpha = F->primitive_root();
2104 for (i = 0; i < n; i++, h++) {
2106 Q[i * n + i] = alpha;
2107 if (Mtx->f_semilinear) {
2108 Q[n * n] = 0;
2109 }
2110 A_linear->make_element(Elt1, Q, 0);
2111 if (f_vv) {
2112 cout << "strong_generators::generators_for_the_borel_subgroup_lower after make_element:" << endl;
2113 A_linear->print_quick(cout, Elt1);
2114 }
2115 A_linear->move(Elt1, my_gens->ith(h));
2116 }
2117 for (i = 0; i < n; i++) {
2118 for (j = 0; j < i; j++) {
2120 Q[i * n + j] = 1;
2121 if (Mtx->f_semilinear) {
2122 Q[n * n] = 0;
2123 }
2124 A_linear->make_element(Elt1, Q, 0);
2125 if (f_vv) {
2126 cout << "strong_generators::generators_for_the_borel_subgroup_lower after "
2127 "make_element:" << endl;
2128 A_linear->print_quick(cout, Elt1);
2129 }
2130 A_linear->move(Elt1, my_gens->ith(h));
2131 h++;
2132 }
2133 }
2134 if (h != len) {
2135 cout << "strong_generators::generators_for_the_borel_subgroup_lower n != len" << endl;
2136 cout << "h=" << h << endl;
2137 cout << "len=" << len << endl;
2138 exit(1);
2139 }
2140
2141
2142 if (f_vv) {
2143 for (h = 0; h < len; h++) {
2144 cout << "strong_generators::generators_for_the_borel_subgroup_lower generator "
2145 << h << " / " << len << endl;
2146 A_linear->element_print(my_gens->ith(h), cout);
2147 }
2148 }
2150
2151 int *factors;
2152 int nb_factors;
2153 nb_factors = len;
2154 factors = NEW_int(nb_factors);
2155 h = 0;
2156 for (i = 0; i < n; i++) {
2157 factors[h++] = q - 1;
2158 }
2159 for (i = 0; i < n; i++) {
2160 for (j = 0; j < i; j++) {
2161 factors[h++] = q;
2162 }
2163 }
2164
2165 target_go.create_product(nb_factors, factors);
2166 FREE_int(factors);
2167
2168 if (f_v) {
2169 cout << "strong_generators::generators_for_the_borel_subgroup_lower before generators_"
2170 "to_strong_generators target_go=" << target_go << endl;
2171 }
2172
2173
2175
2177 TRUE /* f_target_go */, target_go,
2178 my_gens, SG, verbose_level - 3);
2179
2180 if (f_v) {
2181 cout << "strong_generators::generators_for_the_borel_subgroup_lower after generators_"
2182 "to_strong_generators" << endl;
2183 }
2184
2185 init_copy(SG, 0);
2186
2187 FREE_OBJECT(SG);
2188 FREE_OBJECT(my_gens);
2189 FREE_int(Elt1);
2190 FREE_int(Q);
2191}
2192
2194 actions::action *A_linear,
2195 matrix_group *Mtx, int verbose_level)
2196{
2197 int f_v = (verbose_level >= 1);
2198 int f_vv = (verbose_level >= 2);
2199 int *Elt1;
2202 int *Q;
2203 int n, i, h, len; //, q;
2204
2205 if (f_v) {
2206 cout << "strong_generators::generators_for_the_identity_subgroup" << endl;
2207 }
2208 F = Mtx->GFq;
2209 //q = F->q;
2210 n = Mtx->n;
2211 Elt1 = NEW_int(A_linear->elt_size_in_int);
2213 my_gens->init(A_linear, verbose_level - 2);
2214
2215 len = 1;
2216 if (f_v) {
2217 cout << "strong_generators::generators_for_the_identity_subgroup len=" << len << endl;
2218 }
2219 my_gens->allocate(len, verbose_level - 2);
2220 Q = NEW_int(n * n + 1);
2221
2222
2223 if (f_vv) {
2224 cout << "strong_generators::generators_for_the_identity_subgroup creating generators "
2225 "for the stabilizer:" << endl;
2226 }
2227 for (i = 0; i < 1; i++) {
2229 if (Mtx->f_semilinear) {
2230 Q[n * n] = 0;
2231 }
2232 A_linear->make_element(Elt1, Q, 0);
2233 if (f_vv) {
2234 cout << "strong_generators::generators_for_the_identity_subgroup after make_element:" << endl;
2235 A_linear->print_quick(cout, Elt1);
2236 }
2237 A_linear->move(Elt1, my_gens->ith(i));
2238 }
2239
2240
2241 if (f_vv) {
2242 for (h = 0; h < len; h++) {
2243 cout << "strong_generators::generators_for_the_identity_subgroup generator "
2244 << h << " / " << len << endl;
2245 A_linear->element_print(my_gens->ith(h), cout);
2246 }
2247 }
2249
2250 target_go.create(1, __FILE__, __LINE__);
2251
2252 if (f_v) {
2253 cout << "strong_generators::generators_for_the_identity_subgroup before generators_to_"
2254 "strong_generators target_go=" << target_go << endl;
2255 }
2256
2257
2259
2261 TRUE /* f_target_go */, target_go,
2262 my_gens, SG, verbose_level - 3);
2263
2264 if (f_v) {
2265 cout << "strong_generators::generators_for_the_identity_subgroup "
2266 "after generators_to_strong_generators" << endl;
2267 }
2268
2269 init_copy(SG, 0);
2270
2271 FREE_OBJECT(SG);
2272 FREE_OBJECT(my_gens);
2273 FREE_int(Elt1);
2274 FREE_int(Q);
2275}
2276
2277
2279 actions::action *A_PGL_n_q,
2280 matrix_group *Mtx, int k, int verbose_level)
2281{
2282 int f_v = (verbose_level >= 1);
2284 int n, q, i;
2286 int *data;
2287 int size;
2288 int nb_gens;
2289
2290 if (f_v) {
2291 cout << "strong_generators::generators_for_parabolic_subgroup" << endl;
2292 }
2293 F = Mtx->GFq;
2294 q = F->q;
2295 n = Mtx->n;
2296 if (f_v) {
2297 cout << "n=" << n << " k=" << k << " q=" << q << endl;
2298 }
2299
2300 if (f_v) {
2301 cout << "strong_generators::generators_for_parabolic_subgroup "
2302 "before generators_for_parabolic_subgroup" << endl;
2303 }
2304
2305
2307
2309 Mtx->f_semilinear, k,
2310 data, size, nb_gens,
2311 verbose_level - 2);
2312
2314 my_gens->init(A_PGL_n_q, verbose_level - 2);
2315 my_gens->allocate(nb_gens, verbose_level - 2);
2316 for (i = 0; i < nb_gens; i++) {
2317 A_PGL_n_q->make_element(my_gens->ith(i), data + i * size, 0);
2318 }
2319
2320
2321 if (f_v) {
2322 cout << "strong_generators::generators_for_parabolic_subgroup "
2323 "after generators_for_parabolic_subgroup" << endl;
2324 }
2325
2326 ring_theory::longinteger_object go1, nCk, target_go;
2329
2330
2331 D.group_order_PGL(go1, n, q, Mtx->f_semilinear);
2332
2333 if (f_v) {
2334 cout << "strong_generators::generators_for_parabolic_subgroup "
2335 "go1=" << go1 << endl;
2336 }
2337
2338 C.q_binomial_no_table(nCk, n, k, q, 0 /* verbose_level */);
2339
2340 if (f_v) {
2341 cout << "strong_generators::generators_for_parabolic_subgroup "
2342 "nCk=" << nCk << endl;
2343 }
2344
2345 D.integral_division_exact(go1, nCk, target_go);
2346
2347 if (f_v) {
2348 cout << "strong_generators::generators_for_parabolic_subgroup "
2349 "before generators_to_strong_generators "
2350 "target_go=" << target_go << endl;
2351 }
2352
2354
2356 TRUE /* f_target_go */, target_go,
2357 my_gens, SG, verbose_level - 3);
2358
2359 if (f_v) {
2360 cout << "strong_generators::generators_for_parabolic_subgroup "
2361 "after generators_to_strong_generators" << endl;
2362 }
2363
2364 init_copy(SG, 0);
2365
2366
2367 FREE_OBJECT(SG);
2368 FREE_OBJECT(my_gens);
2369 FREE_int(data);
2370
2371 if (f_v) {
2372 cout << "strong_generators::generators_for_parabolic_subgroup "
2373 "done" << endl;
2374 }
2375}
2376
2377void
2379 actions::action *A_PGL_4_q,
2380 matrix_group *Mtx, int verbose_level)
2381{
2382 int f_v = (verbose_level >= 1);
2384 int n, q, i;
2386 int *data;
2387 int size;
2388 int nb_gens;
2390
2391 if (f_v) {
2392 cout << "strong_generators::generators_for_stabilizer_of_three_collinear_points_in_PGL4" << endl;
2393 }
2394 F = Mtx->GFq;
2395 q = F->q;
2396 n = Mtx->n;
2397 if (f_v) {
2398 cout << "n=" << n << " q=" << q << endl;
2399 }
2400 if (n != 4) {
2401 cout << "strong_generators::generators_for_stabilizer_of_three_collinear_points_in_PGL4 n != 4" << endl;
2402 exit(1);
2403 }
2404
2405 if (f_v) {
2406 cout << "strong_generators::generators_for_stabilizer_of_three_collinear_points_in_PGL4 before generators_"
2407 "for_stabilizer_of_three_collinear_points_in_PGL4" << endl;
2408 }
2409
2411
2413 Mtx->f_semilinear, F,
2414 data, size, nb_gens,
2415 verbose_level);
2416
2418 my_gens->init(A_PGL_4_q, verbose_level - 2);
2419 my_gens->allocate(nb_gens, verbose_level - 2);
2420 for (i = 0; i < nb_gens; i++) {
2421 A_PGL_4_q->make_element(my_gens->ith(i),
2422 data + i * size, 0);
2423 }
2424
2425
2426 if (f_v) {
2427 cout << "strong_generators::generators_for_stabilizer_of_three_collinear_points_in_PGL4 after generators_"
2428 "for_stabilizer_of_three_collinear_points_in_PGL4" << endl;
2429 }
2430
2431 ring_theory::longinteger_object target_go, a, b, c, d, e, f;
2433
2434
2435 target_go.create(1, __FILE__, __LINE__);
2436 a.create((q - 1) * 6, __FILE__, __LINE__);
2437 b.create(q + 1, __FILE__, __LINE__);
2438 c.create(q, __FILE__, __LINE__);
2439 d.create(q - 1, __FILE__, __LINE__);
2440 e.create(NT.i_power_j(q, 4), __FILE__, __LINE__);
2441 D.mult_in_place(target_go, a);
2442 D.mult_in_place(target_go, b);
2443 D.mult_in_place(target_go, c);
2444 D.mult_in_place(target_go, d);
2445 D.mult_in_place(target_go, e);
2446 if (Mtx->f_semilinear) {
2447 f.create(Mtx->GFq->e, __FILE__, __LINE__);
2448 D.mult_in_place(target_go, f);
2449 }
2450
2451 if (f_v) {
2452 cout << "strong_generators::generators_for_stabilizer_of_three_collinear_points_in_PGL4 "
2453 "before generators_to_strong_generators "
2454 "target_go=" << target_go << endl;
2455 }
2456
2458
2460 TRUE /* f_target_go */, target_go,
2461 my_gens, SG, verbose_level - 3);
2462
2463 if (f_v) {
2464 cout << "strong_generators::generators_for_stabilizer_of_three_collinear_points_in_PGL4 after "
2465 "generators_to_strong_generators" << endl;
2466 }
2467
2468 init_copy(SG, 0);
2469
2470
2471 FREE_OBJECT(SG);
2472 FREE_OBJECT(my_gens);
2473 FREE_int(data);
2474
2475 if (f_v) {
2476 cout << "strong_generators::generators_for_stabilizer_of_three_collinear_points_in_PGL4 done" << endl;
2477 }
2478}
2479
2481 actions::action *A_PGL_4_q,
2482 matrix_group *Mtx, int verbose_level)
2483{
2484 int f_v = (verbose_level >= 1);
2486 int n, q, i;
2488 int *data;
2489 int size;
2490 int nb_gens;
2492
2493 if (f_v) {
2494 cout << "strong_generators::generators_for_stabilizer_of_triangle_in_PGL4" << endl;
2495 }
2496 F = Mtx->GFq;
2497 q = F->q;
2498 n = Mtx->n;
2499 if (f_v) {
2500 cout << "n=" << n << " q=" << q << endl;
2501 }
2502 if (n != 4) {
2503 cout << "strong_generators::generators_for_stabilizer_of_triangle_in_PGL4 n != 4" << endl;
2504 exit(1);
2505 }
2506
2507 if (f_v) {
2508 cout << "strong_generators::generators_for_stabilizer_of_triangle_in_PGL4 "
2509 "before generators_for_stabilizer_of_triangle_in_PGL4" << endl;
2510 }
2511
2513
2515 Mtx->f_semilinear, F,
2516 data, size, nb_gens,
2517 verbose_level);
2518
2520 my_gens->init(A_PGL_4_q, verbose_level - 2);
2521 my_gens->allocate(nb_gens, verbose_level - 2);
2522 for (i = 0; i < nb_gens; i++) {
2523 A_PGL_4_q->make_element(my_gens->ith(i), data + i * size, 0);
2524 }
2525
2526
2527 if (f_v) {
2528 cout << "strong_generators::generators_for_stabilizer_of_triangle_in_PGL4 "
2529 "after generators_for_stabilizer_of_triangle_in_PGL4" << endl;
2530 }
2531
2532 ring_theory::longinteger_object target_go, a, b, c, f;
2534
2535
2536 target_go.create(1, __FILE__, __LINE__);
2537 a.create(NT.i_power_j(q, 3), __FILE__, __LINE__);
2538 b.create(NT.i_power_j(q - 1, 3), __FILE__, __LINE__);
2539 c.create(6, __FILE__, __LINE__);
2540 D.mult_in_place(target_go, a);
2541 D.mult_in_place(target_go, b);
2542 D.mult_in_place(target_go, c);
2543 if (Mtx->f_semilinear) {
2544 f.create(Mtx->GFq->e, __FILE__, __LINE__);
2545 D.mult_in_place(target_go, f);
2546 }
2547
2548 if (f_v) {
2549 cout << "strong_generators::generators_for_stabilizer_of_triangle_in_PGL4 "
2550 "before generators_to_strong_generators target_go=" << target_go << endl;
2551 }
2552
2554
2556 TRUE /* f_target_go */, target_go,
2557 my_gens, SG, verbose_level - 3);
2558
2559 if (f_v) {
2560 cout << "strong_generators::generators_for_stabilizer_of_triangle_in_PGL4 "
2561 "after generators_to_strong_generators" << endl;
2562 }
2563
2564 init_copy(SG, 0);
2565
2566
2567 FREE_OBJECT(SG);
2568 FREE_OBJECT(my_gens);
2569 FREE_int(data);
2570
2571 if (f_v) {
2572 cout << "strong_generators::generators_for_stabilizer_of_triangle_in_PGL4 done" << endl;
2573 }
2574}
2575
2577 actions::action *A,
2579 int epsilon,
2580 int f_semilinear,
2581 int verbose_level)
2582{
2583 int f_v = (verbose_level >= 1);
2584
2585 if (f_v) {
2586 cout << "strong_generators::generators_for_the_orthogonal_group" << endl;
2587 cout << "n=" << n << endl;
2588 cout << "epsilon=" << epsilon << endl;
2589 cout << "q=" << F->q << endl;
2590 cout << "f_semilinear=" << f_semilinear << endl;
2591 }
2592
2593 actions::action *A2;
2594
2596 if (f_v) {
2597 cout << "strong_generators::generators_for_the_orthogonal_group before "
2598 "A2->init_orthogonal_group" << endl;
2599 }
2600
2601 A2->init_orthogonal_group(epsilon,
2602 n, F,
2603 TRUE /* f_on_points */, FALSE /* f_on_lines */,
2604 FALSE /* f_on_points_and_lines */,
2605 f_semilinear,
2606 TRUE /* f_basis */, verbose_level);
2607
2608 if (f_v) {
2609 cout << "strong_generators::generators_for_the_orthogonal_group after "
2610 "A2->init_orthogonal_group" << endl;
2611 }
2612
2614 strong_generators *Strong_gens2;
2615
2616 A2->Sims->group_order(target_go);
2617
2618 if (f_v) {
2619 cout << "strong_generators::generators_for_the_orthogonal_group "
2620 "before generators_to_strong_generators" << endl;
2621 }
2623 TRUE /* f_target_go */, target_go,
2624 &A2->Sims->gens, Strong_gens2,
2625 0 /* verbose_level */);
2626
2627 if (f_v) {
2628 cout << "strong_generators::generators_for_the_orthogonal_group after "
2629 "generators_to_strong_generators" << endl;
2630 }
2631
2632 init_copy(Strong_gens2, 0 /* verbose_level */);
2633
2634 //init_from_sims(A2->Sims, 0 /* verbose_level */);
2635 FREE_OBJECT(Strong_gens2);
2636 FREE_OBJECT(A2);
2637
2638 if (f_v) {
2639 cout << "strong_generators::generators_for_the_orthogonal_group done" << endl;
2640 }
2641}
2642
2644 actions::action *A,
2645 field_theory::finite_field *F, int iso,
2646 int verbose_level)
2647{
2648 int f_v = (verbose_level >= 1);
2649
2650 if (f_v) {
2651 cout << "strong_generators::stabilizer_of_cubic_surface_from_catalogue" << endl;
2652 cout << "q=" << F->q << endl;
2653 cout << "iso=" << iso << endl;
2654 }
2655
2656 int *data;
2657 int nb_gens;
2658 int data_size;
2659 string ascii_target_go;
2662
2663 if (f_v) {
2664 cout << "strong_generators::stabilizer_of_cubic_surface_from_catalogue before "
2665 "cubic_surface_stab_gens" << endl;
2666 }
2667 K.cubic_surface_stab_gens(F->q, iso,
2668 data, nb_gens, data_size, ascii_target_go);
2669
2670 target_go.create_from_base_10_string(ascii_target_go);
2671
2672
2674
2676
2677 if (f_v) {
2678 cout << "strong_generators::stabilizer_of_cubic_surface_from_catalogue before "
2679 "gens->init_from_data" << endl;
2680 }
2681 gens->init_from_data(A, data, nb_gens, data_size, 0 /*verbose_level*/);
2682 if (f_v) {
2683 cout << "strong_generators::stabilizer_of_cubic_surface_from_catalogue after "
2684 "gens->init_from_data" << endl;
2685 }
2686
2687
2688
2689 strong_generators *Strong_gens2;
2690
2691 if (f_v) {
2692 cout << "strong_generators::stabilizer_of_cubic_surface_from_catalogue before "
2693 "generators_to_strong_generators" << endl;
2694 }
2696 TRUE /* f_target_go */, target_go,
2697 gens, Strong_gens2,
2698 0 /* verbose_level */);
2699
2700 if (f_v) {
2701 cout << "strong_generators::stabilizer_of_cubic_surface_from_catalogue after "
2702 "generators_to_strong_generators" << endl;
2703 }
2704
2705 init_copy(Strong_gens2, 0 /* verbose_level */);
2706
2707 FREE_OBJECT(Strong_gens2);
2709
2710 if (f_v) {
2711 cout << "strong_generators::stabilizer_of_cubic_surface_from_catalogue done" << endl;
2712 }
2713}
2714
2716 actions::action *A,
2717 field_theory::finite_field *F, int iso,
2718 int verbose_level)
2719{
2720 int f_v = (verbose_level >= 1);
2721
2722 if (f_v) {
2723 cout << "strong_generators::stabilizer_of_quartic_curve_from_catalogue" << endl;
2724 cout << "q=" << F->q << endl;
2725 cout << "iso=" << iso << endl;
2726 }
2727
2728 int *data;
2729 int nb_gens;
2730 int data_size;
2731 string ascii_target_go;
2734
2735 if (f_v) {
2736 cout << "strong_generators::stabilizer_of_quartic_curve_from_catalogue before "
2737 "cubic_surface_stab_gens" << endl;
2738 }
2739 K.quartic_curves_stab_gens(F->q, iso,
2740 data, nb_gens, data_size, ascii_target_go);
2741
2742 target_go.create_from_base_10_string(ascii_target_go);
2743
2744 if (f_v) {
2745 cout << "data:" << endl;
2746 Int_matrix_print(data, nb_gens, data_size);
2747 }
2748
2750
2752
2753 if (f_v) {
2754 cout << "strong_generators::stabilizer_of_quartic_curve_from_catalogue before "
2755 "gens->init_from_data" << endl;
2756 }
2757 gens->init_from_data(A, data, nb_gens, data_size, 0 /*verbose_level*/);
2758 if (f_v) {
2759 cout << "strong_generators::stabilizer_of_quartic_curve_from_catalogue after "
2760 "gens->init_from_data" << endl;
2761 }
2762
2763
2764
2765 strong_generators *Strong_gens2;
2766
2767 if (f_v) {
2768 cout << "strong_generators::stabilizer_of_quartic_curve_from_catalogue before "
2769 "generators_to_strong_generators" << endl;
2770 }
2772 TRUE /* f_target_go */, target_go,
2773 gens, Strong_gens2,
2774 0 /* verbose_level */);
2775
2776 if (f_v) {
2777 cout << "strong_generators::stabilizer_of_quartic_curve_from_catalogue after "
2778 "generators_to_strong_generators" << endl;
2779 }
2780
2781 init_copy(Strong_gens2, 0 /* verbose_level */);
2782
2783 FREE_OBJECT(Strong_gens2);
2785
2786 if (f_v) {
2787 cout << "strong_generators::stabilizer_of_quartic_curve_from_catalogue done" << endl;
2788 }
2789}
2790
2791void
2793 actions::action *A,
2794 field_theory::finite_field *F, int f_with_normalizer, int f_semilinear,
2796 int verbose_level)
2797{
2798 int f_v = (verbose_level >= 1);
2799
2800 if (f_v) {
2801 cout << "strong_generators::stabilizer_of_Eckardt_surface" << endl;
2802 cout << "q=" << F->q << endl;
2803 cout << "f_with_normalizer=" << f_with_normalizer << endl;
2804 cout << "f_semilinear=" << f_semilinear << endl;
2805 }
2806
2807 int *data;
2808 int nb_gens;
2809 int data_size;
2810 int group_order;
2812 int i;
2813
2814 if (f_v) {
2815 cout << "strong_generators::stabilizer_of_Eckardt_surface before "
2816 "F->cubic_surface_family_24_generators" << endl;
2817 }
2818
2820 f_semilinear,
2821 data, nb_gens, data_size, group_order, verbose_level);
2822 //cubic_surface_stab_gens(F->q, iso,
2823 // data, nb_gens, data_size, ascii_target_go);
2824
2825 //vector_ge *gens;
2826
2828 nice_gens->init(A, verbose_level - 2);
2829 target_go.create(group_order, __FILE__, __LINE__);
2830
2831
2832 nice_gens->allocate(nb_gens, verbose_level - 2);
2833 for (i = 0; i < nb_gens; i++) {
2834 A->make_element(nice_gens->ith(i), data + i * data_size, 0);
2835 }
2836
2837
2838
2839 strong_generators *Strong_gens2;
2840
2841 if (f_v) {
2842 cout << "strong_generators::stabilizer_of_Eckardt_surface before "
2843 "generators_to_strong_generators" << endl;
2844 }
2846 TRUE /* f_target_go */, target_go,
2847 nice_gens, Strong_gens2,
2848 0 /* verbose_level */);
2849
2850 if (f_v) {
2851 cout << "strong_generators::stabilizer_of_Eckardt_surface after "
2852 "generators_to_strong_generators" << endl;
2853 }
2854
2855 init_copy(Strong_gens2, 0 /* verbose_level */);
2856
2857 FREE_int(data);
2858 FREE_OBJECT(Strong_gens2);
2859 //FREE_OBJECT(gens);
2860
2861 if (f_v) {
2862 cout << "strong_generators::stabilizer_of_Eckardt_surface done" << endl;
2863 }
2864}
2865
2867 actions::action *A,
2870 int verbose_level)
2871{
2872 int f_v = (verbose_level >= 1);
2873
2874 if (f_v) {
2875 cout << "strong_generators::stabilizer_of_G13_surface" << endl;
2876 cout << "q=" << F->q << endl;
2877 cout << "a=" << a << endl;
2878 }
2879
2880 int *data;
2881 int nb_gens;
2882 int data_size;
2883 int group_order;
2885 int i;
2886
2887 if (f_v) {
2888 cout << "strong_generators::stabilizer_of_G13_surface before "
2889 "F->cubic_surface_family_G13_generators" << endl;
2890 }
2891
2893 data, nb_gens, data_size, group_order, verbose_level);
2894
2896 nice_gens->init(A, verbose_level - 2);
2897 target_go.create(group_order, __FILE__, __LINE__);
2898
2899
2900 nice_gens->allocate(nb_gens, verbose_level - 2);
2901 for (i = 0; i < nb_gens; i++) {
2902 A->make_element(nice_gens->ith(i), data + i * data_size, 0);
2903 }
2904
2905
2906
2907 strong_generators *Strong_gens2;
2908
2909 if (f_v) {
2910 cout << "strong_generators::stabilizer_of_G13_surface before "
2911 "generators_to_strong_generators" << endl;
2912 }
2914 TRUE /* f_target_go */, target_go,
2915 nice_gens, Strong_gens2,
2916 verbose_level);
2917
2918 if (f_v) {
2919 cout << "strong_generators::stabilizer_of_G13_surface after "
2920 "generators_to_strong_generators" << endl;
2921 }
2922
2923 init_copy(Strong_gens2, 0 /* verbose_level */);
2924
2925 FREE_int(data);
2926 FREE_OBJECT(Strong_gens2);
2927 //FREE_OBJECT(gens);
2928
2929 if (f_v) {
2930 cout << "strong_generators::stabilizer_of_G13_surface done" << endl;
2931 }
2932}
2933
2935 actions::action *A,
2938 int verbose_level)
2939{
2940 int f_v = (verbose_level >= 1);
2941
2942 if (f_v) {
2943 cout << "strong_generators::stabilizer_of_F13_surface" << endl;
2944 cout << "q=" << F->q << endl;
2945 cout << "a=" << a << endl;
2946 }
2947
2948 int *data;
2949 int nb_gens;
2950 int data_size;
2951 int group_order;
2953 int i;
2954
2955 if (f_v) {
2956 cout << "strong_generators::stabilizer_of_F13_surface before "
2957 "F->cubic_surface_family_F13_generators" << endl;
2958 }
2959
2961 data, nb_gens, data_size, group_order, verbose_level);
2962
2964 nice_gens->init(A, verbose_level - 2);
2965 target_go.create(group_order, __FILE__, __LINE__);
2966
2967
2968 nice_gens->allocate(nb_gens, verbose_level - 2);
2969 for (i = 0; i < nb_gens; i++) {
2970 A->make_element(nice_gens->ith(i), data + i * data_size, 0);
2971 }
2972
2973
2974
2975 strong_generators *Strong_gens2;
2976
2977 if (f_v) {
2978 cout << "strong_generators::stabilizer_of_F13_surface before "
2979 "generators_to_strong_generators" << endl;
2980 }
2982 TRUE /* f_target_go */, target_go,
2983 nice_gens, Strong_gens2,
2984 verbose_level);
2985
2986 if (f_v) {
2987 cout << "strong_generators::stabilizer_of_F13_surface after "
2988 "generators_to_strong_generators" << endl;
2989 }
2990
2991 init_copy(Strong_gens2, 0 /* verbose_level */);
2992
2993 FREE_int(data);
2994 FREE_OBJECT(Strong_gens2);
2995 //FREE_OBJECT(gens);
2996
2997 if (f_v) {
2998 cout << "strong_generators::stabilizer_of_F13_surface done" << endl;
2999 }
3000}
3001
3002
3004 actions::action *A,
3005 field_theory::finite_field *F, int iso,
3006 int verbose_level)
3007{
3008 int f_v = (verbose_level >= 1);
3009
3010 if (f_v) {
3011 cout << "strong_generators::BLT_set_from_catalogue_stabilizer" << endl;
3012 cout << "q=" << F->q << endl;
3013 cout << "iso=" << iso << endl;
3014 }
3015
3016 int *data;
3017 int nb_gens;
3018 int data_size;
3019 string ascii_target_go;
3021 int i;
3023
3024 if (f_v) {
3025 cout << "strong_generators::BLT_set_from_catalogue_stabilizer "
3026 "before K.BLT_stab_gens" << endl;
3027 }
3028 K.BLT_stab_gens(F->q, iso, data, nb_gens, data_size, ascii_target_go);
3029
3030 if (f_v) {
3031 cout << "strong_generators::BLT_set_from_catalogue_stabilizer data_size=" << data_size << endl;
3032 cout << "strong_generators::BLT_set_from_catalogue_stabilizer nb_gens=" << nb_gens << endl;
3033 }
3034
3036
3038 gens->init(A, verbose_level - 2);
3039 target_go.create_from_base_10_string(ascii_target_go);
3040
3041
3042 gens->allocate(nb_gens, verbose_level - 2);
3043 for (i = 0; i < nb_gens; i++) {
3044 A->make_element(gens->ith(i), data + i * data_size, 0);
3045 }
3046
3047 if (f_v) {
3048 cout << "strong_generators::BLT_set_from_catalogue_stabilizer generators are:" << endl;
3049 gens->print_quick(cout);
3050 }
3051
3052
3053
3054 strong_generators *Strong_gens2;
3055
3056 if (f_v) {
3057 cout << "strong_generators::BLT_set_from_catalogue_stabilizer before "
3058 "generators_to_strong_generators" << endl;
3059 }
3061 TRUE /* f_target_go */, target_go,
3062 gens, Strong_gens2,
3063 0 /* verbose_level */);
3064
3065 if (f_v) {
3066 cout << "strong_generators::BLT_set_from_catalogue_stabilizer after "
3067 "generators_to_strong_generators" << endl;
3068 }
3069
3070 init_copy(Strong_gens2, 0 /* verbose_level */);
3071
3072 FREE_OBJECT(Strong_gens2);
3074
3075 if (f_v) {
3076 cout << "strong_generators::BLT_set_from_catalogue_stabilizer done" << endl;
3077 }
3078}
3079
3081 actions::action *A,
3082 int q, int k, int iso,
3083 int verbose_level)
3084{
3085 int f_v = (verbose_level >= 1);
3086
3087 if (f_v) {
3088 cout << "strong_generators::stabilizer_of_spread_from_catalogue" << endl;
3089 cout << "q=" << q << endl;
3090 cout << "k=" << k << endl;
3091 cout << "iso=" << iso << endl;
3092 }
3093
3094 int *data;
3095 int nb_gens;
3096 int data_size;
3097 string ascii_target_go;
3099 int i;
3101
3102 if (f_v) {
3103 cout << "strong_generators::stabilizer_of_spread_from_catalogue "
3104 "before K.Spread_stab_gens" << endl;
3105 }
3106 K.Spread_stab_gens(q, k, iso, data, nb_gens, data_size, ascii_target_go);
3107
3108 if (f_v) {
3109 cout << "strong_generators::stabilizer_of_spread_from_catalogue "
3110 "data_size=" << data_size << endl;
3111 cout << "strong_generators::stabilizer_of_spread_from_catalogue "
3112 "nb_gens=" << nb_gens << endl;
3113 }
3114
3116
3118 gens->init(A, verbose_level - 2);
3119 target_go.create_from_base_10_string(ascii_target_go);
3120
3121
3122 gens->allocate(nb_gens, verbose_level - 2);
3123 for (i = 0; i < nb_gens; i++) {
3124 A->make_element(gens->ith(i), data + i * data_size, 0);
3125 }
3126
3127 if (f_v) {
3128 cout << "strong_generators::stabilizer_of_spread_from_catalogue "
3129 "generators are:" << endl;
3130 gens->print_quick(cout);
3131 }
3132
3133
3134
3135 strong_generators *Strong_gens2;
3136
3137 if (f_v) {
3138 cout << "strong_generators::stabilizer_of_spread_from_catalogue before "
3139 "generators_to_strong_generators" << endl;
3140 }
3142 TRUE /* f_target_go */, target_go,
3143 gens, Strong_gens2,
3144 0 /* verbose_level */);
3145
3146 if (f_v) {
3147 cout << "strong_generators::stabilizer_of_spread_from_catalogue after "
3148 "generators_to_strong_generators" << endl;
3149 }
3150
3151 init_copy(Strong_gens2, 0 /* verbose_level */);
3152
3153 FREE_OBJECT(Strong_gens2);
3155
3156 if (f_v) {
3157 cout << "strong_generators::stabilizer_of_spread_from_catalogue done" << endl;
3158 }
3159}
3160
3162 actions::action *A,
3164 int verbose_level)
3165{
3166 int f_v = (verbose_level >= 1);
3167
3168 if (f_v) {
3169 cout << "strong_generators::stabilizer_of_pencil_of_conics" << endl;
3170 cout << "q=" << F->q << endl;
3171 }
3172
3175 int i;
3176
3177 if (f_v) {
3178 cout << "strong_generators::stabilizer_of_pencil_of_conics "
3179 "creating generators" << endl;
3180 }
3181
3182
3184
3186 gens->init(A, verbose_level - 2);
3187 target_go.create(NT.i_power_j(F->q - 1, 2), __FILE__, __LINE__);
3188
3189 int *data;
3190 int nb_gens = 2;
3191 int data_size = 10; // 9 + 1
3192 int alpha;
3193
3194 alpha = F->primitive_root();
3195 data = NEW_int(data_size);
3196
3197
3198 gens->allocate(nb_gens, verbose_level - 2);
3199 for (i = 0; i < nb_gens; i++) {
3200 Int_vec_zero(data, data_size);
3201 if (i == 0) {
3202 // diag(t, 1/t, 1)
3203 data[0] = alpha;
3204 data[4] = F->inverse(alpha);
3205 data[8] = 1;
3206 }
3207 else {
3208 // diag(t, 1, 1)
3209 data[0] = alpha;
3210 data[4] = 1;
3211 data[8] = 1;
3212 }
3213 A->make_element(gens->ith(i), data, 0);
3214 }
3215
3216 if (f_v) {
3217 cout << "strong_generators::stabilizer_of_pencil_of_conics "
3218 "generators are:" << endl;
3219 gens->print_quick(cout);
3220 }
3221
3222
3223
3224 strong_generators *Strong_gens2;
3225
3226 if (f_v) {
3227 cout << "strong_generators::stabilizer_of_pencil_of_conics before "
3228 "generators_to_strong_generators" << endl;
3229 }
3231 TRUE /* f_target_go */, target_go,
3232 gens, Strong_gens2,
3233 0 /* verbose_level */);
3234
3235 if (f_v) {
3236 cout << "strong_generators::stabilizer_of_pencil_of_conics after "
3237 "generators_to_strong_generators" << endl;
3238 }
3239
3240 init_copy(Strong_gens2, 0 /* verbose_level */);
3241
3242 FREE_OBJECT(Strong_gens2);
3244
3245 if (f_v) {
3246 cout << "strong_generators::stabilizer_of_pencil_of_conics done" << endl;
3247 }
3248}
3249
3251 actions::action *A,
3253 int verbose_level)
3254{
3255 int f_v = (verbose_level >= 1);
3256
3257 if (f_v) {
3258 cout << "strong_generators::Janko1" << endl;
3259 cout << "q=" << F->q << endl;
3260 }
3261
3262 if (F->q != 11) {
3263 cout << "strong_generators::Janko1 q != 11" << endl;
3264 exit(1);
3265 }
3266 matrix_group *M;
3267
3268 M = A->get_matrix_group();
3269 if (M->n != 7) {
3270 cout << "strong_generators::Janko1 dimension != 7" << endl;
3271 exit(1);
3272 }
3275 int i;
3276
3277
3278
3280
3282 gens->init(A, verbose_level - 2);
3283 target_go.create(11 * (11 * 11 * 11 - 1) * (11 + 1), __FILE__, __LINE__);
3284
3285 int *data;
3286 int nb_gens = 2;
3287 int data_size = 50; // 7 * 7 + 1
3288 //int alpha;
3289 int j;
3290
3291 //alpha = F->primitive_root();
3292 data = NEW_int(data_size);
3293
3294
3295 gens->allocate(nb_gens, verbose_level - 2);
3296 for (i = 0; i < nb_gens; i++) {
3297 Int_vec_zero(data, data_size);
3298 if (i == 0) {
3299 for (j = 0; j < 7; j++) {
3300 if (j < 7 - 1) {
3301 data[j * 7 + j + 1] = 1;
3302 }
3303 else {
3304 data[j * 7 + 0] = 1;
3305 }
3306 }
3307 }
3308 else {
3309 int data2[] = {
3310 -3, 2, -1, -1, -3, -1, -3,
3311 -2, 1, 1, 3, 1, 3, 3,
3312 -1, -1, -3, -1, -3, -3, 2,
3313 -1, -3, -1, -3, -3, 2, -1,
3314 -3, -1, -3, -3, 2, -1, -1,
3315 1, 3, 3, -2, 1, 1, 3,
3316 3, 3, -2, 1, 1, 3, 1
3317 };
3318 for (j = 0; j < 49; j++) {
3319 data[j] = (data2[j] + 11) % 11;
3320 }
3321 }
3322 A->make_element(gens->ith(i), data, 0);
3323 }
3324
3325 if (f_v) {
3326 cout << "strong_generators::Janko1 generators are:" << endl;
3327 gens->print_quick(cout);
3328 }
3329
3330
3331
3332 strong_generators *Strong_gens2;
3333
3334 if (f_v) {
3335 cout << "strong_generators::Janko1 before "
3336 "generators_to_strong_generators" << endl;
3337 }
3339 TRUE /* f_target_go */, target_go,
3340 gens, Strong_gens2,
3341 0 /* verbose_level */);
3342
3343 if (f_v) {
3344 cout << "strong_generators::Janko1 after "
3345 "generators_to_strong_generators" << endl;
3346 }
3347
3348 init_copy(Strong_gens2, 0 /* verbose_level */);
3349
3350 FREE_OBJECT(Strong_gens2);
3352
3353 if (f_v) {
3354 cout << "strong_generators::Janko1 done" << endl;
3355 }
3356}
3357
3359 int nb_pairs, int &degree, int verbose_level)
3360{
3361 int f_v = (verbose_level >= 1);
3362 int nb_perms;
3363 int *perms;
3366
3367 if (f_v) {
3368 cout << "strong_generators::Hall_reflection" << endl;
3369 }
3370
3371
3372 if (f_v) {
3373 cout << "strong_generators::Hall_reflection "
3374 "before generators_Hall_reflection" << endl;
3375 }
3376
3377 GG.generators_Hall_reflection(nb_pairs,
3378 nb_perms, perms, degree,
3379 verbose_level);
3380
3381
3382
3383
3384 if (f_v) {
3385 cout << "strong_generators::Hall_reflection "
3386 "after generators_Hall_reflection" << endl;
3387 }
3388
3389
3391 gens->init(A, verbose_level - 2);
3392
3393 int i;
3394
3395 gens->allocate(nb_perms, verbose_level - 2);
3396 for (i = 0; i < nb_perms; i++) {
3397 A->make_element(gens->ith(i), perms + i * degree, 0);
3398 }
3399
3400 if (f_v) {
3401 cout << "strong_generators::Hall_reflection "
3402 "generators are:" << endl;
3403 gens->print_quick(cout);
3404 }
3405
3406
3407
3409
3410
3411 target_go.create(2, __FILE__, __LINE__);
3412
3413
3414 if (f_v) {
3415 cout << "strong_generators::Hall_reflection "
3416 "target_go=" << target_go << endl;
3417 }
3418
3419 if (f_v) {
3420 cout << "strong_generators::Hall_reflection "
3421 "before A->init_permutation_group" << endl;
3422 }
3424 int f_no_base = FALSE;
3425
3426 A->init_permutation_group(degree, f_no_base, verbose_level);
3427
3429
3430 if (f_v) {
3431 cout << "strong_generators::Hall_reflection "
3432 "before generators_to_strong_generators" << endl;
3433 }
3434
3436 TRUE /* f_target_go */, target_go,
3437 gens, SG, verbose_level - 3);
3438
3439 if (f_v) {
3440 cout << "strong_generators::Hall_reflection "
3441 "after generators_to_strong_generators" << endl;
3442 }
3443
3444 init_copy(SG, 0);
3445
3446
3447 FREE_OBJECT(SG);
3449
3450 if (f_v) {
3451 cout << "strong_generators::Hall_reflection done" << endl;
3452 }
3453}
3454
3456 int nb_pairs, int &degree, int verbose_level)
3457{
3458 int f_v = (verbose_level >= 1);
3459 int nb_perms;
3460 int *perms;
3463
3464 if (f_v) {
3465 cout << "strong_generators::normalizer_of_a_Hall_reflection" << endl;
3466 }
3467
3468
3469 if (f_v) {
3470 cout << "strong_generators::normalizer_of_a_Hall_reflection before "
3471 "generators_Hall_reflection_normalizer_group" << endl;
3472 }
3473
3475 nb_perms, perms, degree,
3476 verbose_level);
3477
3478
3479
3480
3481 if (f_v) {
3482 cout << "strong_generators::normalizer_of_a_Hall_reflection "
3483 "after generators_Hall_reflection_normalizer_group" << endl;
3484 }
3485
3486
3488 gens->init(A, verbose_level - 2);
3489
3490 int i;
3491
3492 gens->allocate(nb_perms, verbose_level - 2);
3493 for (i = 0; i < nb_perms; i++) {
3494 A->make_element(gens->ith(i), perms + i * degree, 0);
3495 }
3496
3497 if (f_v) {
3498 cout << "strong_generators::normalizer_of_a_Hall_reflection "
3499 "generators are:" << endl;
3500 gens->print_quick(cout);
3501 }
3502
3503
3504
3505 int *factors;
3506 int nb_factors;
3508
3509
3511 factors, nb_factors);
3512
3513 target_go.create_product(nb_factors, factors);
3514 FREE_int(factors);
3515
3516
3517 if (f_v) {
3518 cout << "strong_generators::normalizer_of_a_Hall_reflection "
3519 "target_go=" << target_go << endl;
3520 }
3521
3522 if (f_v) {
3523 cout << "strong_generators::normalizer_of_a_Hall_reflection "
3524 "before A->init_permutation_group" << endl;
3525 }
3527 int f_no_base = FALSE;
3528
3529 A->init_symmetric_group(degree, f_no_base, verbose_level);
3530 //A->init_permutation_group(degree, verbose_level);
3531
3533
3534 if (f_v) {
3535 cout << "strong_generators::normalizer_of_a_Hall_reflection "
3536 "before generators_to_strong_generators" << endl;
3537 }
3538
3540 TRUE /* f_target_go */, target_go,
3541 gens, SG, verbose_level - 3);
3542
3543 if (f_v) {
3544 cout << "strong_generators::normalizer_of_a_Hall_reflection "
3545 "after generators_to_strong_generators" << endl;
3546 }
3547
3548 init_copy(SG, 0);
3549
3550
3551 FREE_OBJECT(SG);
3553
3554 if (f_v) {
3555 cout << "strong_generators::normalizer_of_a_Hall_reflection done" << endl;
3556 }
3557}
3558
3560 strong_generators *SG_hyperplane,
3561 geometry::projective_space *P, int line1, int line2,
3562 int verbose_level)
3563{
3564 int f_v = (verbose_level >= 1);
3566 int A4[17]; // one more in case of semilinear maps
3567
3568 if (f_v) {
3569 cout << "strong_generators::hyperplane_lifting_with_two_lines_fixed" << endl;
3570 }
3571
3572
3573
3575 gens->init(A, verbose_level - 2);
3576
3577 int i;
3578 int f_semilinear = FALSE;
3579 int frobenius = 0;
3581
3582 f_semilinear = A->is_semilinear_matrix_group();
3583 if (f_v) {
3584 cout << "strong_generators::hyperplane_lifting_with_two_lines_fixed "
3585 "f_semilinear = " << f_semilinear << endl;
3586 cout << "generators SG_hyperplane:" << endl;
3587 SG_hyperplane->print_generators(cout);
3588 }
3589
3590 gens->allocate(SG_hyperplane->gens->len, verbose_level - 2);
3591 for (i = 0; i < SG_hyperplane->gens->len; i++) {
3592 if (f_v) {
3593 cout << "strong_generators::hyperplane_lifting_with_two_lines_fixed "
3594 "lifting generator "
3595 << i << " / " << SG_hyperplane->gens->len << endl;
3596 }
3597 frobenius = SG_hyperplane->gens->ith(i)[9];
3598 if (f_v) {
3599 if (f_semilinear) {
3600 cout << "strong_generators::hyperplane_lifting_with_two_lines_fixed "
3601 " frobenius = " << frobenius << endl;
3602 }
3603 }
3604
3605 if (f_v) {
3606 cout << "strong_generators::hyperplane_lifting_with_two_lines_fixed "
3607 "lifting generator "
3608 << i << " / " << SG_hyperplane->gens->len
3609 << " before Gg.hyperplane_lifting_with_two_lines_fixed" << endl;
3610 }
3612 SG_hyperplane->gens->ith(i),
3613 f_semilinear, frobenius,
3614 line1, line2,
3615 A4,
3616 verbose_level);
3617 // in case of semilinear maps,
3618 // A4[16] is set in lifted_action_on_hyperplane_W0_fixing_two_lines
3619
3620 if (f_v) {
3621 cout << "strong_generators::hyperplane_lifting_with_two_lines_fixed "
3622 "lifting generator "
3623 << i << " / " << SG_hyperplane->gens->len
3624 << " after Gg.hyperplane_lifting_with_two_lines_fixed" << endl;
3625 }
3626 A->make_element(gens->ith(i), A4, 0);
3627 if (f_v) {
3628 cout << "strong_generators::hyperplane_lifting_with_two_lines_fixed "
3629 "generator "
3630 << i << " / " << SG_hyperplane->gens->len
3631 << " lifts to " << endl;
3632 A->element_print(gens->ith(i), cout);
3633 }
3634 }
3635
3636 if (f_v) {
3637 cout << "strong_generators::hyperplane_lifting_with_two_lines_fixed "
3638 "generators are:" << endl;
3639 gens->print(cout);
3640 }
3641
3642
3643
3645
3646
3647 SG_hyperplane->group_order(target_go);
3648
3649
3650 if (f_v) {
3651 cout << "strong_generators::hyperplane_lifting_with_two_lines_fixed "
3652 "target_go=" << target_go << endl;
3653 }
3654
3655
3656 if (f_v) {
3657 cout << "strong_generators::hyperplane_lifting_with_two_lines_fixed "
3658 "before generators_to_strong_generators" << endl;
3659 }
3660
3662
3664 TRUE /* f_target_go */, target_go,
3665 gens, SG, verbose_level - 3);
3666
3667 if (f_v) {
3668 cout << "strong_generators::hyperplane_lifting_with_two_lines_fixed "
3669 "after generators_to_strong_generators" << endl;
3670 }
3671
3672 init_copy(SG, 0);
3673
3674
3675 FREE_OBJECT(SG);
3677
3678 if (f_v) {
3679 cout << "strong_generators::hyperplane_lifting_with_two_lines_fixed done" << endl;
3680 }
3681}
3682
3684 actions::action *A_detached,
3685 strong_generators *SG_original,
3687 int verbose_level)
3688{
3689 int f_v = (verbose_level >= 1);
3691
3692 if (f_v) {
3693 cout << "strong_generators::exterior_square" << endl;
3694 }
3695
3696
3697
3699 gens->init(A_detached, verbose_level - 2);
3700
3701 int i, n, n2;
3702 int f_semilinear = FALSE;
3703 int frobenius = 0;
3704 int *An2;
3706
3707 n = SG_original->A->matrix_group_dimension();
3709 if (f_v) {
3710 cout << "strong_generators::exterior_square n = " << n << endl;
3711 }
3712
3714
3715 n2 = Combi.binomial2(n);
3716
3717 An2 = NEW_int(n2 * n2 + 1); // in case of semilinear
3718
3719 f_semilinear = SG_original->A->is_semilinear_matrix_group();
3720 if (f_v) {
3721 cout << "strong_generators::exterior_square "
3722 "f_semilinear = " << f_semilinear << endl;
3723 cout << "generators SG_original:" << endl;
3724 SG_original->print_generators(cout);
3725 }
3726
3727 gens->allocate(SG_original->gens->len, verbose_level - 2);
3728 for (i = 0; i < SG_original->gens->len; i++) {
3729 if (f_v) {
3730 cout << "strong_generators::exterior_square "
3731 "lifting generator "
3732 << i << " / " << SG_original->gens->len << endl;
3733 }
3734 if (f_semilinear) {
3735 frobenius = SG_original->gens->ith(i)[n * n];
3736 if (f_v) {
3737 if (f_semilinear) {
3738 cout << "strong_generators::exterior_square "
3739 " frobenius = " << frobenius << endl;
3740 }
3741 }
3742 }
3743 else {
3744 frobenius = 0;
3745 }
3746
3747 if (f_v) {
3748 cout << "strong_generators::exterior_square "
3749 "lifting generator "
3750 << i << " / " << SG_original->gens->len
3751 << " before P->exterior_square" << endl;
3752 }
3753
3754 Int_vec_zero(An2, n2 * n2 + 1);
3755 F->Linear_algebra->exterior_square(SG_original->gens->ith(i), An2, n, verbose_level - 2);
3756
3757 An2[n2 * n2] = frobenius;
3758
3759 if (f_v) {
3760 cout << "strong_generators::exterior_square "
3761 "lifting generator "
3762 << i << " / " << SG_original->gens->len
3763 << " after P->exterior_square" << endl;
3764 }
3765 A_detached->make_element(gens->ith(i), An2, 0);
3766 if (f_v) {
3767 cout << "strong_generators::exterior_square "
3768 "generator "
3769 << i << " / " << SG_original->gens->len
3770 << " lifts to " << endl;
3771 A_detached->element_print(gens->ith(i), cout);
3772 }
3773 }
3774
3775 if (f_v) {
3776 cout << "strong_generators::exterior_square "
3777 "generators are:" << endl;
3778 gens->print(cout);
3779 }
3780
3781 gens->copy(nice_gens, verbose_level);
3782
3783
3785
3786
3787 SG_original->group_order(target_go);
3788
3789
3790 if (f_v) {
3791 cout << "strong_generators::exterior_square "
3792 "target_go=" << target_go << endl;
3793 }
3794
3795
3796 if (f_v) {
3797 cout << "strong_generators::exterior_square "
3798 "before generators_to_strong_generators" << endl;
3799 }
3800
3802
3804 TRUE /* f_target_go */, target_go,
3805 gens, SG, verbose_level - 3);
3806
3807 if (f_v) {
3808 cout << "strong_generators::exterior_square "
3809 "after generators_to_strong_generators" << endl;
3810 }
3811
3812 init_copy(SG, 0);
3813
3814
3815 FREE_OBJECT(SG);
3817
3818 if (f_v) {
3819 cout << "strong_generators::exterior_square done" << endl;
3820 }
3821}
3822
3823
3825 actions::action *An,
3827 int verbose_level)
3828// Embeds all generators from Sk in GL(k,q) into GL(n,k)
3829// by repeating each matrix A twice on the diagonal
3830// to form
3831// diag(A,A).
3832// The new group is isomorphic to the old one,
3833// but has twice the dimension.
3834// This function is used in upstep
3835// to compute the stabilizer of the flag
3836// from the original generators of the centralizer.
3837{
3838 int f_v = (verbose_level >= 1);
3840 int h, l, i, j, a, n, k;
3841 int *M;
3842 int *Elt;
3844 sims *Sims;
3845
3846
3847 if (f_v) {
3848 cout << "strong_generators::diagonally_repeat" << endl;
3849 }
3851 n = An->matrix_group_dimension();
3852 M = NEW_int(n * n);
3854
3855 gens->init(An, verbose_level - 2);
3856 l = gens->len;
3857 if (f_v) {
3858 cout << "strong_generators::diagonally_repeat l=" << l << endl;
3859 }
3860 gens->allocate(l, verbose_level - 2);
3861 for (h = 0; h < l; h++) {
3862 Elt = gens->ith(h);
3863 Int_vec_zero(M, n * n);
3864 for (i = 0; i < k; i++) {
3865 for (j = 0; j < k; j++) {
3866 a = Elt[i * k + j];
3867 M[i * n + j] = a;
3868 M[(k + i) * n + k + j] = a;
3869 }
3870 }
3871 An->make_element(gens->ith(h), M, 0);
3872 }
3873 group_order(go);
3874
3875 FREE_int(M);
3876
3877 if (f_v) {
3878 cout << "strong_generators::diagonally_repeat "
3879 "before A->create_sims_from_generators_with_target_group_order" << endl;
3880 }
3881
3883 gens, go, verbose_level);
3884 if (f_v) {
3885 cout << "strong_generators::diagonally_repeat "
3886 "after A->create_sims_from_generators_with_target_group_order" << endl;
3887 }
3888
3889 if (f_v) {
3890 cout << "strong_generators::diagonally_repeat "
3891 "before Sn->init_from_sims" << endl;
3892 }
3893 Sn->init_from_sims(Sims, verbose_level - 2);
3894 if (f_v) {
3895 cout << "strong_generators::diagonally_repeat "
3896 "after Sn->init_from_sims" << endl;
3897 }
3898
3900 FREE_OBJECT(Sims);
3901
3902 if (f_v) {
3903 cout << "The old stabilizer has order " << go << endl;
3904 }
3905 if (f_v) {
3906 cout << "strong_generators::diagonally_repeat end" << endl;
3907 }
3908}
3909
3910
3911
3912}}}
3913
void init(field_theory::finite_field *F, int n, int verbose_level)
generators for various classes of groups
Definition: algebra.h:286
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_Hall_reflection(int nb_pairs, int &nb_perms, int *&perms, int &degree, int verbose_level)
void order_Hall_reflection_normalizer_factorized(int nb_pairs, int *&factors, int &nb_factors)
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 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 generators_Hall_reflection_normalizer_group(int nb_pairs, int &nb_perms, int *&perms, int &degree, int verbose_level)
void init(field_theory::finite_field *F, int n, int verbose_level)
void q_binomial_no_table(ring_theory::longinteger_object &a, int n, int k, int q, int verbose_level)
void finite_field_init(int q, int f_without_tables, int verbose_level)
a finite field as a vector space over a subfield
void init(finite_field *FQ, finite_field *Fq, int verbose_level)
void lift_matrix(int *MQ, int m, int *Mq, int verbose_level)
various functions related to geometries
Definition: geometry.h:721
void hyperplane_lifting_with_two_lines_fixed(projective_space *P, int *A3, int f_semilinear, int frobenius, long int line1, long int line2, int *A4, int verbose_level)
projective space PG(n,q) of dimension n over Fq
Definition: geometry.h:1916
provides access to pre-computed combinatorial data in encoded form
void quartic_curves_stab_gens(int q, int i, int *&data, int &nb_gens, int &data_size, std::string &stab_order_str)
void BLT_stab_gens(int q, int no, int *&data, int &nb_gens, int &data_size, std::string &stab_order_str)
void Spread_stab_gens(int q, int k, int i, int *&data, int &nb_gens, int &data_size, std::string &stab_order_str)
void cubic_surface_stab_gens(int q, int i, int *&data, int &nb_gens, int &data_size, std::string &stab_order_str)
void exterior_square(int *An, int *An2, int n, int verbose_level)
void cubic_surface_family_G13_generators(int a, int *&gens, int &nb_gens, int &data_size, int &group_order, int verbose_level)
void cubic_surface_family_F13_generators(int a, int *&gens, int &nb_gens, int &data_size, int &group_order, int verbose_level)
void cubic_surface_family_24_generators(int f_with_normalizer, int f_semilinear, int *&gens, int &nb_gens, int &data_size, int &group_order, int verbose_level)
domain to compute with objects of type longinteger
Definition: ring_theory.h:240
void integral_division_exact(longinteger_object &a, longinteger_object &b, longinteger_object &a_over_b)
void multiply_up(longinteger_object &a, int *x, int len, int verbose_level)
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 group_order_PGL(longinteger_object &result, int n, int q, int f_semilinear)
void mult_in_place(longinteger_object &a, longinteger_object &b)
void multiply_up_lint(longinteger_object &a, long int *x, int len, int verbose_level)
a class to represent arbitrary precision integers
Definition: ring_theory.h:366
void create_from_base_10_string(const char *str, int verbose_level)
void create(long int i, const char *file, int line)
domain of polynomials in one variable over a finite field
Definition: ring_theory.h:691
void get_a_primitive_polynomial(unipoly_object &m, int f, int verbose_level)
void Frobenius_matrix_by_rows(int *&Frob, unipoly_object factor_polynomial, int verbose_level)
void create_object_by_rank(unipoly_object &p, long int rk, const char *file, int line, int verbose_level)
void print_object(unipoly_object p, std::ostream &ost)
global functions related to group actions
Definition: actions.h:1015
void make_generators_stabilizer_of_two_components(action *A_PGL_n_q, action *A_PGL_k_q, int k, data_structures_groups::vector_ge *gens, int verbose_level)
a permutation group in a fixed action.
Definition: actions.h:99
void element_print_quick(void *elt, std::ostream &ost)
Definition: action_cb.cpp:353
void init_general_linear_group(int n, field_theory::finite_field *F, int f_semilinear, int f_basis, int f_init_sims, data_structures_groups::vector_ge *&nice_gens, int verbose_level)
void element_print(void *elt, std::ostream &ost)
Definition: action_cb.cpp:347
void induced_action_on_sign(groups::sims *old_G, int verbose_level)
void init_symmetric_group(int degree, int f_no_base, int verbose_level)
void print_quick(std::ostream &ost, void *elt)
Definition: action_cb.cpp:137
void induced_action_on_determinant(groups::sims *old_G, int verbose_level)
groups::strong_generators * Strong_gens
Definition: actions.h:130
void induced_action_on_Galois_group(groups::sims *old_G, int verbose_level)
void init_affine_group(int n, field_theory::finite_field *F, int f_semilinear, int f_basis, int f_init_sims, data_structures_groups::vector_ge *&nice_gens, int verbose_level)
void init_projective_group(int n, field_theory::finite_field *F, int f_semilinear, int f_basis, int f_init_sims, data_structures_groups::vector_ge *&nice_gens, int verbose_level)
void init_orthogonal_group(int epsilon, int n, field_theory::finite_field *F, int f_on_points, int f_on_lines, int f_on_points_and_lines, int f_semilinear, int f_basis, int verbose_level)
groups::sims * create_sims_from_generators_randomized(data_structures_groups::vector_ge *gens, int f_target_go, ring_theory::longinteger_object &target_go, int verbose_level)
field_theory::finite_field * matrix_group_finite_field()
Definition: action.cpp:2883
void element_power_int_in_place(int *Elt, int n, int verbose_level)
Definition: action.cpp:2000
void make_element(int *Elt, int *data, int verbose_level)
Definition: action.cpp:1875
groups::sims * create_sims_from_generators_without_target_group_order(data_structures_groups::vector_ge *gens, int verbose_level)
void element_move(void *a, void *b, int verbose_level)
Definition: action_cb.cpp:335
groups::sims * create_sims_from_single_generator_without_target_group_order(int *Elt, int verbose_level)
void init_permutation_group(int degree, int f_no_base, int verbose_level)
void group_order(ring_theory::longinteger_object &go)
Definition: action.cpp:2223
groups::matrix_group * get_matrix_group()
Definition: action.cpp:2986
void generators_to_strong_generators(int f_target_go, ring_theory::longinteger_object &target_go, data_structures_groups::vector_ge *gens, groups::strong_generators *&Strong_gens, int verbose_level)
groups::sims * create_sims_for_centralizer_of_matrix(int *Mtx, int verbose_level)
groups::sims * create_sims_from_generators_with_target_group_order(data_structures_groups::vector_ge *gens, ring_theory::longinteger_object &target_go, int verbose_level)
void init_wreath_product_group(int nb_factors, int n, field_theory::finite_field *F, data_structures_groups::vector_ge *&nice_gens, int verbose_level)
void copy(vector_ge *&vector_copy, int verbose_level)
Definition: vector_ge.cpp:72
void init_from_data(actions::action *A, int *data, int nb_elements, int elt_size, int verbose_level)
Definition: vector_ge.cpp:175
void init(actions::action *A, int verbose_level)
Definition: vector_ge.cpp:55
description of a linear group from the command line
Definition: groups.h:158
a matrix group over a finite field in projective, vector space or affine action
Definition: groups.h:318
a permutation group represented via a stabilizer chain
Definition: groups.h:1273
void group_order(ring_theory::longinteger_object &go)
Definition: sims.cpp:951
data_structures_groups::vector_ge gens
Definition: groups.h:1280
void sylow_subgroup(int p, sims *P, int verbose_level)
a strong generating set for a permutation group with respect to a fixed action
Definition: groups.h:1703
void init_trivial_group(actions::action *A, int verbose_level)
void init_copy(strong_generators *S, int verbose_level)
void generators_for_the_monomial_group(actions::action *A, matrix_group *Mtx, int verbose_level)
void Janko1(actions::action *A, field_theory::finite_field *F, int verbose_level)
void init_linear_group_from_scratch(actions::action *&A, field_theory::finite_field *F, int n, linear_group_description *Descr, data_structures_groups::vector_ge *&nice_gens, int verbose_level)
void init_centralizer_of_matrix_general_linear(actions::action *A_projective, actions::action *A_general_linear, int *Mtx, int verbose_level)
void init_from_data(actions::action *A, int *data, int nb_elements, int elt_size, int *transversal_length, data_structures_groups::vector_ge *&nice_gens, int verbose_level)
void generators_for_parabolic_subgroup(actions::action *A_PGL_n_q, matrix_group *Mtx, int k, int verbose_level)
void stabilizer_of_F13_surface(actions::action *A, field_theory::finite_field *F, int a, data_structures_groups::vector_ge *&nice_gens, int verbose_level)
void diagonally_repeat(actions::action *An, strong_generators *Sn, int verbose_level)
void stabilizer_of_cubic_surface_from_catalogue(actions::action *A, field_theory::finite_field *F, int iso, int verbose_level)
void exterior_square(actions::action *A_detached, strong_generators *SG_original, data_structures_groups::vector_ge *&nice_gens, int verbose_level)
void normalizer_of_a_Hall_reflection(int nb_pairs, int &degree, int verbose_level)
void init_single_with_target_go(actions::action *A, int *Elt, int target_go, int verbose_level)
void init_single(actions::action *A, int *Elt, int verbose_level)
void Hall_reflection(int nb_pairs, int &degree, int verbose_level)
void generators_for_stabilizer_of_three_collinear_points_in_PGL4(actions::action *A_PGL_4_q, matrix_group *Mtx, int verbose_level)
void generators_for_the_orthogonal_group(actions::action *A, field_theory::finite_field *F, int n, int epsilon, int f_semilinear, int verbose_level)
void stabilizer_of_quartic_curve_from_catalogue(actions::action *A, field_theory::finite_field *F, int iso, int verbose_level)
void stabilizer_of_G13_surface(actions::action *A, field_theory::finite_field *F, int a, data_structures_groups::vector_ge *&nice_gens, int verbose_level)
void generators_for_the_stabilizer_of_two_components(actions::action *A_PGL_n_q, matrix_group *Mtx, int verbose_level)
void generators_for_the_null_polarity_group(actions::action *A, matrix_group *Mtx, int verbose_level)
void generators_for_the_identity_subgroup(actions::action *A_linear, matrix_group *Mtx, int verbose_level)
void generators_for_the_singer_cycle(actions::action *A, matrix_group *Mtx, int power_of_singer, data_structures_groups::vector_ge *&nice_gens, int verbose_level)
void stabilizer_of_spread_from_catalogue(actions::action *A, int q, int k, int iso, int verbose_level)
void generators_for_the_diagonal_group(actions::action *A, matrix_group *Mtx, int verbose_level)
void hyperplane_lifting_with_two_lines_fixed(strong_generators *SG_hyperplane, geometry::projective_space *P, int line1, int line2, int verbose_level)
void init_centralizer_of_matrix(actions::action *A, int *Mtx, int verbose_level)
void stabilizer_of_pencil_of_conics(actions::action *A, field_theory::finite_field *F, int verbose_level)
void generators_for_the_borel_subgroup_lower(actions::action *A_linear, matrix_group *Mtx, int verbose_level)
void init_from_sims(groups::sims *S, int verbose_level)
void field_reduction(actions::action *Aq, int n, int s, field_theory::finite_field *Fq, int verbose_level)
void regulus_stabilizer(actions::action *A_PGL_n_q, matrix_group *Mtx, int verbose_level)
void generators_for_stabilizer_of_triangle_in_PGL4(actions::action *A_PGL_4_q, matrix_group *Mtx, int verbose_level)
void generators_for_translation_plane_in_andre_model(actions::action *A_PGL_n1_q, actions::action *A_PGL_n_q, matrix_group *Mtx_n1, matrix_group *Mtx_n, data_structures_groups::vector_ge *spread_stab_gens, ring_theory::longinteger_object &spread_stab_go, int verbose_level)
void generators_for_the_singer_cycle_and_the_Frobenius(actions::action *A, matrix_group *Mtx, int power_of_singer, data_structures_groups::vector_ge *&nice_gens, int verbose_level)
void generators_for_the_borel_subgroup_upper(actions::action *A_linear, matrix_group *Mtx, int verbose_level)
void stabilizer_of_Eckardt_surface(actions::action *A, field_theory::finite_field *F, int f_with_normalizer, int f_semilinear, data_structures_groups::vector_ge *&nice_gens, int verbose_level)
void generators_for_symplectic_group(actions::action *A, matrix_group *Mtx, int verbose_level)
data_structures_groups::vector_ge * gens
Definition: groups.h:1708
void BLT_set_from_catalogue_stabilizer(actions::action *A, field_theory::finite_field *F, int iso, int verbose_level)
void group_order(ring_theory::longinteger_object &go)
#define MINIMUM(x, y)
Definition: foundations.h:216
#define FREE_int(p)
Definition: foundations.h:640
#define Int_vec_zero(A, B)
Definition: foundations.h:713
#define NEW_OBJECT(type)
Definition: foundations.h:638
#define Lint_vec_print(A, B, C)
Definition: foundations.h:686
#define FREE_OBJECT(p)
Definition: foundations.h:651
#define NEW_int(n)
Definition: foundations.h:625
#define Int_matrix_print(A, B, C)
Definition: foundations.h:707
#define TRUE
Definition: foundations.h:231
#define FALSE
Definition: foundations.h:234
#define ODD(x)
Definition: foundations.h:222
#define Int_vec_copy(A, B, C)
Definition: foundations.h:693
#define FREE_lint(p)
Definition: foundations.h:642
#define NEW_lint(n)
Definition: foundations.h:628
#define Int_vec_print(A, B, C)
Definition: foundations.h:685
the orbiter library for the classification of combinatorial objects