17namespace layer5_applications {
93 int *input_basis,
int basis_sz,
94 int *basis_after_trace,
int *transporter,
95 int &trace_po,
int &trace_so,
100 int f_v = (verbose_level >= 1);
101 int f_vv = (verbose_level >= 2);
102 int i, j, idx, d, d0, po, c0, c1;
105 cout <<
"semifield_trace::trace_very_general" << endl;
108 cout <<
"semifield_trace::trace_very_general "
109 "input basis:" << endl;
114 cout <<
"does not satisfy the partial semifield condition" << endl;
130 for (i = 0; i <
k; i++) {
131 for (j = 0; j <
k; j++) {
132 M1[i *
n + j] = input_basis[i *
k + j];
135 for (i =
k; i <
n; i++) {
141 cout <<
"transformation matrix transporter=" << endl;
143 cout <<
"transformation matrix M1=" << endl;
150 0, basis_sz, verbose_level);
152 cout <<
"semifield_trace::trace_very_general "
153 "after transform (1):" << endl;
157 cout <<
"semifield_trace::trace_very_general "
158 "basis_tmp is not the identity matrix" << endl;
174 cout <<
"semifield_starter::trace_very_general "
175 "the second matrix belongs to conjugacy class "
176 << idx <<
" which is in down orbit " << d << endl;
185 1, basis_sz, verbose_level);
187 cout <<
"semifield_trace::trace_very_general "
188 "after transform (2):" << endl;
195 if (c0 != idx && c1 == idx) {
197 cout <<
"Adjusting" << endl;
208 1, basis_sz, verbose_level);
210 cout <<
"semifield_trace::trace_very_general "
211 "after transform because of adjustment:" << endl;
215 for (i = 0; i <
k2; i++) {
216 input_basis[1 *
k2 + i] =
F->
add(
217 input_basis[1 *
k2 + i],
F->
negate(input_basis[i]));
220 cout <<
"semifield_trace::trace_very_general "
221 "after subtracting the identity:" << endl;
227 cout <<
"No adjustment needed" << endl;
233 cout <<
"Applying fusion element" << endl;
236 cout <<
"Fusion_elt[d] == NULL" << endl;
246 0, basis_sz, verbose_level);
248 cout <<
"semifield_starter::trace_very_general "
249 "after transform (3):" << endl;
252 if (input_basis[0] == 0) {
254 for (j = 0; j <
k2; j++) {
255 input_basis[j] =
F->
add(
256 input_basis[j], input_basis[
k2 + j]);
260 if (input_basis[0] == 0) {
261 cout <<
"input_basis[0] == 0" << endl;
264 if (input_basis[0] != 1) {
267 lambda =
F->
inverse(input_basis[0]);
268 for (j = 0; j <
k2; j++) {
269 input_basis[j] =
F->
mult(input_basis[j], lambda);
272 if (input_basis[0] != 1) {
273 cout <<
"input_basis[0] != 1" << endl;
276 if (input_basis[
k2]) {
279 for (j = 0; j <
k2; j++) {
280 input_basis[
k2 + j] =
F->
add(
282 F->
mult(input_basis[j], lambda));
285 if (input_basis[
k]) {
288 for (j = 0; j <
k2; j++) {
289 input_basis[j] =
F->
add(
291 F->
mult(input_basis[
k2 + j], lambda));
294 if (input_basis[
k]) {
295 cout <<
"input_basis[k] (should be zero by now)" << endl;
299 cout <<
"semifield_starter::trace_very_general "
300 "after gauss elimination:" << endl;
306 cout <<
"No fusion" << endl;
311 cout <<
"semifield_trace::trace_very_general "
312 "d0 = " << d0 << endl;
315 cout <<
"Fusion_elt[d0]" << endl;
320 cout <<
"semifield_trace::trace_very_general "
321 "po = " << po << endl;
331 cout <<
"semifield_trace::trace_very_general "
332 "we will now compute the reduced coset reps:" << endl;
338 cout <<
"semifield_trace::trace_very_general base_cols=";
342 for (i = 0; i < 2; i++) {
343 for (j = 2; j < basis_sz; j++) {
350 cout <<
"semifield_trace::trace_very_general "
351 "reduced basis=" << endl;
353 cout <<
"Which is:" << endl;
358 cout <<
"does not satisfy the partial "
359 "semifield condition" << endl;
369 int a, a_local, pos, so;
383 cout <<
"semifield_trace::trace_very_general "
387 a_local = Level_two_down[po].find_point(a);
389 cout <<
"semifield_trace::trace_very_general "
390 "a_local = " << a_local << endl;
393 pos = Level_two_down[po].Sch->orbit_inv[a_local];
394 so = Level_two_down[po].Sch->orbit_number(a_local);
398 cout <<
"semifield_trace::trace_very_general "
399 "so = " << so << endl;
404 Level_two_down[po].Sch->coset_rep_inv(pos);
406 Level_two_down[po].Sch->cosetrep,
411 apply_element_and_copy_back(
412 Level_two_down[po].Sch->cosetrep,
414 2, basis_sz, verbose_level);
416 for (i = 2; i < basis_sz; i++) {
417 SF->A_on_S->compute_image_low_level(
418 Level_two_down[po].Sch->cosetrep,
419 input_basis + i *
k2,
424 input_basis + 2 *
k2,
425 (basis_sz - 2) *
k2);
428 cout <<
"semifield_trace::trace_very_general "
429 "after transforming with cosetrep from "
430 "secondary orbit (4):" << endl;
431 basis_print(input_basis, basis_sz);
436 cout <<
"semifield_trace::trace_very_general "
441 for (i = 0; i < 2; i++) {
442 for (j = 2; j < basis_sz; j++) {
443 F->Gauss_step(input_basis + i *
k2,
444 input_basis + j *
k2,
k2,
450 cout <<
"semifield_trace::trace_very_general "
451 "reduced basis(2)=" << endl;
452 int_matrix_print(input_basis, basis_sz,
k2);
453 cout <<
"Which is:" << endl;
454 basis_print(input_basis, basis_sz);
458 if (!test_partial_semifield(input_basis,
460 cout <<
"does not satisfy the partial semifield condition" << endl;
466 if (cur_level >= 3) {
471 cout <<
"semifield_trace::trace_very_general "
472 "keep going since cur_level >= 3" << endl;
473 cout <<
"po=" << po <<
" so=" << so << endl;
478 middle_layer_node *M;
481 D1 = Level_three_down;
482 M = Level_two_middle;
494 if (!test_partial_semifield(input_basis,
496 cout <<
"does not satisfy the partial "
497 "semifield condition" << endl;
507 if (cur_level >= 4) {
512 cout <<
"semifield_trace::trace_very_general "
513 "keep going since cur_level >= 4" << endl;
514 cout <<
"po=" << po <<
" so=" << so << endl;
519 semifield_middle_layer_node *M;
521 D = Level_three_down;
522 D1 = Level_four_down;
523 M = Level_three_middle;
535 if (!test_partial_semifield(input_basis,
537 cout <<
"does not satisfy the partial "
538 "semifield condition" << endl;
551 cout <<
"semifield_trace::trace_very_general done" << endl;
558 int *input_basis,
int basis_sz,
int *transporter,
561 int f_v = (verbose_level >= 1);
562 int f_vv = (verbose_level >= 2);
570 cout <<
"semifield_trace::trace_to_level_three" << endl;
576 input_basis, basis_sz,
basis_tmp, transporter,
580 semifield_downstep_node *D;
581 semifield_downstep_node *D1;
582 semifield_middle_layer_node *M;
585 D1 = Level_three_down;
586 M = Level_two_middle;
589 cout <<
"semifield_trace::trace_to_level_three "
590 "before trace_step_up" << endl;
606 cout <<
"semifield_trace::trace_to_level_three "
613void semifield_trace::trace_general(
614 int cur_level,
int cur_po,
int cur_so,
615 int *input_basis,
int *basis_after_trace,
int *transporter,
616 int &trace_po,
int &trace_so,
621 int f_v = (verbose_level >= 1);
624 cout <<
"semifield_trace::trace_general "
625 "before trace_very_general" << endl;
635 cout <<
"semifield_trace::trace_general "
636 "after trace_very_general" << endl;
640void semifield_trace::trace_step(
643 int *changed_basis,
int basis_sz,
int *basis_tmp,
644 int *transporter,
int *ELT3,
645 semifield_downstep_node *D,
646 semifield_downstep_node *D1,
647 semifield_middle_layer_node *M,
650 int f_v = (verbose_level >= 1);
653 cout <<
"semifield_trace::trace_step "
654 "step = " << step << endl;
668 trace_step_down(step,
680 cout <<
"semifield_trace::trace_step "
681 "step = " << step <<
" done" << endl;
686void semifield_trace::trace_step_up(
689 int *changed_basis,
int basis_sz,
int *basis_tmp,
690 int *transporter,
int *ELT3,
691 semifield_downstep_node *D,
692 semifield_downstep_node *D1,
693 semifield_middle_layer_node *M,
696 int f_v = (verbose_level >= 1);
697 int f_vv = (verbose_level >= 1);
702 cout <<
"semifield_trace::trace_step_up "
703 "step = " << step << endl;
705 mo = D[po].first_middle_orbit + so;
707 cout <<
"semifield_trace::trace_step_up "
708 "mo = " << mo << endl;
710 if (M[mo].f_fusion_node) {
712 cout <<
"semifield_trace::trace_step_up "
713 "fusion node" << endl;
715 m0 = M[mo].fusion_with;
721 apply_element_and_copy_back(M[mo].fusion_elt,
723 0, basis_sz, verbose_level);
725 for (i = 0; i < basis_sz; i++) {
726 SF->A_on_S->compute_image_low_level(
728 changed_basis + i *
k2,
733 changed_basis + 0 *
k2,
734 (basis_sz - 0) *
k2);
737 cout <<
"semifield_trace::trace_step_up "
738 "after fusion:" << endl;
739 int_matrix_print(changed_basis, basis_sz,
k2);
740 basis_print(changed_basis, basis_sz);
743 if (!test_partial_semifield(changed_basis,
745 cout <<
"does not satisfy the partial semifield condition" << endl;
755 cout <<
"semifield_trace::trace_step_up "
756 "m0 = " << m0 << endl;
758 po = M[m0].upstep_orbit;
760 cout <<
"semifield_trace::trace_step_up "
761 "po = " << po << endl;
764 cout <<
"semifield_trace::trace_step_up "
772 get_pivots(step , M[m0].upstep_orbit,
773 pivots, verbose_level - 3);
776 cout <<
"semifield_trace::trace_step_up "
778 int_vec_print(cout, pivots, step);
781 F->Gauss_int_with_given_pivots(
791 cout <<
"semifield_trace::trace_step_up "
792 "after Gauss_int_with_given_pivots:" << endl;
793 int_matrix_print(changed_basis, basis_sz,
k2);
796 if (!test_partial_semifield(changed_basis,
798 cout <<
"does not satisfy the partial "
799 "semifield condition" << endl;
803 for (i = 0; i < step; i++) {
804 for (j = step; j < basis_sz; j++) {
805 F->Gauss_step(changed_basis + i *
k2,
806 changed_basis + j *
k2,
k2,
811 cout <<
"semifield_trace::trace_step_up "
812 "after reducing:" << endl;
813 int_matrix_print(changed_basis, basis_sz,
k2);
814 basis_print(changed_basis, basis_sz);
817 if (!test_partial_semifield(changed_basis,
819 cout <<
"does not satisfy the partial semifield condition" << endl;
826 cout <<
"semifield_trace::trace_step_up "
827 "step = " << step <<
" done" << endl;
831void semifield_trace::trace_step_down(
834 int *changed_basis,
int basis_sz,
int *basis_tmp,
835 int *transporter,
int *ELT3,
836 semifield_downstep_node *D,
837 semifield_downstep_node *D1,
838 semifield_middle_layer_node *M,
841 int f_v = (verbose_level >= 1);
842 int f_vv = (verbose_level >= 1);
846 cout <<
"semifield_trace::trace_step_down "
847 "step = " << step << endl;
850 cout <<
"Elt " << step << endl;
851 int_matrix_print(changed_basis + step *
k2,
k,
k);
853 a = matrix_rank(changed_basis + step *
k2);
855 cout <<
"semifield_trace::trace_step_down "
856 "a = " << a <<
" po = " << po << endl;
859 a_local = D1[po].find_point(a);
861 cout <<
"semifield_trace::trace_step_down "
862 "a_local = " << a_local << endl;
865 pos = D1[po].Sch->orbit_inv[a_local];
866 so = D1[po].Sch->orbit_number(a_local);
871 cout <<
"semifield_trace::trace_step_down "
872 "so = " << so << endl;
874 D1[po].Sch->coset_rep_inv(pos);
876 D1[po].Sch->cosetrep,
880 apply_element_and_copy_back(D1[po].Sch->cosetrep,
882 step, basis_sz, verbose_level);
884 for (i = step; i < basis_sz; i++) {
885 SF->A_on_S->compute_image_low_level(
886 D1[po].Sch->cosetrep,
887 changed_basis + i *
k2,
892 changed_basis + step *
k2,
893 (basis_sz - step) *
k2);
896 cout <<
"semifield_trace::trace_step_down "
897 "after transforming with cosetrep from "
898 "secondary orbit:" << endl;
899 basis_print(changed_basis, basis_sz);
901 for (i = 0; i < basis_sz; i++) {
902 cout <<
"Elt i = " << i << endl;
903 int_matrix_print(changed_basis + i *
k2,
k,
k);
908 cout <<
"semifield_trace::trace_step_down "
909 "step = " << step <<
" done" << endl;
conjugacy class in GL(n,q) described using rational normal form
int find_class_rep(gl_class_rep *Reps, int nb_reps, gl_class_rep *R, int verbose_level)
void identify_matrix(int *Mtx, gl_class_rep *R, int *Basis, int verbose_level)
linear_algebra::linear_algebra * Linear_algebra
int is_identity_matrix(int *A, int n)
void Gauss_step(int *v1, int *v2, int len, int idx, int verbose_level)
void element_mult(void *a, void *b, void *ab, int verbose_level)
void make_element(int *Elt, int *data, int verbose_level)
void element_move(void *a, void *b, int verbose_level)
field_theory::finite_field * GFq
groups::matrix_group * Mtx
void basis_print(int *Mtx, int sz)
int test_partial_semifield(int *Basis, int n, int verbose_level)
void apply_element_and_copy_back(int *Elt, int *basis_in, int *basis_out, int first, int last_plus_one, int verbose_level)
long int matrix_rank(int *Mtx)
auxiliary class for classifying semifields
int * class_to_flag_orbit
algebra::gl_class_rep * R
int ** class_rep_plus_I_Basis_inv
void multiply_to_the_right(int *ELT1, int *Mtx, int *ELT2, int *ELT3, int verbose_level)
One step of lifting for classifying semifields.
field_theory::finite_field * F
void init(semifield_lifting *SL)
algebra::gl_class_rep * R1
void trace_very_general(int cur_level, int *input_basis, int basis_sz, int *basis_after_trace, int *transporter, int &trace_po, int &trace_so, int verbose_level)
#define Int_vec_zero(A, B)
#define Int_matrix_print(A, B, C)
#define Int_vec_print(A, B, C)
the orbiter library for the classification of combinatorial objects