Orbiter 2022
Combinatorial Objects
matrix_group.cpp
Go to the documentation of this file.
1// matrix_group.cpp
2//
3// Anton Betten
4//
5// started: October 23, 2002
6// last change: November 11, 2005
7
8
9
10
12#include "group_actions.h"
13
14
15using namespace std;
16
17
18namespace orbiter {
19namespace layer3_group_actions {
20namespace groups {
21
23{
27 n = 0;
28 degree = 0;
29
33 bits_per_elt = 0;
35 char_per_elt = 0;
36 elt_size_int = 0;
40
41 //std::string label;
42 //std::string label_tex;
43
45 GFq = NULL;
46 data = NULL;
47 C = NULL;
48
49 Elt1 = NULL;
50 Elt2 = NULL;
51 Elt3 = NULL;
52 Elt4 = NULL;
53 Elt5 = NULL;
54 tmp_M = NULL;
55 base_cols = NULL;
56 v1 = NULL;
57 v2 = NULL;
58 v3 = NULL;
59 elt1 = NULL;
60 elt2 = NULL;
61 elt3 = NULL;
62 Elts = NULL;
63}
64
65
66
67
69{
70 int verbose_level = 0;
71 int f_v = (verbose_level >= 1);
72
73 if (f_v) {
74 cout << "matrix_group::~matrix_group calling free_data" << endl;
75 }
76 free_data(verbose_level);
77 if (f_v) {
78 cout << "matrix_group::~matrix_group "
79 "destroying Elts" << endl;
80 }
81 if (Elts) {
83 }
84 if (f_v) {
85 cout << "matrix_group::~matrix_group "
86 "destroying GFq" << endl;
87 }
90 }
91 if (C) {
93 }
94 if (f_v) {
95 cout << "matrix_group::~matrix_group done" << endl;
96 }
97}
98
100 field_theory::finite_field *F, int f_semilinear,
102 int verbose_level)
103{
104 int f_v = (verbose_level >= 1);
105 int f_vv = (verbose_level >= 2);
106 int page_length_log = PAGE_LENGTH_LOG;
108
109 if (f_v) {
110 cout << "matrix_group::init_projective_group" << endl;
111 cout << "n=" << n << endl;
112 cout << "q=" << F->q << endl;
113 cout << "f_semilinear=" << f_semilinear << endl;
114 cout << "verbose_level=" << verbose_level << endl;
115 }
125 if (f_semilinear) {
127 }
129 degree = Gg.nb_PG_elements(n - 1, F->q);
130
131 char str1[1000];
132 char str2[1000];
133
134 if (f_semilinear) {
135 sprintf(str1, "PGGL_%d_%d", n, F->q);
136 sprintf(str2, "{\\rm P}\\Gamma {\\rm L}(%d,%d)", n, F->q);
137 }
138 else {
139 sprintf(str1, "PGL_%d_%d", n, F->q);
140 sprintf(str2, "{\\rm PGL}(%d,%d)", n, F->q);
141 }
142 label.assign(str1);
143 label_tex.assign(str2);
144
145
146 if (f_v) {
147 cout << "matrix_group::init_projective_group "
148 "before compute_elt_size" << endl;
149 }
150 compute_elt_size(0 /*verbose_level - 1*/);
151 if (f_v) {
152 cout << "matrix_group::init_projective_group "
153 "after compute_elt_size" << endl;
154 }
155
156 if (f_v) {
157 cout << "matrix_group::init_projective_group "
158 "elt_size_int = " << elt_size_int << endl;
159 }
160
161 if (f_v) {
162 cout << "matrix_group::init_projective_group "
163 "before allocate_data" << endl;
164 }
165 allocate_data(0/*verbose_level*/);
166 if (f_v) {
167 cout << "matrix_group::init_projective_group "
168 "after allocate_data" << endl;
169 }
170
171 if (f_v) {
172 cout << "matrix_group::init_projective_group "
173 "before setup_page_storage" << endl;
174 }
175 setup_page_storage(page_length_log, 0 /*verbose_level - 1*/);
176 if (f_v) {
177 cout << "matrix_group::init_projective_group "
178 "after setup_page_storage" << endl;
179 }
180
181
182
183
184 if (f_vv) {
185 cout << "matrix_group::init_projective_group "
186 "before init_base" << endl;
187 }
188 init_base(A, 0 /*verbose_level - 1*/);
189 if (f_vv) {
190 cout << "matrix_group::init_projective_group "
191 "after init_base" << endl;
192 }
193
194
195 //init_gl_classes(verbose_level - 1);
196
197
198 if (f_v) {
199 cout << "matrix_group::init_projective_group "
200 "finished" << endl;
201 }
202}
203
205 field_theory::finite_field *F, int f_semilinear,
207 int verbose_level)
208{
209 int f_v = (verbose_level >= 1);
210 int f_vv = (verbose_level >= 2);
211 int page_length_log = PAGE_LENGTH_LOG;
213
214 if (f_vv) {
215 cout << "matrix_group::init_affine_group" << endl;
216 }
226 degree = Gg.nb_AG_elements(n, F->q);
227 make_element_size = n * n + n;
228 if (f_semilinear) {
230 }
231
232 char str1[1000];
233 char str2[1000];
234
235 if (f_semilinear) {
236 sprintf(str1, "AGGL_%d_%d", n, F->q);
237 sprintf(str2, "{\\rm A}\\Gamma {\\rm L}(%d,%d)", n, F->q);
238 }
239 else {
240 sprintf(str1, "AGL_%d_%d", n, F->q);
241 sprintf(str2, "{\\rm AGL}(%d,%d)", n, F->q);
242 }
243 label.assign(str1);
244 label_tex.assign(str2);
245
246
247 compute_elt_size(0 /*verbose_level - 1*/);
248
249 if (f_v) {
250 cout << "matrix_group::init_affine_group "
251 "elt_size_int = " << elt_size_int << endl;
252 }
253
254 allocate_data(verbose_level);
255
256 setup_page_storage(page_length_log, 0 /*verbose_level - 1*/);
257
258
259
260
261 if (f_vv) {
262 cout << "matrix_group::init_affine_group "
263 "before init_base" << endl;
264 }
265 init_base(A, 0 /*verbose_level - 1*/);
266 if (f_vv) {
267 cout << "matrix_group::init_affine_group "
268 "after init_base" << endl;
269 }
270
271
272 //init_gl_classes(verbose_level - 1);
273
274 if (f_v) {
275 cout << "matrix_group::init_affine_group "
276 "finished" << endl;
277 }
278}
279
281 field_theory::finite_field *F, int f_semilinear,
283 int verbose_level)
284{
285 int f_v = (verbose_level >= 1);
286 int f_vv = (verbose_level >= 2);
287 int page_length_log = PAGE_LENGTH_LOG;
289
290 if (f_vv) {
291 cout << "matrix_group::init_general_linear_group" << endl;
292 }
302 degree = Gg.nb_AG_elements(n, F->q);
304 if (f_semilinear) {
306 }
307
308 char str1[1000];
309 char str2[1000];
310
311 if (f_semilinear) {
312 sprintf(str1, "GGL_%d_%d", n, F->q);
313 sprintf(str2, "\\Gamma {\\rm L}(%d,%d)", n, F->q);
314 }
315 else {
316 sprintf(str1, "GL_%d_%d", n, F->q);
317 sprintf(str2, "{\\rm GL}(%d,%d)", n, F->q);
318 }
319 label.assign(str1);
320 label_tex.assign(str2);
321
322
323 compute_elt_size(0 /*verbose_level - 1*/);
324
325 if (f_v) {
326 cout << "matrix_group::init_general_linear_group "
327 "elt_size_int = " << elt_size_int << endl;
328 }
329
330 allocate_data(0 /*verbose_level*/);
331
332 setup_page_storage(page_length_log, verbose_level - 1);
333
334
335
336
337 if (f_vv) {
338 cout << "matrix_group::init_general_linear_group "
339 "before init_base" << endl;
340 }
341 init_base(A, 0 /*verbose_level - 1*/);
342 if (f_vv) {
343 cout << "matrix_group::init_general_linear_group "
344 "after init_base" << endl;
345 }
346
347
348 //init_gl_classes(verbose_level - 1);
349
350 if (f_v) {
351 cout << "matrix_group::init_general_linear_group "
352 "done" << endl;
353 }
354}
355
356void matrix_group::allocate_data(int verbose_level)
357{
358 int f_v = (verbose_level >= 1);
359
360 if (f_v) {
361 cout << "matrix_group::allocate_data" << endl;
362 }
363 if (elt_size_int == 0) {
364 cout << "matrix_group::allocate_data elt_size_int == 0" << endl;
365 exit(1);
366 }
367
373 tmp_M = NEW_int(n * n);
374 v1 = NEW_int(2 * n);
375 v2 = NEW_int(2 * n);
376 v3 = NEW_int(2 * n);
381
382 if (f_v) {
383 cout << "matrix_group::allocate_data done" << endl;
384 }
385}
386
387void matrix_group::free_data(int verbose_level)
388{
389 int f_v = (verbose_level >= 1);
390
391 if (f_v) {
392 cout << "matrix_group::free_data" << endl;
393 }
394 if (Elt1) {
395 if (f_v) {
396 cout << "matrix_group::free_data freeing Elt1" << endl;
397 }
398 FREE_int(Elt1);
399 }
400 if (Elt2) {
401 if (f_v) {
402 cout << "matrix_group::free_data freeing Elt2" << endl;
403 }
404 FREE_int(Elt2);
405 }
406 if (Elt3) {
407 if (f_v) {
408 cout << "matrix_group::free_data freeing Elt3" << endl;
409 }
410 FREE_int(Elt3);
411 }
412 if (Elt4) {
413 if (f_v) {
414 cout << "matrix_group::free_data freeing Elt4" << endl;
415 }
416 FREE_int(Elt4);
417 }
418 if (Elt5) {
419 if (f_v) {
420 cout << "matrix_group::free_data freeing Elt5" << endl;
421 }
422 FREE_int(Elt5);
423 }
424 if (tmp_M) {
425 if (f_v) {
426 cout << "matrix_group::free_data freeing tmp_M" << endl;
427 }
429 }
430 if (f_v) {
431 cout << "matrix_group::free_data destroying v1-3" << endl;
432 }
433 if (v1) {
434 FREE_int(v1);
435 }
436 if (v2) {
437 FREE_int(v2);
438 }
439 if (v3) {
440 FREE_int(v3);
441 }
442 if (f_v) {
443 cout << "matrix_group::free_data "
444 "destroying elt1-3" << endl;
445 }
446 if (elt1) {
448 }
449 if (elt2) {
451 }
452 if (elt3) {
454 }
455 if (f_v) {
456 cout << "matrix_group::free_data "
457 "destroying base_cols" << endl;
458 }
459 if (base_cols) {
461 }
462
463 if (f_v) {
464 cout << "matrix_group::free_data done" << endl;
465 }
466}
467
469 int page_length_log, int verbose_level)
470{
471 int f_v = (verbose_level >= 1);
472 int f_vv = (verbose_level >= 2);
473 int hdl;
474
475 if (f_v) {
476 cout << "matrix_group::setup_page_storage" << endl;
477 }
478 if (Elts) {
479 cout << "matrix_group::setup_page_storage "
480 "Warning: Elts != NULL" << endl;
482 }
484
485 if (f_vv) {
486 cout << "matrix_group::setup_page_storage "
487 "calling Elts->init()" << endl;
488 }
489 Elts->init(char_per_elt /* entry_size */,
490 page_length_log, verbose_level - 2);
491 //Elts->add_elt_print_function(elt_print, (void *) this);
492
493
494 if (f_vv) {
495 cout << "matrix_group::setup_page_storage before GL_one" << endl;
496 }
497 GL_one(Elt1);
498 GL_pack(Elt1, elt1);
499 if (f_vv) {
500 cout << "matrix_group::setup_page_storage before Elts->store" << endl;
501 }
502 hdl = Elts->store(elt1);
503 if (f_vv) {
504 cout << "identity element stored, hdl = " << hdl << endl;
505 }
506 if (f_v) {
507 cout << "matrix_group::setup_page_storage done" << endl;
508 }
509}
510
511
512void matrix_group::compute_elt_size(int verbose_level)
513{
514 int f_v = (verbose_level >= 1);
515 int f_vv = (verbose_level >= 2);
517
518 if (f_v) {
519 cout << "matrix_group::compute_elt_size" << endl;
520 }
521 if (f_semilinear && GFq->e > 1) {
523 }
524 else {
526 }
527 bits_per_digit = NT.int_log2(GFq->q - 1);
528 if (f_projective) {
530 }
531 else if (f_affine) {
533 }
534 else if (f_general_linear) {
536 }
537 else {
538 cout << "matrix_group::compute_elt_size group type unknown" << endl;
539 exit(1);
540 }
542 if (bits_per_elt & 7) {
543 char_per_elt++;
544 }
545 if (f_projective) {
546 elt_size_int = n * n;
547 }
548 else if (f_affine) {
549 elt_size_int = n * n + n;
550 }
551 else if (f_general_linear) {
552 elt_size_int = n * n;
553 }
554 else {
555 cout << "matrix_group::compute_elt_size group type unknown" << endl;
556 exit(1);
557 }
558 if (f_semilinear) {
559 elt_size_int++;
560 }
561
563 elt_size_int *= 2;
564
565 if (f_vv) {
566 cout << "bits_per_digit = " << bits_per_digit << endl;
567 cout << "bits_extension_degree = " << bits_extension_degree << endl;
568 cout << "bits_per_elt = " << bits_per_elt << endl;
569 cout << "char_per_elt = " << char_per_elt << endl;
570 cout << "elt_size_int_half = " << elt_size_int_half << endl;
571 cout << "elt_size_int = " << elt_size_int << endl;
572 }
573 if (f_v) {
574 cout << "matrix_group::compute_elt_size done" << endl;
575 }
576}
577
578void matrix_group::init_base(actions::action *A, int verbose_level)
579{
580 int f_v = (verbose_level >= 1);
581 int f_vv = (verbose_level >= 2);
582
583 if (f_v) {
584 cout << "matrix_group::init_base" << endl;
585 }
586 if (f_projective) {
587 if (f_vv) {
588 cout << "matrix_group::init_base "
589 "before init_base_projective" << endl;
590 }
591 init_base_projective(A, verbose_level - 2);
592 if (f_vv) {
593 cout << "matrix_group::init_base "
594 "after init_base_projective" << endl;
595 }
596 }
597 else if (f_affine) {
598 if (f_vv) {
599 cout << "matrix_group::init_base "
600 "before init_base_affine" << endl;
601 }
602 init_base_affine(A, verbose_level - 2);
603 if (f_vv) {
604 cout << "matrix_group::init_base "
605 "after init_base_affine" << endl;
606 }
607 }
608 else if (f_general_linear) {
609 if (f_vv) {
610 cout << "matrix_group::init_base "
611 "before init_base_general_linear" << endl;
612 }
613 init_base_general_linear(A, verbose_level - 2);
614 if (f_vv) {
615 cout << "matrix_group::init_base "
616 "after init_base_general_linear" << endl;
617 }
618 }
619 else {
620 cout << "matrix_group::init_base "
621 "group type unknown" << endl;
622 exit(1);
623 }
624 if (f_v) {
625 cout << "matrix_group::init_base done" << endl;
626 }
627}
628
630 actions::action *A, int verbose_level)
631// initializes A->degree, A->Stabilizer_chain
632{
633 int f_v = (verbose_level >= 1);
634 int f_vv = (verbose_level >= 2);
635 int q = GFq->q;
637 int base_len;
638
639 if (f_v) {
640 cout << "matrix_group::init_base_projective "
641 "verbose_level=" << verbose_level << endl;
642 }
643 A->degree = degree;
644 if (f_vv) {
645 cout << "matrix_group::init_base_projective "
646 "degree=" << degree << endl;
647 }
648 if (f_vv) {
649 cout << "matrix_group::init_base_projective "
650 "before GG.matrix_group_base_len_projective_group" << endl;
651 }
653 n, q, f_semilinear, verbose_level);
654 if (f_vv) {
655 cout << "matrix_group::init_base_projective "
656 "after GG.matrix_group_base_len_projective_group" << endl;
657 }
658
660 A->Stabilizer_chain->allocate_base_data(A, base_len, verbose_level);
661 //A->Stabilizer_chain->base_len = base_len;
662 //A->allocate_base_data(A->base_len);
663 if (f_vv) {
664 cout << "matrix_group::init_base_projective "
665 "A->base_len()=" << A->base_len() << endl;
666 }
667
668 if (f_v) {
669 cout << "matrix_group::init_base_projective "
670 "before init_projective_matrix_group" << endl;
671 }
672
673#if 1
675 GFq, n, f_semilinear, A->degree,
676 verbose_level);
677#else
678 GFq->projective_matrix_group_base_and_orbits(n,
680 A->Stabilizer_chain->base_len, A->degree,
681 A->Stabilizer_chain->base, A->Stabilizer_chain->transversal_length,
682 A->Stabilizer_chain->orbit, A->Stabilizer_chain->orbit_inv,
683 verbose_level - 1);
684#endif
685 if (f_v) {
686 cout << "matrix_group::init_base_projective "
687 "after init_projective_matrix_group" << endl;
688 }
689
690 if (f_v) {
691 cout << "matrix_group::init_base_projective: finished" << endl;
692 }
693}
694
696// initializes A->degree, A->Stabilizer_chain
697{
698 int f_v = (verbose_level >= 1);
699 int f_vv = (verbose_level >= 1);
700 int q = GFq->q;
702 int base_len;
703
704 if (f_v) {
705 cout << "matrix_group::init_base_affine "
706 "verbose_level=" << verbose_level << endl;
707 }
708 A->degree = degree;
709 if (f_vv) {
710 cout << "matrix_group::init_base_affine degree="
711 << degree << endl;
712 }
714 n, q, f_semilinear, verbose_level - 1);
715 if (f_vv) {
716 cout << "matrix_group::init_base_affine base_len="
717 << base_len << endl;
718 }
719
721 A->Stabilizer_chain->allocate_base_data(A, base_len, verbose_level);
722 //A->Stabilizer_chain->base_len = base_len;
723 //A->allocate_base_data(A->base_len);
724
725 if (f_v) {
726 cout << "matrix_group::init_base_affine before "
727 "init_affine_matrix_group" << endl;
728 }
729#if 1
731 GFq, n, f_semilinear, A->degree,
732 verbose_level);
733#else
734 GFq->affine_matrix_group_base_and_transversal_length(n,
736 A->Stabilizer_chain->base_len, A->degree,
737 A->Stabilizer_chain->base, A->Stabilizer_chain->transversal_length,
738 verbose_level - 1);
739#endif
740 if (f_v) {
741 cout << "matrix_group::init_base_affine after "
742 "init_affine_matrix_group" << endl;
743 }
744
745 if (f_v) {
746 cout << "matrix_group::init_base_affine: finished" << endl;
747 }
748}
749
751 actions::action *A, int verbose_level)
752// initializes A->degree, A->Stabilizer_chain
753{
754 int f_v = (verbose_level >= 1);
755 int f_vv = (verbose_level >= 1);
756 int q = GFq->q;
758 int base_len;
759
760 if (f_v) {
761 cout << "matrix_group::init_base_general_linear "
762 "verbose_level=" << verbose_level << endl;
763 }
764 A->degree = degree;
765 if (f_vv) {
766 cout << "matrix_group::init_base_general_linear "
767 "degree=" << degree << endl;
768 }
770 n, q, f_semilinear, verbose_level - 1);
771
772 if (f_vv) {
773 cout << "matrix_group::init_base_general_linear "
774 "base_len=" << base_len << endl;
775 }
776
778 A->Stabilizer_chain->allocate_base_data(A, base_len, verbose_level);
779 //A->Stabilizer_chain->base_len = base_len;
780 //A->allocate_base_data(A->base_len);
781
782 if (f_v) {
783 cout << "matrix_group::init_base_general_linear before "
784 "init_linear_matrix_group" << endl;
785 }
786#if 1
788 GFq, n, f_semilinear, A->degree,
789 verbose_level);
790#else
791 GFq->general_linear_matrix_group_base_and_transversal_length(n,
793 A->Stabilizer_chain->base_len, A->degree,
794 A->Stabilizer_chain->base, A->Stabilizer_chain->transversal_length,
795 verbose_level - 1);
796#endif
797 if (f_v) {
798 cout << "matrix_group::init_base_general_linear after "
799 "init_linear_matrix_group" << endl;
800 }
801
802 if (f_v) {
803 cout << "matrix_group::init_base_affine: finished" << endl;
804 }
805}
806
807void matrix_group::init_gl_classes(int verbose_level)
808{
809 int f_v = (verbose_level >= 1);
810
811 if (f_v) {
812 cout << "matrix_group::init_gl_classes" << endl;
813 }
814 if (GFq == NULL) {
815 cout << "matrix_group::init_gl_classes GFq == NULL" << endl;
816 exit(1);
817 }
818 if (GFq->e == 1) {
819 // the following was added Dec 2, 2013:
820 if (f_v) {
821 cout << "matrix_group::init_gl_classes "
822 "before init gl_classes n = "
823 << n << " before NEW_OBJECT gl_classes" << endl;
824 }
826 if (f_v) {
827 cout << "matrix_group::init_gl_classes "
828 "after NEW_OBJECT gl_classes" << endl;
829 }
830 C->init(n, GFq, verbose_level);
831 if (f_v) {
832 cout << "matrix_group::init_gl_classes "
833 "after init gl_classes" << endl;
834 }
835 }
836 else {
837 cout << "matrix_group::init_gl_classes the field "
838 "is not a prime field" << endl;
839 exit(1);
840 }
841 if (f_v) {
842 cout << "matrix_group::init_gl_classes done" << endl;
843 }
844}
845
846// implementation functions for matrix group elements:
847
848int matrix_group::GL_element_entry_ij(int *Elt, int i, int j)
849{
850 return Elt[i * n + j];
851}
852
854{
855 if (!f_semilinear) {
856 cout << "matrix_group::GL_element_entry_frobenius "
857 "fatal: !f_semilinear" << endl;
858 exit(1);
859 }
860 if (f_projective) {
861 return Elt[n * n];
862 }
863 else if (f_affine) {
864 return Elt[n * n + n];
865 }
866 else if (f_general_linear) {
867 return Elt[n * n];
868 }
869 else {
870 cout << "matrix_group::GL_element_entry_frobenius "
871 "unknown group type" << endl;
872 exit(1);
873 }
874}
875
876long int matrix_group::image_of_element(int *Elt, long int a, int verbose_level)
877{
878 int f_v = (verbose_level >= 1);
879 long int b;
880
881 if (f_v) {
882 cout << "matrix_group::image_of_element" << endl;
883 }
884 if (f_projective) {
885 b = GL_image_of_PG_element(Elt, a, verbose_level - 1);
886 }
887 else if (f_affine) {
888 b = GL_image_of_AG_element(Elt, a, verbose_level - 1);
889 }
890 else if (f_general_linear) {
891 b = GL_image_of_AG_element(Elt, a, verbose_level - 1);
892 }
893 else {
894 cout << "matrix_group::image_of_element "
895 "unknown group type" << endl;
896 exit(1);
897 }
898 if (f_v) {
899 cout << "matrix_group::image_of_element " << a
900 << " maps to " << b << endl;
901 }
902 return b;
903}
904
905
907 int *Elt, long int a, int verbose_level)
908{
909 int f_v = (verbose_level >= 1);
910 long int b;
911
912 if (f_v) {
913 cout << "matrix_group::GL_image_of_PG_element" << endl;
914 }
916
917 action_from_the_right_all_types(v1, Elt, v2, verbose_level - 1);
918
920
921 if (f_v) {
922 cout << "matrix_group::GL_image_of_PG_element done" << endl;
923 }
924 return b;
925}
926
928 int *Elt, long int a, int verbose_level)
929{
930 int f_v = (verbose_level >= 1);
931 long int b;
933
934 if (f_v) {
935 cout << "matrix_group::GL_image_of_AG_element" << endl;
936 }
937
938 Gg.AG_element_unrank(GFq->q, v1, 1, n, a);
939
940 action_from_the_right_all_types(v1, Elt, v2, verbose_level - 1);
941
942 b = Gg.AG_element_rank(GFq->q, v2, 1, n);
943
944 if (f_v) {
945 cout << "matrix_group::GL_image_of_AG_element done" << endl;
946 }
947 return b;
948}
949
951 int *v, int *A, int *vA, int verbose_level)
952{
953 int f_v = (verbose_level >= 1);
954
955 if (f_v) {
956 cout << "matrix_group::action_from_the_right_all_types" << endl;
957 }
958 if (f_projective) {
959 projective_action_from_the_right(v, A, vA, verbose_level - 1);
960 }
961 else if (f_affine) {
963 v, A, vA, n);
964 // vA = (v * A)^{p^f} + b
965 // where b = A + n * n
966 // and f = A[n * n + n] if f_semilinear is TRUE
967 }
968 else if (f_general_linear) {
970 A, vA, verbose_level - 1);
971 }
972 else {
973 cout << "matrix_group::action_from_the_right_"
974 "all_types unknown group type" << endl;
975 exit(1);
976 }
977 if (f_v) {
978 cout << "matrix_group::action_from_the_right_all_types done" << endl;
979 }
980}
981
983 int *v, int *A, int *vA, int verbose_level)
984// vA = (v * A)^{p^f} if f_semilinear,
985// vA = v * A otherwise
986{
987 int f_v = (verbose_level >= 1);
988
989 if (f_v) {
990 cout << "matrix_group::projective_action_from_the_right" << endl;
991 }
993 v, A, vA, n, verbose_level - 1);
994 if (f_v) {
995 cout << "matrix_group::projective_action_from_the_right done" << endl;
996 }
997}
998
1000 int *v, int *A, int *vA, int verbose_level)
1001// vA = (v * A)^{p^f} if f_semilinear,
1002// vA = v * A otherwise
1003{
1004 int f_v = (verbose_level >= 1);
1005
1006 if (f_v) {
1007 cout << "matrix_group::general_linear_action_from_the_right" << endl;
1008 }
1010 v, A, vA, n, verbose_level - 1);
1011 if (f_v) {
1012 cout << "matrix_group::general_linear_action_from_the_right done" << endl;
1013 }
1014}
1015
1017 int *coeff_in, int *coeff_out, algebraic_geometry::surface_domain *Surf,
1018 int verbose_level)
1019// used in arc_lifting.cpp, surface_classify_wedge.cpp,
1020// surface_create.cpp, create_surface_main.cpp, intersection.cpp
1021{
1022 int f_v = (verbose_level >= 1);
1023
1024 if (f_v) {
1025 cout << "matrix_group::substitute_surface_equation" << endl;
1026 }
1027 if (f_semilinear) {
1029 int me;
1030
1031 me = NT.int_negate(Elt[n * n], GFq->e);
1032 // (GFq->e - Elt[n * n]) % GFq->e
1033 Surf->substitute_semilinear(coeff_in,
1034 coeff_out,
1035 TRUE /* f_semilinear */,
1036 me,
1037 Elt,
1038 0 /*verbose_level*/);
1039
1040 GFq->PG_element_normalize(coeff_out, 1, 20);
1041 }
1042 else {
1043 Surf->substitute_semilinear(coeff_in,
1044 coeff_out,
1045 FALSE /* f_semilinear */,
1046 0,
1047 Elt,
1048 0 /*verbose_level*/);
1049
1050 GFq->PG_element_normalize(coeff_out, 1, 20);
1051
1052 }
1053 if (f_v) {
1054 cout << "matrix_group::substitute_surface_equation done" << endl;
1055 }
1056}
1057
1059{
1060 GL_one_internal(Elt);
1062}
1063
1065{
1066 int i;
1067
1068 if (f_projective) {
1070 if (f_semilinear) {
1071 Elt[n * n] = 0;
1072 }
1073 }
1074 else if (f_affine) {
1076 for (i = 0; i < n; i++) {
1077 Elt[n * n + i] = 0;
1078 }
1079 if (f_semilinear) {
1080 Elt[n * n + n] = 0;
1081 }
1082 }
1083 else {
1085 if (f_semilinear) {
1086 Elt[n * n] = 0;
1087 }
1088 }
1089}
1090
1092{
1093 if (f_projective) {
1094 if (f_semilinear) {
1095 Int_vec_zero(Elt, n * n + 1);
1096 }
1097 else {
1098 Int_vec_zero(Elt, n * n);
1099 }
1100 }
1101 else if (f_affine) {
1102 if (f_semilinear) {
1103 Int_vec_zero(Elt, n * n + n + 1);
1104 }
1105 else {
1106 Int_vec_zero(Elt, n * n + n);
1107 }
1108 }
1109 if (f_general_linear) {
1110 if (f_semilinear) {
1111 Int_vec_zero(Elt, n * n + 1);
1112 }
1113 else {
1114 Int_vec_zero(Elt, n * n);
1115 }
1116 }
1117 else {
1118 cout << "matrix_group::GL_zero unknown group type" << endl;
1119 exit(1);
1120 }
1122}
1123
1125{
1126 int c;
1127
1128 //cout << "matrix_group::GL_is_one" << endl;
1129 if (f_projective) {
1131 Elt, n, c)) {
1132 return FALSE;
1133 }
1134 if (f_semilinear) {
1135 if (Elt[n * n] != 0) {
1136 return FALSE;
1137 }
1138 }
1139 }
1140 else if (f_affine) {
1141 //cout << "matrix_group::GL_is_one f_affine" << endl;
1142 if (!GFq->Linear_algebra->is_identity_matrix(Elt, n)) {
1143 //cout << "matrix_group::GL_is_one
1144 // not the identity matrix" << endl;
1145 //print_integer_matrix(cout, Elt, n, n);
1146 return FALSE;
1147 }
1148 if (!GFq->Linear_algebra->is_zero_vector(Elt + n * n, n)) {
1149 //cout << "matrix_group::GL_is_one
1150 // not the zero vector" << endl;
1151 return FALSE;
1152 }
1153 if (f_semilinear) {
1154 if (Elt[n * n + n] != 0) {
1155 return FALSE;
1156 }
1157 }
1158 }
1159 else if (f_general_linear) {
1160 //cout << "matrix_group::GL_is_one f_general_linear" << endl;
1161 if (!GFq->Linear_algebra->is_identity_matrix(Elt, n)) {
1162 //cout << "matrix_group::GL_is_one
1163 // not the identity matrix" << endl;
1164 //print_integer_matrix(cout, Elt, n, n);
1165 return FALSE;
1166 }
1167 if (f_semilinear) {
1168 if (Elt[n * n] != 0) {
1169 return FALSE;
1170 }
1171 }
1172 }
1173 else {
1174 cout << "matrix_group::GL_is_one unknown group type" << endl;
1175 exit(1);
1176 }
1177 return TRUE;
1178}
1179
1180void matrix_group::GL_mult(int *A, int *B, int *AB, int verbose_level)
1181{
1182 int f_v = (verbose_level >= 1);
1183
1184 if (f_v) {
1185 cout << "matrix_group::GL_mult" << endl;
1186 cout << "verbose_level=" << verbose_level << endl;
1187 cout << "A=" << endl;
1188 GL_print_easy(A, cout);
1189 cout << "B=" << endl;
1190 GL_print_easy(B, cout);
1191 }
1192 if (f_v) {
1193 cout << "matrix_group::GL_mult_verbose "
1194 "before GL_mult_internal (1)" << endl;
1195 }
1196 GL_mult_internal(A, B, AB, verbose_level - 1);
1197 if (f_v) {
1198 cout << "matrix_group::GL_mult_verbose "
1199 "before GL_mult_internal (2)" << endl;
1200 }
1203 AB + elt_size_int_half, verbose_level - 1);
1204 if (f_v) {
1205 cout << "AB=" << endl;
1206 GL_print_easy(AB, cout);
1207 cout << "matrix_group::GL_mult done" << endl;
1208 }
1209}
1210
1212 int *A, int *B, int *AB, int verbose_level)
1213{
1214 int f_v = (verbose_level >= 1);
1215
1216 if (f_v) {
1217 cout << "matrix_group::GL_mult_internal" << endl;
1218 cout << "f_projective=" << f_projective << endl;
1219 cout << "f_affine=" << f_affine << endl;
1220 cout << "f_general_linear=" << f_general_linear << endl;
1221 cout << "f_semilinear=" << f_semilinear << endl;
1222 }
1223
1224 if (f_projective) {
1225 if (f_semilinear) {
1226 if (f_v) {
1227 cout << "matrix_group::GL_mult_internal "
1228 "before GFq->semilinear_matrix_mult" << endl;
1229 }
1230 //GFq->semilinear_matrix_mult(A, B, AB, n);
1231 GFq->Linear_algebra->semilinear_matrix_mult_memory_given(A, B, AB, tmp_M, n, verbose_level - 1);
1232 }
1233 else {
1234 if (f_v) {
1235 cout << "matrix_group::GL_mult_internal "
1236 "before GFq->mult_matrix_matrix" << endl;
1237 }
1238 GFq->Linear_algebra->mult_matrix_matrix(A, B, AB, n, n, n,
1239 0 /* verbose_level */);
1240 }
1241 }
1242 else if (f_affine) {
1243 if (f_semilinear) {
1244 if (f_v) {
1245 cout << "matrix_group::GL_mult_internal "
1246 "before GFq->semilinear_matrix_mult_affine" << endl;
1247 }
1249 }
1250 else {
1251 if (f_v) {
1252 cout << "matrix_group::GL_mult_internal "
1253 "before GFq->matrix_mult_affine" << endl;
1254 }
1255 GFq->Linear_algebra->matrix_mult_affine(A, B, AB, n, verbose_level - 1);
1256 }
1257 }
1258 else if (f_general_linear) {
1259 if (f_semilinear) {
1260 if (f_v) {
1261 cout << "matrix_group::GL_mult_internal "
1262 "before GFq->semilinear_matrix_mult" << endl;
1263 }
1264 //GFq->semilinear_matrix_mult(A, B, AB, n);
1265 GFq->Linear_algebra->semilinear_matrix_mult_memory_given(A, B, AB, tmp_M, n, verbose_level - 1);
1266 }
1267 else {
1268 if (f_v) {
1269 cout << "matrix_group::GL_mult_internal "
1270 "before GFq->mult_matrix_matrix" << endl;
1271 }
1272 GFq->Linear_algebra->mult_matrix_matrix(A, B, AB, n, n, n,
1273 0 /* verbose_level */);
1274 }
1275 }
1276 else {
1277 cout << "matrix_group::GL_mult_internal unknown group type" << endl;
1278 exit(1);
1279 }
1280 if (f_v) {
1281 cout << "matrix_group::GL_mult_internal done" << endl;
1282 }
1283}
1284
1285void matrix_group::GL_copy(int *A, int *B)
1286{
1288}
1289
1291{
1293}
1294
1295void matrix_group::GL_transpose(int *A, int *At, int verbose_level)
1296{
1297 int f_v = (verbose_level >= 1);
1298
1299 if (f_v) {
1300 cout << "matrix_group::GL_transpose" << endl;
1301 }
1302 GL_transpose_internal(A, At, verbose_level);
1303 //GL_transpose_internal(A + elt_size_int_half,
1304 // At + elt_size_int_half, verbose_level);
1305 GL_invert_internal(At, At + elt_size_int_half, verbose_level - 2);
1306 if (f_v) {
1307 cout << "matrix_group::GL_transpose done" << endl;
1308 }
1309}
1310
1312 int *A, int *At, int verbose_level)
1313{
1314 int f_v = (verbose_level >= 1);
1315
1316 if (f_v) {
1317 cout << "matrix_group::GL_transpose_internal" << endl;
1318 }
1319 if (f_affine) {
1320 cout << "matrix_group::GL_transpose_internal "
1321 "not yet implemented for affine groups" << endl;
1322 exit(1);
1323 }
1325 base_cols, At, n, verbose_level - 2);
1327 if (f_semilinear) {
1328 At[n * n] = A[n * n];
1329 }
1330 if (f_v) {
1331 cout << "matrix_group::GL_transpose_internal done" << endl;
1332 }
1333}
1334
1335void matrix_group::GL_invert(int *A, int *Ainv)
1336{
1339}
1340
1341void matrix_group::GL_invert_internal(int *A, int *Ainv, int verbose_level)
1342{
1343 int f_v = (verbose_level >= 1);
1344 int f_vv = (verbose_level >= 2);
1345
1346 if (f_v) {
1347 cout << "matrix_group::GL_invert_internal" << endl;
1348 }
1349 if (f_projective) {
1350 if (f_semilinear) {
1351 if (f_vv) {
1352 cout << "matrix_group::GL_invert_internal "
1353 "calling GFq->semilinear_matrix_invert" << endl;
1354 }
1356 base_cols, Ainv, n, verbose_level - 2);
1357 }
1358 else {
1359 if (f_vv) {
1360 cout << "matrix_group::GL_invert_internal "
1361 "calling GFq->matrix_invert" << endl;
1362 }
1364 base_cols, Ainv, n, verbose_level - 2);
1365 }
1366 }
1367 else if (f_affine) {
1368 if (f_semilinear) {
1369 if (f_vv) {
1370 cout << "matrix_group::semilinear_matrix_invert_affine "
1371 "calling GFq->semilinear_matrix_invert" << endl;
1372 }
1374 base_cols, Ainv, n, verbose_level - 2);
1375 }
1376 else {
1377 if (f_vv) {
1378 cout << "matrix_group::matrix_invert_affine "
1379 "calling GFq->semilinear_matrix_invert" << endl;
1380 }
1382 base_cols, Ainv, n, verbose_level - 2);
1383 }
1384 }
1385 else if (f_general_linear) {
1386 if (f_semilinear) {
1387 if (f_vv) {
1388 cout << "matrix_group::GL_invert_internal "
1389 "calling GFq->semilinear_matrix_invert" << endl;
1390 }
1392 base_cols, Ainv, n, verbose_level - 2);
1393 }
1394 else {
1395 if (f_vv) {
1396 cout << "matrix_group::GL_invert_internal "
1397 "calling GFq->matrix_invert" << endl;
1398 }
1400 base_cols, Ainv, n, verbose_level - 2);
1401 }
1402 }
1403 else {
1404 cout << "matrix_group::GL_invert_internal "
1405 "unknown group type" << endl;
1406 exit(1);
1407 }
1408 if (f_v) {
1409 cout << "matrix_group::GL_invert_internal done" << endl;
1410 }
1411}
1412
1413void matrix_group::GL_unpack(uchar *elt, int *Elt, int verbose_level)
1414{
1415 int f_v = (verbose_level >= 1);
1416 int f_vv = (verbose_level >= 2);
1417 int i;
1418
1419 if (f_v) {
1420 cout << "matrix_group::GL_unpack" << endl;
1421 cout << "matrix_group::GL_unpack f_projective=" << f_projective << endl;
1422 cout << "matrix_group::GL_unpack f_affine=" << f_affine << endl;
1423 cout << "matrix_group::GL_unpack f_general_linear=" << f_general_linear << endl;
1424 cout << "matrix_group::GL_unpack f_semilinear=" << f_semilinear << endl;
1425 cout << "matrix_group::GL_unpack n=" << n << endl;
1426 cout << "matrix_group::GL_unpack bits_per_digit=" << bits_per_digit << endl;
1427 cout << "matrix_group::GL_unpack bits_per_elt=" << bits_per_elt << endl;
1428 cout << "matrix_group::GL_unpack bits_extension_degree=" << bits_extension_degree << endl;
1429 cout << "matrix_group::GL_unpack char_per_elt=" << char_per_elt << endl;
1430 }
1431
1432
1433 if (f_projective) {
1434 decode_matrix(Elt, n, elt);
1435 if (f_semilinear) {
1436 Elt[n * n] = decode_frobenius(elt);
1437 }
1438 }
1439 else if (f_affine) {
1440 decode_matrix(Elt, n, elt);
1441 for (i = 0; i < n; i++) {
1442 Elt[n * n + i] = get_digit(elt, n, i);
1443 }
1444 if (f_semilinear) {
1445 Elt[n * n] = decode_frobenius(elt);
1446 }
1447 }
1448 else if (f_general_linear) {
1449 decode_matrix(Elt, n, elt);
1450 if (f_semilinear) {
1451 Elt[n * n] = decode_frobenius(elt);
1452 }
1453 }
1454 else {
1455 cout << "matrix_group::GL_unpack unknown group type" << endl;
1456 exit(1);
1457 }
1458 if (f_vv) {
1459 cout << "GL_unpack read:" << endl;
1460 GL_print_easy(Elt, cout);
1461 cout << "GL_unpack calling GL_invert_internal" << endl;
1462 }
1463 GL_invert_internal(Elt, Elt + elt_size_int_half, verbose_level - 2);
1464 if (f_v) {
1465 cout << "matrix_group::GL_unpack done" << endl;
1466 }
1467}
1468
1469void matrix_group::GL_pack(int *Elt, uchar *elt)
1470{
1471 int i;
1472
1473 if (f_projective) {
1474 encode_matrix(Elt, n, elt);
1475 if (f_semilinear) {
1476 encode_frobenius(elt, Elt[n * n]);
1477 }
1478 }
1479 else if (f_affine) {
1480 encode_matrix(Elt, n, elt);
1481 for (i = 0; i < n; i++) {
1482 put_digit(elt, n, i, Elt[n * n + i]);
1483 }
1484 if (f_semilinear) {
1485 encode_frobenius(elt, Elt[n * n + n]);
1486 }
1487 }
1488 else if (f_general_linear) {
1489 encode_matrix(Elt, n, elt);
1490 if (f_semilinear) {
1491 encode_frobenius(elt, Elt[n * n]);
1492 }
1493 }
1494 else {
1495 cout << "matrix_group::GL_pack unknown group type" << endl;
1496 exit(1);
1497 }
1498}
1499
1500void matrix_group::GL_print_easy(int *Elt, ostream &ost)
1501{
1502 int i, j, a;
1503 int w;
1504
1505 w = (int) GFq->log10_of_q;
1506
1507 for (i = 0; i < n; i++) {
1508 for (j = 0; j < n; j++) {
1509 a = Elt[i * n + j];
1510 ost << setw(w) << a << " ";
1511 }
1512 ost << endl;
1513 }
1514 if (f_affine) {
1515 Int_vec_print(ost, Elt + n * n, n);
1516 if (f_semilinear) {
1517 ost << ", " << Elt[n * n + n] << endl;
1518 }
1519 }
1520 else {
1521 if (f_semilinear) {
1522 ost << ", " << Elt[n * n] << endl;
1523 }
1524 }
1525}
1526
1528{
1529 Int_vec_copy(Elt, data, n * n);
1530 if (f_affine) {
1531 Int_vec_copy(Elt + n * n, data + n * n, n);
1532 if (f_semilinear) {
1533 data[n * n + n] = Elt[n * n + n];
1534 }
1535 }
1536 else {
1537 if (f_semilinear) {
1538 data[n * n] = Elt[n * n];
1539 }
1540 }
1541}
1542
1544 int *Elt, ostream &ost)
1545{
1546 int i, j, a;
1547 //int w;
1548
1549 //w = (int) GFq->log10_of_q;
1550
1551 int *D;
1552 D = NEW_int(n * n);
1553
1554 Int_vec_copy(Elt, D, n * n);
1555
1556 if (f_projective) {
1558 }
1559
1560 for (i = 0; i < n; i++) {
1561 for (j = 0; j < n; j++) {
1562 a = D[i * n + j];
1563 ost << a << ",";
1564 }
1565 }
1566 if (f_affine) {
1567 for (i = 0; i < n; i++) {
1568 a = Elt[n * n + i];
1569 ost << a << ",";
1570 }
1571 if (f_semilinear) {
1572 ost << Elt[n * n + n] << ",";
1573 }
1574 }
1575 else {
1576 if (f_semilinear) {
1577 ost << Elt[n * n] << ",";
1578 }
1579 }
1580
1581 FREE_int(D);
1582
1583}
1584
1586 int *Elt, ostream &ost)
1587{
1588 int i, j, a;
1589 int w;
1590
1591 w = (int) GFq->log10_of_q;
1592 for (i = 0; i < n; i++) {
1593 for (j = 0; j < n; j++) {
1594 a = Elt[i * n + j];
1595 ost << setw(w) << a << " ";
1596 }
1597 }
1598 if (f_affine) {
1599 for (i = 0; i < n; i++) {
1600 a = Elt[n * n + i];
1601 ost << setw(w) << a << " ";
1602 }
1603 if (f_semilinear) {
1604 ost << Elt[n * n + n] << " ";
1605 }
1606 }
1607 else {
1608 if (f_semilinear) {
1609 ost << Elt[n * n] << " ";
1610 }
1611 }
1612}
1613
1614void matrix_group::GL_print_easy_normalized(int *Elt, ostream &ost)
1615{
1616 int f_v = FALSE;
1617 int i, j, a;
1618 int w;
1619
1620 if (f_v) {
1621 cout << "matrix_group::GL_print_easy_normalized" << endl;
1622 }
1623
1624 w = (int) GFq->log10_of_q;
1625 if (f_projective) {
1626 int *D;
1627 D = NEW_int(n * n);
1628 Int_vec_copy(Elt, D, n * n);
1630 for (i = 0; i < n; i++) {
1631 for (j = 0; j < n; j++) {
1632 a = D[i * n + j];
1633 ost << setw(w) << a << " ";
1634 }
1635 ost << endl;
1636 }
1637 FREE_int(D);
1638 }
1639 else if (f_affine) {
1640 for (i = 0; i < n; i++) {
1641 for (j = 0; j < n; j++) {
1642 a = Elt[i * n + j];
1643 ost << setw(w) << a << ", ";
1644 }
1645 }
1646 Int_vec_print(ost, Elt + n * n, n);
1647 if (f_semilinear) {
1648 ost << ", " << Elt[n * n + n] << endl;
1649 }
1650 }
1651 else if (f_general_linear) {
1652 for (i = 0; i < n; i++) {
1653 for (j = 0; j < n; j++) {
1654 a = Elt[i * n + j];
1655 ost << setw(w) << a << ", ";
1656 }
1657 }
1658 if (f_semilinear) {
1659 ost << ", " << Elt[n * n] << endl;
1660 }
1661 }
1662 else {
1663 cout << "matrix_group::GL_print_easy_normalized "
1664 "unknown group type" << endl;
1665 exit(1);
1666 }
1667
1668 if (f_v) {
1669 cout << "matrix_group::GL_print_easy_normalized done" << endl;
1670 }
1671}
1672
1673void matrix_group::GL_print_latex(int *Elt, ostream &ost)
1674{
1675
1676 int *D;
1677 D = NEW_int(n * n);
1678
1679 Int_vec_copy(Elt, D, n * n);
1680
1681 if (f_projective) {
1682 //GFq->PG_element_normalize_from_front(D, 1, n * n);
1683 GFq->PG_element_normalize(D, 1, n * n);
1684 }
1685
1686 GFq->print_matrix_latex(ost, D, n, n);
1687
1688 if (f_affine) {
1689 GFq->print_matrix_latex(ost, Elt + n * n, 1, n);
1690 //int_vec_print(ost, Elt + n * n, n);
1691 if (f_semilinear) {
1692 ost << "_{" << Elt[n * n + n] << "}" << endl;
1693 }
1694 }
1695 else {
1696 if (f_semilinear) {
1697 ost << "_{" << Elt[n * n] << "}" << endl;
1698 }
1699 }
1700 FREE_int(D);
1701}
1702
1704 std::ostream &ost,
1705 void (*point_label)(std::stringstream &sstr, int pt, void *data),
1706 void *point_label_data)
1707{
1708 cout << "matrix_group::GL_print_latex_with_print_point_function nyi" << endl;
1709#if 0
1710 int i, j, a;
1711 //int w;
1712
1713 //w = (int) GFq->log10_of_q;
1714
1715 int *D;
1716 D = NEW_int(n * n);
1717
1718 int_vec_copy(Elt, D, n * n);
1719
1720 if (f_projective) {
1722 }
1723
1724 ost << "\\left[" << endl;
1725 ost << "\\begin{array}{*{" << n << "}{r}}" << endl;
1726 for (i = 0; i < n; i++) {
1727 for (j = 0; j < n; j++) {
1728 a = D[i * n + j];
1729
1730#if 0
1731 if (is_prime(GFq->q)) {
1732 ost << setw(w) << a << " ";
1733 }
1734 else {
1735 ost << a;
1736 // GFq->print_element(ost, a);
1737 }
1738#else
1739 GFq->print_element(ost, a);
1740#endif
1741
1742 if (j < n - 1)
1743 ost << " & ";
1744 }
1745 ost << "\\\\" << endl;
1746 }
1747 ost << "\\end{array}" << endl;
1748 ost << "\\right]" << endl;
1749 if (f_affine) {
1750 int_vec_print(ost, Elt + n * n, n);
1751 if (f_semilinear) {
1752 ost << "_{" << Elt[n * n + n] << "}" << endl;
1753 }
1754 }
1755 else {
1756 if (f_semilinear) {
1757 ost << "_{" << Elt[n * n] << "}" << endl;
1758 }
1759 }
1760 FREE_int(D);
1761#endif
1762
1763}
1764
1765void matrix_group::GL_print_easy_latex(int *Elt, std::ostream &ost)
1766{
1767
1769
1770}
1771
1772void matrix_group::GL_print_easy_latex_with_option_numerical(int *Elt, int f_numerical, std::ostream &ost)
1773{
1774 int i, j, a;
1775 //int w;
1776
1777 //w = (int) GFq->log10_of_q;
1778 int *D;
1779 D = NEW_int(n * n);
1780
1781 if (f_projective) {
1782 Int_vec_copy(Elt, D, n * n);
1783 //GFq->PG_element_normalize_from_front(D, 1, n * n);
1784 GFq->PG_element_normalize(D, 1, n * n);
1785 }
1786 else {
1787 Int_vec_copy(Elt, D, n * n);
1788 }
1789
1790
1791 if (GFq->q <= 9) {
1792 ost << "\\left[" << endl;
1793 ost << "\\begin{array}{c}" << endl;
1794 for (i = 0; i < n; i++) {
1795 for (j = 0; j < n; j++) {
1796 a = D[i * n + j];
1797
1798
1799 if (f_numerical) {
1800 ost << a;
1801 }
1802 else {
1803 GFq->print_element(ost, a);
1804 }
1805#if 0
1806 if (is_prime(GFq->q)) {
1807 ost << a;
1808 }
1809 else {
1810 ost << a;
1811 //GFq->print_element(ost, a);
1812 }
1813#else
1814 //GFq->print_element(ost, a);
1815#endif
1816
1817 //if (j < n - 1)
1818 // ost << " & ";
1819 }
1820 ost << "\\\\" << endl;
1821 }
1822 ost << "\\end{array}" << endl;
1823 ost << "\\right]" << endl;
1824 }
1825 else {
1826 ost << "\\left[" << endl;
1827 ost << "\\begin{array}{*{" << n << "}{r}}" << endl;
1828 for (i = 0; i < n; i++) {
1829 for (j = 0; j < n; j++) {
1830 a = D[i * n + j];
1831
1832 if (f_numerical) {
1833 ost << a;
1834 }
1835 else {
1836 GFq->print_element(ost, a);
1837 }
1838
1839#if 0
1840 if (is_prime(GFq->q)) {
1841 ost << setw(w) << a << " ";
1842 }
1843 else {
1844 ost << a;
1845 // GFq->print_element(ost, a);
1846 }
1847#else
1848 //GFq->print_element(ost, a);
1849#endif
1850
1851 if (j < n - 1)
1852 ost << " & ";
1853 }
1854 ost << "\\\\" << endl;
1855 }
1856 ost << "\\end{array}" << endl;
1857 ost << "\\right]" << endl;
1858 }
1859 if (f_affine) {
1860 Int_vec_print(ost, Elt + n * n, n);
1861 if (f_semilinear) {
1862 ost << "_{" << Elt[n * n + n] << "}" << endl;
1863 }
1864 }
1865 else {
1866 if (f_semilinear) {
1867 ost << "_{" << Elt[n * n] << "}" << endl;
1868 }
1869 }
1870 FREE_int(D);
1871
1872}
1873
1874void matrix_group::decode_matrix(int *Elt, int n, uchar *elt)
1875{
1876 int i, j;
1877
1878 for (i = 0; i < n; i++) {
1879 for (j = 0; j < n; j++) {
1880 Elt[i * n + j] = get_digit(elt, i, j);
1881 }
1882 }
1883}
1884
1885int matrix_group::get_digit(uchar *elt, int i, int j)
1886{
1887 int h0 = (int) (i * n + j) * bits_per_digit;
1888 int h, h1, word, bit;
1889 uchar mask, d = 0;
1890
1891 for (h = (int) bits_per_digit - 1; h >= 0; h--) {
1892 h1 = h0 + h;
1893 word = h1 >> 3;
1894 bit = h1 & 7;
1895 mask = ((uchar) 1) << bit;
1896 d <<= 1;
1897 if (elt[word] & mask) {
1898 d |= 1;
1899 }
1900 }
1901 return d;
1902}
1903
1905{
1906 int h0;
1907 int h, h1, word, bit;
1908 uchar mask, d = 0;
1909
1910 if (f_affine) {
1911 h0 = (int) (n * n + n) * bits_per_digit;
1912 }
1913 else {
1914 h0 = (int) n * n * bits_per_digit;
1915 }
1916 for (h = (int) bits_extension_degree - 1; h >= 0; h--) {
1917 h1 = h0 + h;
1918 word = h1 >> 3;
1919 bit = h1 & 7;
1920 mask = ((uchar) 1) << bit;
1921 d <<= 1;
1922 if (elt[word] & mask) {
1923 d |= 1;
1924 }
1925 }
1926 return d;
1927}
1928
1929void matrix_group::encode_matrix(int *Elt, int n, uchar *elt)
1930{
1931 int i, j;
1932
1933 for (i = 0; i < n; i++) {
1934 for (j = 0; j < n; j++) {
1935 put_digit(elt, i, j, Elt[i * n + j]);
1936 }
1937 }
1938}
1939
1940void matrix_group::put_digit(uchar *elt, int i, int j, int d)
1941{
1942 int h0 = (int) (i * n + j) * bits_per_digit;
1943 int h, h1, word, bit;
1944 uchar mask;
1945
1946 //cout << "put_digit() " << d << " bits_per_digit = "
1947 // << bits_per_digit << endl;
1948 for (h = 0; h < bits_per_digit; h++) {
1949 h1 = h0 + h;
1950 word = h1 >> 3;
1951 //cout << "word = " << word << endl;
1952 bit = h1 & 7;
1953 mask = ((uchar) 1) << bit;
1954 if (d & 1) {
1955 elt[word] |= mask;
1956 }
1957 else {
1958 uchar not_mask = ~mask;
1959 elt[word] &= not_mask;
1960 }
1961 d >>= 1;
1962 }
1963}
1964
1966{
1967 int h0;
1968 int h, h1, word, bit;
1969 uchar mask;
1970
1971 if (f_affine) {
1972 h0 = (int) (n * n + n) * bits_per_digit;
1973 }
1974 else {
1975 h0 = (int) n * n * bits_per_digit;
1976 }
1977 for (h = 0; h < bits_extension_degree; h++) {
1978 h1 = h0 + h;
1979 word = h1 >> 3;
1980 bit = h1 & 7;
1981 mask = ((uchar) 1) << bit;
1982 if (d & 1) {
1983 elt[word] |= mask;
1984 }
1985 else {
1986 uchar not_mask = ~mask;
1987 elt[word] &= not_mask;
1988 }
1989 d >>= 1;
1990 }
1991}
1992
1994 int *data, int verbose_level)
1995{
1996 int f_v = (verbose_level >= 1);
1997 int f_vv = (verbose_level >= 2);
1998 int i, a, b;
1999
2000 if (f_v) {
2001 cout << "matrix_group::make_element" << endl;
2002 }
2003 if (f_vv) {
2004 cout << "data: ";
2006 cout << endl;
2007 }
2008 for (i = 0; i < elt_size_int_half; i++) {
2009 a = data[i];
2010 if (a < 0) {
2011 b = -a;
2012 //b = (GFq->q - 1) / a;
2013 a = GFq->power(GFq->alpha, b);
2014 }
2015 Elt[i] = a;
2016 }
2017 if (f_vv) {
2018 cout << "matrix_group::make_element "
2019 "calling GL_invert_internal" << endl;
2020 }
2021 GL_invert_internal(Elt, Elt + elt_size_int_half, verbose_level - 2);
2022 if (f_vv) {
2023 cout << "matrix_group::make_element "
2024 "created the following element" << endl;
2025 GL_print_easy(Elt, cout);
2026 cout << endl;
2027 }
2028 if (f_v) {
2029 cout << "matrix_group::make_element done" << endl;
2030 }
2031}
2032
2033void matrix_group::make_GL_element(int *Elt, int *A, int f)
2034{
2035 if (f_projective) {
2036 Int_vec_copy(A, Elt, n * n);
2037 if (f_semilinear) {
2038 Elt[n * n] = f % GFq->e;
2039 }
2040 }
2041 else if (f_affine) {
2042 Int_vec_copy(A, Elt, n * n + n);
2043 if (f_semilinear) {
2044 Elt[n * n + n] = f % GFq->e;
2045 }
2046 }
2047 else if (f_general_linear) {
2048 Int_vec_copy(A, Elt, n * n);
2049 if (f_semilinear) {
2050 Elt[n * n] = f % GFq->e;
2051 }
2052 }
2053 else {
2054 cout << "matrix_group::make_GL_element "
2055 "unknown group type" << endl;
2056 exit(1);
2057 }
2059}
2060
2062 actions::action *A,
2064 int f_siegel,
2065 int f_reflection,
2066 int f_similarity,
2067 int f_semisimilarity,
2068 int *Elt, int verbose_level)
2069{
2070 int f_v = (verbose_level >= 1);
2071 int f_vvv = (verbose_level >= 3);
2072 int *Mtx;
2073
2074 if (f_v) {
2075 cout << "matrix_group::orthogonal_group_random_generator" << endl;
2076 cout << "f_siegel=" << f_siegel << endl;
2077 cout << "f_reflection=" << f_reflection << endl;
2078 cout << "f_similarity=" << f_similarity << endl;
2079 cout << "f_semisimilarity=" << f_semisimilarity << endl;
2080 cout << "n=" << n << endl;
2081 cout << "verbose_level = " << verbose_level << endl;
2082 }
2083
2084 Mtx = NEW_int(n * n + 1);
2085
2086 if (f_v) {
2087 cout << "matrix_group::orthogonal_group_random_generator "
2088 "before O->random_generator_for_orthogonal_group" << endl;
2089 }
2090
2092 f_semilinear /* f_action_is_semilinear */,
2093 f_siegel,
2094 f_reflection,
2095 f_similarity,
2096 f_semisimilarity,
2097 Mtx, verbose_level - 1);
2098
2099 if (f_v) {
2100 cout << "matrix_group::orthogonal_group_random_generator "
2101 "after O->random_generator_for_orthogonal_group" << endl;
2102 cout << "Mtx=" << endl;
2103 Int_matrix_print(Mtx, n, n);
2104 }
2105 A->make_element(Elt, Mtx, verbose_level - 1);
2106
2107
2108 FREE_int(Mtx);
2109
2110
2111 if (f_vvv) {
2112 cout << "matrix_group::orthogonal_group_random_generator "
2113 "random generator:" << endl;
2114 A->element_print_quick(Elt, cout);
2115 }
2116 if (f_v) {
2117 cout << "matrix_group::orthogonal_group_random_generator done" << endl;
2118 }
2119}
2120
2121
2123 int *&Sol, int &cnt, int f_path_select, int select_value,
2124 int verbose_level)
2125{
2126 int f_v = (verbose_level >= 1);
2127 int *Elt1;
2128 long int goi, rk, i, h;
2130 int *Id;
2131 int *Mtx1;
2132 int *Mtx2;
2133 int *Mtx3;
2134 int *Mtx4;
2135 vector<int> sol;
2136
2137 S->group_order(go);
2138 goi = go.as_int();
2139 if (f_v) {
2140 cout << "matrix_group::matrices_without_eigenvector_one "
2141 "testing group of order " << goi << endl;
2142 if (f_path_select) {
2143 cout << "path[0] = " << select_value << endl;
2144 }
2145 }
2147 Id = NEW_int(n * n);
2148 Mtx1 = NEW_int(n * n);
2149 Mtx2 = NEW_int(n * n);
2150 Mtx3 = NEW_int(n * n);
2151 Mtx4 = NEW_int(n * n);
2153 for (i = 0; i < n * n; i++) {
2154 Id[i] = GFq->negate(Id[i]);
2155 }
2156 if (f_v) {
2157 cout << "The negative Identity matrix is:" << endl;
2158 Int_matrix_print(Id, n, n);
2159 }
2160 cnt = 0;
2161 rk = 0;
2162
2163 if (f_path_select) {
2164 S->path[0] = select_value;
2165 for (h = 1; h < S->A->base_len(); h++) {
2166 S->path[h] = 0;
2167 }
2168 rk = S->path_rank_lint();
2169 }
2170
2171
2172 while (rk < goi) {
2173 S->element_unrank_lint(rk, Elt1);
2174 S->path_unrank_lint(rk);
2175 if (f_path_select && S->path[0] > select_value) {
2176 break;
2177 }
2178 if (FALSE) {
2179 cout << "testing matrix " << rk << " / " << goi << endl;
2181 S->path_unrank_lint(rk);
2182 cout << "path ";
2183 Int_vec_print(cout, S->path, S->A->base_len());
2184 cout << endl;
2185 }
2186 for (i = 0; i < n; i++) {
2187 Int_vec_copy(Elt1, Mtx1, (i + 1) * n);
2188 GFq->Linear_algebra->add_vector(Id, Mtx1, Mtx2, (i + 1) * n);
2189 if (FALSE) {
2190 cout << "testing level " << i << " / " << n << ":" << endl;
2191 Int_matrix_print(Mtx2, (i + 1), n);
2192 }
2194 (i + 1), n, Mtx3, Mtx4, 0 /* verbose_level */) < i + 1) {
2195 if (FALSE) {
2196 cout << "failing level " << i << endl;
2197 }
2198 break;
2199 }
2200 }
2201 if (i < n) {
2202 S->path_unrank_lint(rk);
2203 while (i >= 0) {
2204 S->path[i]++;
2205 if (S->path[i] < S->get_orbit_length(i)) {
2206 break;
2207 }
2208 i--;
2209 }
2210 for (h = i + 1; h < S->A->base_len(); h++) {
2211 S->path[h] = 0;
2212 }
2213 if (FALSE) {
2214 cout << "moving on to path ";
2215 Int_vec_print(cout, S->path, S->A->base_len());
2216 cout << endl;
2217 }
2218 rk = S->path_rank_lint();
2219 if (FALSE) {
2220 cout << "moving on to matrix " << rk << " / " << goi << endl;
2221 }
2222 if (rk == 0) {
2223 break;
2224 }
2225 }
2226 else {
2227 cnt++;
2228 if ((cnt % 10000) == 0) {
2229 double d;
2230
2231 d = (double) rk / (double) goi * 100.;
2232 cout << "The matrix " << rk << " / " << goi
2233 << " (" << d << "%) has no eigenvector one, "
2234 "cnt=" << cnt << endl;
2235 S->path_unrank_lint(rk);
2236 cout << "path ";
2237 Int_vec_print(cout, S->path, S->A->base_len());
2238 cout << " : ";
2239 for (int t = 0; t < S->A->base_len(); t++) {
2240 cout << S->get_orbit_length(t) << ", ";
2241 }
2242 //int_vec_print(cout, S->orbit_len, S->A->base_len());
2243 if (f_path_select) {
2244 cout << " select_value = " << select_value;
2245 }
2246 cout << endl;
2248 }
2249 sol.push_back(rk);
2250 rk++;
2251 }
2252 }
2253 if (f_v) {
2254 cout << "We found " << cnt << " matrices without "
2255 "eigenvector one" << endl;
2256 }
2257 Sol = NEW_int(cnt);
2258 for (i = 0; i < cnt; i++) {
2259 Sol[i] = sol[i];
2260 }
2261 FREE_int(Elt1);
2262 FREE_int(Id);
2263 FREE_int(Mtx1);
2264 FREE_int(Mtx2);
2265 FREE_int(Mtx3);
2266 FREE_int(Mtx4);
2267 if (f_v) {
2268 cout << "matrix_group::matrices_without_eigenvector_one "
2269 "done, found this many matrices: " << cnt << endl;
2270 }
2271}
2272
2273
2275 int *Elt1, matrix_group *mtx1, int f, int verbose_level)
2276{
2277 int f_v = (verbose_level >= 1);
2278 int *data;
2279 int n1;
2280
2281 if (f_v) {
2282 cout << "matrix_group::matrix_minor" << endl;
2283 }
2284 if (f_affine) {
2285 cout << "matrix_group::matrix_minor cannot be affine" << endl;
2286 exit(1);
2287 }
2288 n1 = mtx1->n;
2291
2292 mtx1->make_GL_element(Elt1, data, Elt[n * n]);
2293
2294 if (f_v) {
2295 cout << "matrix_group::matrix_minor done" << endl;
2296 }
2297}
2298
2299int matrix_group::base_len(int verbose_level)
2300{
2301 int f_v = (verbose_level >= 1);
2302 int base_len;
2304
2305
2306 if (f_v) {
2307 cout << "matrix_group::base_len" << endl;
2308 }
2309 if (f_projective) {
2311 n, GFq->q,
2312 f_semilinear, verbose_level - 1);
2313 }
2314 else if (f_affine) {
2316 n, GFq->q,
2317 f_semilinear, verbose_level - 1);
2318 }
2319 else if (f_general_linear) {
2321 n, GFq->q,
2322 f_semilinear, verbose_level - 1);
2323 }
2324 else {
2325 cout << "matrix_group::base_len no type" << endl;
2326 exit(1);
2327 }
2328 if (f_v) {
2329 cout << "matrix_group::base_len done" << endl;
2330 }
2331 return base_len;
2332}
2333
2335 int base_len,
2336 long int *base, int *transversal_length,
2337 int verbose_level)
2338{
2339 int f_v = (verbose_level >= 1);
2340
2341
2342 if (f_v) {
2343 cout << "matrix_group::base_and_transversal_length" << endl;
2344 }
2345 if (f_projective) {
2346
2348
2352 base, transversal_length,
2353 verbose_level);
2354 }
2355 else if (f_affine) {
2356
2358
2362 base, transversal_length,
2363 verbose_level);
2364 }
2365 else if (f_general_linear) {
2366
2368
2372 base, transversal_length,
2373 verbose_level);
2374 }
2375 if (f_v) {
2376 cout << "matrix_group::base_and_transversal_length done" << endl;
2377 }
2378}
2379
2381 int &size, int &nb_gens, int verbose_level)
2382{
2383 int f_v = (verbose_level >= 1);
2384
2385 if (f_v) {
2386 cout << "matrix_group::strong_generators_low_level" << endl;
2387 }
2388 if (f_projective) {
2389
2391
2393 n, GFq,
2395 data, size, nb_gens,
2396 verbose_level - 1);
2397 }
2398 else if (f_affine) {
2399
2401
2403 n, GFq,
2405 data, size, nb_gens,
2406 verbose_level - 1);
2407 }
2408 else if (f_general_linear) {
2409
2411
2413 n, GFq,
2415 data, size, nb_gens,
2416 verbose_level);
2417 }
2418 if (f_v) {
2419 cout << "matrix_group::strong_generators_low_level done" << endl;
2420 }
2421}
2422
2424{
2425 int i, j, a, a0;
2426
2427 a0 = Elt[0 * n + 1];
2428 for (i = 0; i < n - 1; i++) {
2429 for (j = 0; j < n; j++) {
2430 a = Elt[i * n + j];
2431 if (j == i + 1) {
2432 if (a != a0) {
2433 return FALSE;
2434 }
2435 }
2436 else {
2437 if (a) {
2438 return FALSE;
2439 }
2440 }
2441 }
2442 }
2443 return TRUE;
2444}
2445
2446}}}
2447
to list all conjugacy classes in GL(n,q)
Definition: algebra.h:455
void init(int k, field_theory::finite_field *F, int verbose_level)
Definition: gl_classes.cpp:67
generators for various classes of groups
Definition: algebra.h:286
void general_linear_matrix_group_base_and_transversal_length(int n, field_theory::finite_field *F, int f_semilinear, int base_len, int degree, long int *base, int *transversal_length, int verbose_level)
int matrix_group_base_len_projective_group(int n, int q, int f_semilinear, int verbose_level)
int matrix_group_base_len_general_linear_group(int n, int q, int f_semilinear, int verbose_level)
int matrix_group_base_len_affine_group(int n, int q, int f_semilinear, int verbose_level)
void strong_generators_for_affine_linear_group(int n, field_theory::finite_field *F, int f_semilinear, int *&data, int &size, int &nb_gens, int verbose_level)
void projective_matrix_group_base_and_transversal_length(int n, field_theory::finite_field *F, int f_semilinear, int base_len, int degree, long int *base, int *transversal_length, int verbose_level)
void affine_matrix_group_base_and_transversal_length(int n, field_theory::finite_field *F, int f_semilinear, int base_len, int degree, long int *base, int *transversal_length, int verbose_level)
void strong_generators_for_projective_linear_group(int n, field_theory::finite_field *F, int f_semilinear, int *&data, int &size, int &nb_gens, int verbose_level)
void strong_generators_for_general_linear_group(int n, field_theory::finite_field *F, int f_semilinear, int *&data, int &size, int &nb_gens, int verbose_level)
void substitute_semilinear(int *coeff_in, int *coeff_out, int f_semilinear, int frob, int *Mtx_inv, int verbose_level)
bulk storage of group elements in compressed form
void init(int entry_size, int page_length_log, int verbose_level)
void print_matrix_latex(std::ostream &ost, int *A, int m, int n)
void PG_element_unrank_modified_lint(int *v, int stride, int len, long int a)
void PG_element_rank_modified_lint(int *v, int stride, int len, long int &a)
various functions related to geometries
Definition: geometry.h:721
void AG_element_unrank(int q, int *v, int stride, int len, long int a)
long int AG_element_rank(int q, int *v, int stride, int len)
void semilinear_matrix_mult_affine(int *A, int *B, int *AB, int n)
void matrix_invert_affine(int *A, int *Tmp, int *Tmp_basecols, int *Ainv, int n, int verbose_level)
void general_linear_action_from_the_right(int f_semilinear, int *v, int *A, int *vA, int n, int verbose_level)
int rank_of_rectangular_matrix_memory_given(int *A, int m, int n, int *B, int *base_cols, int verbose_level)
void matrix_mult_affine(int *A, int *B, int *AB, int n, int verbose_level)
int is_scalar_multiple_of_identity_matrix(int *A, int n, int &scalar)
void projective_action_from_the_right(int f_semilinear, int *v, int *A, int *vA, int n, int verbose_level)
void mult_matrix_matrix(int *A, int *B, int *C, int m, int n, int o, int verbose_level)
void matrix_minor(int f_semilinear, int *A, int *B, int n, int f, int l)
void semilinear_matrix_mult_memory_given(int *A, int *B, int *AB, int *tmp_B, int n, int verbose_level)
void affine_action_from_the_right(int f_semilinear, int *v, int *A, int *vA, int n)
void semilinear_matrix_invert(int *A, int *Tmp, int *Tmp_basecols, int *Ainv, int n, int verbose_level)
void semilinear_matrix_invert_affine(int *A, int *Tmp, int *Tmp_basecols, int *Ainv, int n, int verbose_level)
void matrix_invert(int *A, int *Tmp, int *Tmp_basecols, int *Ainv, int n, int verbose_level)
void random_generator_for_orthogonal_group(int f_action_is_semilinear, int f_siegel, int f_reflection, int f_similarity, int f_semisimilarity, int *Mtx, int verbose_level)
a class to represent arbitrary precision integers
Definition: ring_theory.h:366
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
stabilizer_chain_base_data * Stabilizer_chain
Definition: actions.h:178
void make_element(int *Elt, int *data, int verbose_level)
Definition: action.cpp:1875
the transversals in the stabilizer subgroup chain (Sims chain)
Definition: actions.h:1214
void init_affine_matrix_group(field_theory::finite_field *F, int n, int f_semilinear, int degree, int verbose_level)
void init_linear_matrix_group(field_theory::finite_field *F, int n, int f_semilinear, int degree, int verbose_level)
void init_projective_matrix_group(field_theory::finite_field *F, int n, int f_semilinear, int degree, int verbose_level)
a matrix group over a finite field in projective, vector space or affine action
Definition: groups.h:318
void GL_print_easy_normalized(int *Elt, std::ostream &ost)
void GL_print_easy(int *Elt, std::ostream &ost)
void init_affine_group(int n, field_theory::finite_field *F, int f_semilinear, actions::action *A, int verbose_level)
void GL_print_for_make_element(int *Elt, std::ostream &ost)
void init_base_projective(actions::action *A, int verbose_level)
void init_base_general_linear(actions::action *A, int verbose_level)
void GL_mult_internal(int *A, int *B, int *AB, int verbose_level)
void base_and_transversal_length(int base_len, long int *base, int *transversal_length, int verbose_level)
void put_digit(uchar *elt, int i, int j, int d)
void GL_invert_internal(int *A, int *Ainv, int verbose_level)
void init_base(actions::action *A, int verbose_level)
void GL_mult(int *A, int *B, int *AB, int verbose_level)
void decode_matrix(int *Elt, int n, uchar *elt)
void GL_print_for_make_element_no_commas(int *Elt, std::ostream &ost)
long int GL_image_of_AG_element(int *Elt, long int a, int verbose_level)
void make_element(int *Elt, int *data, int verbose_level)
void setup_page_storage(int page_length_log, int verbose_level)
void matrix_minor(int *Elt, int *Elt1, matrix_group *mtx1, int f, int verbose_level)
void GL_transpose_internal(int *A, int *At, int verbose_level)
void strong_generators_low_level(int *&data, int &size, int &nb_gens, int verbose_level)
void GL_print_easy_latex(int *Elt, std::ostream &ost)
void orthogonal_group_random_generator(actions::action *A, orthogonal_geometry::orthogonal *O, int f_siegel, int f_reflection, int f_similarity, int f_semisimilarity, int *Elt, int verbose_level)
void GL_print_latex(int *Elt, std::ostream &ost)
void GL_print_easy_latex_with_option_numerical(int *Elt, int f_numerical, std::ostream &ost)
void GL_unpack(uchar *elt, int *Elt, int verbose_level)
void GL_transpose(int *A, int *At, int verbose_level)
void encode_matrix(int *Elt, int n, uchar *elt)
void action_from_the_right_all_types(int *v, int *A, int *vA, int verbose_level)
void projective_action_from_the_right(int *v, int *A, int *vA, int verbose_level)
void init_projective_group(int n, field_theory::finite_field *F, int f_semilinear, actions::action *A, int verbose_level)
data_structures::page_storage * Elts
Definition: groups.h:387
void GL_print_latex_with_print_point_function(int *Elt, std::ostream &ost, void(*point_label)(std::stringstream &sstr, int pt, void *data), void *point_label_data)
void general_linear_action_from_the_right(int *v, int *A, int *vA, int verbose_level)
void matrices_without_eigenvector_one(sims *S, int *&Sol, int &cnt, int f_path_select, int select_value, int verbose_level)
void init_general_linear_group(int n, field_theory::finite_field *F, int f_semilinear, actions::action *A, int verbose_level)
long int GL_image_of_PG_element(int *Elt, long int a, int verbose_level)
long int image_of_element(int *Elt, long int a, int verbose_level)
void substitute_surface_equation(int *Elt, int *coeff_in, int *coeff_out, algebraic_geometry::surface_domain *Surf, int verbose_level)
void init_base_affine(actions::action *A, int verbose_level)
a permutation group represented via a stabilizer chain
Definition: groups.h:1273
void group_order(ring_theory::longinteger_object &go)
Definition: sims.cpp:951
void element_unrank_lint(long int rk, int *Elt, int verbose_level)
Definition: sims.cpp:1326
#define PAGE_LENGTH_LOG
Definition: foundations.h:210
#define NEW_uchar(n)
Definition: foundations.h:634
#define FREE_uchar(p)
Definition: foundations.h:647
#define FREE_int(p)
Definition: foundations.h:640
#define Int_vec_zero(A, B)
Definition: foundations.h:713
unsigned char uchar
Definition: foundations.h:204
#define NEW_OBJECT(type)
Definition: foundations.h:638
#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 Int_vec_copy(A, B, C)
Definition: foundations.h:693
#define Int_vec_print(A, B, C)
Definition: foundations.h:685
the orbiter library for the classification of combinatorial objects