Orbiter 2022
Combinatorial Objects
orthogonal_group.cpp
Go to the documentation of this file.
1/*
2 * orthogonal_group.cpp
3 *
4 * Created on: Oct 31, 2019
5 * Author: betten
6 */
7
8
9
10#include "foundations.h"
11
12using namespace std;
13
14
15namespace orbiter {
16namespace layer1_foundations {
17namespace orthogonal_geometry {
18
19
20long int orthogonal::find_root(long int rk2, int verbose_level)
21{
22 int f_v = (verbose_level >= 1);
23 long int ret;
24
25 if (f_v) {
26 cout << "orthogonal::find_root" << endl;
27 }
28 if (epsilon == 1) {
29 ret = find_root_hyperbolic(rk2, m, verbose_level);
30 }
31 else if (epsilon == 0) {
32 ret = find_root_parabolic(rk2, verbose_level);
33 }
34 else {
35 cout << "orthogonal::find_root epsilon = " << epsilon << endl;
36 exit(1);
37 }
38 if (f_v) {
39 cout << "orthogonal::find_root done" << endl;
40 }
41 return ret;
42}
43
44
46 long int rk_from, long int rk_to, long int root, int verbose_level)
47{
48 int f_v = (verbose_level >= 1);
49
50 if (f_v) {
51 cout << "orthogonal::Siegel_map_between_singular_points" << endl;
52 }
54 rk_from, rk_to, root,
55 epsilon, n,
57 verbose_level);
58 if (f_v) {
59 cout << "orthogonal::Siegel_map_between_singular_points done" << endl;
60 }
61}
62
64 long int rk_from, long int rk_to, long int root, int m, int verbose_level)
65{
66 int f_v = (verbose_level >= 1);
67 int *Gram;
68
69 if (f_v) {
70 cout << "orthogonal::Siegel_map_between_singular_points_hyperbolic" << endl;
71 }
73 1, 2 * m - 1, 0,0,0, Gram, verbose_level - 1);
75 rk_from, rk_to, root,
76 epsilon, 2 * m,
77 0, 0, 0, Gram,
78 verbose_level);
79 FREE_int(Gram);
80 if (f_v) {
81 cout << "orthogonal::Siegel_map_between_singular_points_hyperbolic done" << endl;
82 }
83}
84
86 long int rk_from, long int rk_to, long int root,
87 int verbose_level)
88// root is not perp to from and to.
89{
90 int f_v = (verbose_level >= 1);
91
92 if (f_v) {
93 cout << "Siegel_Transformation rk_from=" << rk_from
94 << " rk_to=" << rk_to << " root=" << root << endl;
95 }
97 rk_from, rk_to, root,
99 verbose_level);
100 if (f_v) {
101 cout << "Siegel_Transformation done" << endl;
102 }
103}
104
106 long int rk_from, long int rk_to, long int root,
107 int *B, int *Bv, int *w, int *z, int *x,
108 int verbose_level)
109{
110 int f_v = (verbose_level >= 1);
111 int f_vv = (verbose_level >= 2);
112 int *From, *To, *Root;
113
114 if (f_v) {
115 cout << "orthogonal::Siegel_Transformation2" << endl;
116 }
117 From = NEW_int(n);
118 To = NEW_int(n);
119 Root = NEW_int(n);
120 unrank_point(Root, 1, root, verbose_level - 1);
121 unrank_point(From, 1, rk_from, verbose_level - 1);
122 unrank_point(To, 1, rk_to, verbose_level - 1);
123 if (f_vv) {
124 cout << "root: ";
125 Int_vec_print(cout, Root, n);
126 cout << endl;
127 cout << "rk_from: ";
128 Int_vec_print(cout, From, n);
129 cout << endl;
130 cout << "rk_to: ";
131 Int_vec_print(cout, To, n);
132 cout << endl;
133 }
134
136 From, To, Root,
137 B, Bv, w, z, x,
138 verbose_level - 1);
139 FREE_int(From);
140 FREE_int(To);
141 FREE_int(Root);
142 if (f_vv) {
143 cout << "the Siegel transformation is:" << endl;
145 }
146 if (f_v) {
147 cout << "orthogonal::Siegel_Transformation2 done" << endl;
148 }
149}
150
152 int *from, int *to, int *root,
153 int *B, int *Bv, int *w, int *z, int *x,
154 int verbose_level)
155{
156 int i, j, a, b, av, bv, minus_one;
157 //int k;
158 int *Gram;
159 int f_v = (verbose_level >= 1);
160 int f_vv = (verbose_level >= 2);
162
163 if (f_v) {
164 cout << "orthogonal::Siegel_Transformation3" << endl;
165 }
166 //k = n - 1;
167 Gram = Gram_matrix;
168 if (f_vv) {
169 cout << "n=" << n << endl;
170 cout << "Gram matrix:" << endl;
171 Combi.print_int_matrix(cout, Gram, n, n);
172 }
173
174 //Q_epsilon_unrank(*F, B, 1, epsilon, k,
175 //form_c1, form_c2, form_c3, root);
176 //Q_epsilon_unrank(*F, B + d, 1, epsilon, k,
177 //form_c1, form_c2, form_c3, rk_from);
178 //Q_epsilon_unrank(*F, w, 1, epsilon, k,
179 //form_c1, form_c2, form_c3, rk_to);
180
181 for (i = 0; i < n; i++) {
182 B[i] = root[i];
183 B[n + i] = from[i];
184 w[i] = to[i];
185 }
186 if (f_vv) {
187 cout << "root: ";
188 Int_vec_print(cout, B, n);
189 cout << endl;
190 cout << "from: ";
191 Int_vec_print(cout, B + n, n);
192 cout << endl;
193 cout << "to: ";
194 Int_vec_print(cout, w, n);
195 cout << endl;
196 }
197
198 a = F->Linear_algebra->evaluate_bilinear_form(B, B + n, n, Gram);
199 b = F->Linear_algebra->evaluate_bilinear_form(B, w, n, Gram);
200 av = F->inverse(a);
201 bv = F->inverse(b);
202 for (i = 0; i < n; i++) {
203 B[n + i] = F->mult(B[n + i], av);
204 w[i] = F->mult(w[i], bv);
205 }
206 for (i = 2; i < n; i++) {
207 for (j = 0; j < n; j++) {
208 B[i * n + j] = 0;
209 }
210 }
211
212 if (f_vv) {
213 cout << "before perp, the matrix B is:" << endl;
215 }
216 F->Linear_algebra->perp(n, 2, B, Gram, 0 /* verbose_level */);
217 if (f_vv) {
218 cout << "the matrix B is:" << endl;
220 }
221 F->Linear_algebra->invert_matrix(B, Bv, n, 0 /* verbose_level */);
222 if (f_vv) {
223 cout << "the matrix Bv is:" << endl;
225 }
226 F->Linear_algebra->mult_matrix_matrix(w, Bv, z, 1, n, n,
227 0 /* verbose_level */);
228 if (f_vv) {
229 cout << "the coefficient vector z is:" << endl;
230 Int_vec_print_integer_matrix(cout, z, 1, n);
231 }
232 z[0] = 0;
233 z[1] = 0;
234 if (f_vv) {
235 cout << "the coefficient vector z is:" << endl;
236 Int_vec_print_integer_matrix(cout, z, 1, n);
237 }
238 F->Linear_algebra->mult_matrix_matrix(z, B, x, 1, n, n,
239 0 /* verbose_level */);
240 if (f_vv) {
241 cout << "the vector x is:" << endl;
242 Int_vec_print_integer_matrix(cout, x, 1, n);
243 }
244 minus_one = F->negate(1);
245 for (i = 0; i < n; i++) {
246 x[i] = F->mult(x[i], minus_one);
247 }
248 if (f_vv) {
249 cout << "the vector -x is:" << endl;
250 Int_vec_print_integer_matrix(cout, x, 1, n);
251 }
252 make_Siegel_Transformation(T, x, B, n, Gram, FALSE);
253 if (f_vv) {
254 cout << "the Siegel transformation is:" << endl;
256 }
257 if (f_v) {
258 cout << "orthogonal::Siegel_Transformation3 done" << endl;
259 }
260}
261
263 int f_action_is_semilinear,
264 int f_siegel,
265 int f_reflection,
266 int f_similarity,
267 int f_semisimilarity,
268 int *Mtx, int verbose_level)
269{
270 int f_v = (verbose_level >= 1);
271 int f_vv = (verbose_level >= 2);
272 int r;
274
275 if (f_v) {
276 cout << "orthogonal::random_generator_for_orthogonal_group" << endl;
277 cout << "f_action_is_semilinear=" << f_action_is_semilinear << endl;
278 cout << "f_siegel=" << f_siegel << endl;
279 cout << "f_reflection=" << f_reflection << endl;
280 cout << "f_similarity=" << f_similarity << endl;
281 cout << "f_semisimilarity=" << f_semisimilarity << endl;
282 }
283
284
285 while (TRUE) {
286 r = Os.random_integer(4);
287 if (r == 0 && f_siegel) {
288 break;
289 }
290 else if (r == 1 && f_reflection) {
291 break;
292 }
293 else if (r == 2 && f_similarity) {
294 break;
295 }
296 else if (r == 3 && f_semisimilarity) {
297 if (!f_action_is_semilinear) {
298 continue;
299 }
300 break;
301 }
302 }
303
304 if (r == 0) {
305 if (f_vv) {
306 cout << "orthogonal::random_generator_for_orthogonal_group "
307 "choosing Siegel_transformation" << endl;
308 }
309 create_random_Siegel_transformation(Mtx, verbose_level /*- 2 */);
310 if (f_action_is_semilinear) {
311 Mtx[n * n] = 0;
312 }
313 }
314 else if (r == 1) {
315 if (f_vv) {
316 cout << "orthogonal::random_generator_for_orthogonal_group "
317 "choosing orthogonal reflection" << endl;
318 }
319
320 create_random_orthogonal_reflection(Mtx, verbose_level - 2);
321 if (f_action_is_semilinear) {
322 Mtx[n * n] = 0;
323 }
324 }
325 else if (r == 2) {
326 if (f_vv) {
327 cout << "orthogonal::random_generator_for_orthogonal_group "
328 "choosing similarity" << endl;
329 }
330 create_random_similarity(Mtx, verbose_level - 2);
331 if (f_action_is_semilinear) {
332 Mtx[n * n] = 0;
333 }
334 }
335 else if (r == 3) {
336 if (f_vv) {
337 cout << "orthogonal::random_generator_for_orthogonal_group "
338 "choosing random similarity" << endl;
339 }
340 create_random_semisimilarity(Mtx, verbose_level - 2);
341 }
342 if (f_v) {
343 cout << "orthogonal::random_generator_for_orthogonal_group "
344 "done" << endl;
345 }
346}
347
348
350 int *Mtx, int verbose_level)
351// Only makes a n x n matrix. Does not put a semilinear component.
352{
353 int f_v = (verbose_level >= 1);
354 int f_vv = (verbose_level >= 2);
355 int rk_u, alpha, i;
356 int nb_pts; //, nb_pts_affine;
357 int k = m; // the Witt index, previously orthogonal_k;
358 int d = n;
359 int *u, *v;
361
362 if (f_v) {
363 cout << "orthogonal::create_random_Siegel_transformation" << endl;
364 }
365
366 u = NEW_int(d);
367 v = NEW_int(d);
368
369 nb_pts = nb_points; //nb_pts_Qepsilon(epsilon, d - 1, q);
370 //nb_pts_affine = i_power_j(q, d);
371
372 if (f_v) {
373 cout << "orthogonal::create_random_Siegel_transformation "
374 "q=" << q << endl;
375 cout << "orthogonal::create_random_Siegel_transformation "
376 "d=" << d << endl;
377 cout << "orthogonal::create_random_Siegel_transformation "
378 "Witt index k=" << k << endl;
379 cout << "orthogonal::create_random_Siegel_transformation "
380 "nb_pts=" << nb_pts << endl;
381 //cout << "orthogonal::create_random_Siegel_transformation "
382 // "nb_pts_affine=" << nb_pts_affine << endl;
383 }
384
385 rk_u = Os.random_integer(nb_pts);
386 if (f_v) {
387 cout << "orthogonal::create_random_Siegel_transformation "
388 "rk_u=" << rk_u << endl;
389 }
390 unrank_point(u, 1, rk_u, 0 /* verbose_level*/);
391 //Q_epsilon_unrank(*F, u, 1 /*stride*/, epsilon, d - 1,
392 // form_c1, form_c2, form_c3, rk_u);
393
394 while (TRUE) {
395
396#if 0
397 rk_v = random_integer(nb_pts_affine);
398 if (f_v) {
399 cout << "orthogonal::create_random_Siegel_transformation "
400 "trying rk_v=" << rk_v << endl;
401 }
402 AG_element_unrank(q, v, 1 /* stride */, d, rk_v);
403#else
404 for (i = 0; i < d; i++) {
405 v[i] = Os.random_integer(q);
406 }
407
408#endif
409
411 u, v, d, Gram_matrix);
412 if (alpha == 0) {
413 if (f_v) {
414 cout << "orthogonal::create_random_Siegel_transformation "
415 "it works" << endl;
416 }
417 break;
418 }
419 if (f_v) {
420 cout << "orthogonal::create_random_Siegel_transformation "
421 "fail, try again" << endl;
422 }
423 }
424 if (f_vv) {
425 cout << "rk_u = " << rk_u << " : ";
426 Int_vec_print(cout, u, d);
427 cout << endl;
428 //cout << "rk_v = " << rk_v << " : ";
429 cout << "v=";
430 Int_vec_print(cout, v, d);
431 cout << endl;
432 }
433
435 epsilon, d - 1,
437 Mtx, v, u, verbose_level - 1);
438
439 if (f_vv) {
440 cout << "form_c1=" << form_c1 << endl;
441 cout << "form_c2=" << form_c2 << endl;
442 cout << "form_c3=" << form_c3 << endl;
443 cout << "\\rho_{";
444 Int_vec_print(cout, u, d);
445 cout << ",";
446 Int_vec_print(cout, v, d);
447 cout << "}=" << endl;
448 Int_matrix_print(Mtx, d, d);
449 }
450 FREE_int(u);
451 FREE_int(v);
452 if (f_v) {
453 cout << "orthogonal::create_random_Siegel_transformation "
454 "done" << endl;
455 }
456}
457
458
459void orthogonal::create_random_semisimilarity(int *Mtx, int verbose_level)
460{
461 int f_v = (verbose_level >= 1);
462 //int f_vv = (verbose_level >= 2);
463 int d = n;
464 int i, a, b, c, k;
466
467 if (f_v) {
468 cout << "orthogonal::create_random_semisimilarity" << endl;
469 }
470 for (i = 0; i < d * d; i++) {
471 Mtx[i] = 0;
472 }
473 for (i = 0; i < d; i++) {
474 Mtx[i * d + i] = 1;
475 }
476
477#if 0
478 if (!f_semilinear) {
479 return;
480 }
481#endif
482
483 if (epsilon == 1) {
484 Mtx[d * d] = Os.random_integer(F->e);
485 }
486 else if (epsilon == 0) {
487 Mtx[d * d] = Os.random_integer(F->e);
488 }
489 else if (epsilon == -1) {
490 if (q == 4) {
491 int u, v, w, x;
492
493 Mtx[d * d] = 1;
494 for (i = 0; i < d - 2; i++) {
495 if (EVEN(i)) {
496 Mtx[i * d + i] = 3;
497 Mtx[(i + 1) * d + i + 1] = 2;
498 }
499 }
500 u = 1;
501 v = 0;
502 w = 3;
503 x = 1;
504 Mtx[(d - 2) * d + d - 2] = u;
505 Mtx[(d - 2) * d + d - 1] = v;
506 Mtx[(d - 1) * d + d - 2] = w;
507 Mtx[(d - 1) * d + d - 1] = x;
508 }
509 else if (EVEN(q)) {
510 cout << "orthogonal::create_random_semisimilarity "
511 "semisimilarity for even characteristic and "
512 "q != 4 not yet implemented" << endl;
513 exit(1);
514 }
515 else {
516 k = (F->p - 1) >> 1;
517 a = F->primitive_element();
518 b = F->power(a, k);
519 c = F->frobenius_power(b, F->e - 1);
520 Mtx[d * d - 1] = c;
521 Mtx[d * d] = 1;
522 cout << "orthogonal::create_random_semisimilarity "
523 "k=(p-1)/2=" << k << " a=prim elt=" << a
524 << " b=a^k=" << b << " c=b^{p^{h-1}}=" << c << endl;
525
526 }
527 }
528
529 if (f_v) {
530 cout << "orthogonal::create_random_semisimilarity done" << endl;
531 }
532}
533
534
535void orthogonal::create_random_similarity(int *Mtx, int verbose_level)
536// Only makes a n x n matrix. Does not put a semilinear component.
537{
538 int f_v = (verbose_level >= 1);
539 int f_vv = (verbose_level >= 2);
540 int d = n;
541 int i, r, r2;
543
544 if (f_v) {
545 cout << "orthogonal::create_random_similarity" << endl;
546 }
547 for (i = 0; i < d * d; i++) {
548 Mtx[i] = 0;
549 }
550#if 0
551 if (f_semilinear) {
552 Mtx[d * d] = 0;
553 }
554#endif
555 for (i = 0; i < d; i++) {
556 Mtx[i * d + i] = 1;
557 }
558 r = Os.random_integer(q - 1) + 1;
559 if (f_vv) {
560 cout << "orthogonal::create_random_similarity "
561 "r=" << r << endl;
562 }
563 if (epsilon == 1) {
564 for (i = 0; i < d; i++) {
565 if (EVEN(i)) {
566 Mtx[i * d + i] = r;
567 }
568 }
569 }
570 else if (epsilon == 0) {
571 r2 = F->mult(r, r);
572 if (f_vv) {
573 cout << "orthogonal::create_random_similarity "
574 "r2=" << r2 << endl;
575 }
576 Mtx[0 * d + 0] = r;
577 for (i = 1; i < d; i++) {
578 if (EVEN(i - 1)) {
579 Mtx[i * d + i] = r2;
580 }
581 }
582 }
583 else if (epsilon == -1) {
584 r2 = F->mult(r, r);
585 for (i = 0; i < d - 2; i++) {
586 if (EVEN(i)) {
587 Mtx[i * d + i] = r2;
588 }
589 }
590 i = d - 2;
591 Mtx[i * d + i] = r;
592 i = d - 1;
593 Mtx[i * d + i] = r;
594 }
595 if (f_v) {
596 cout << "orthogonal::create_random_similarity done" << endl;
597 }
598}
599
601 int *Mtx, int verbose_level)
602// Only makes a n x n matrix. Does not put a semilinear component.
603{
604 int f_v = (verbose_level >= 1);
605 int f_vv = (verbose_level >= 2);
606 int alpha;
607 int i;
608 //int rk_z;
609 //int nb_pts_affine;
610 int d = n;
611 int cnt;
612 int *z;
615
616
617 if (f_v) {
618 cout << "orthogonal::create_random_orthogonal_reflection" << endl;
619 cout << "verbose_level=" << verbose_level << endl;
620 }
621
622 z = NEW_int(d);
623
624#if 0
625 nb_pts_affine = i_power_j(q, d);
626 if (f_v) {
627 cout << "orthogonal::create_random_orthogonal_reflection" << endl;
628 cout << "nb_pts_affine=" << nb_pts_affine << endl;
629 }
630#endif
631
632 cnt = 0;
633 while (TRUE) {
634 if (f_v) {
635 cout << "orthogonal::create_random_orthogonal_reflection "
636 "iteration = " << cnt << endl;
637 }
638
639#if 0
640 rk_z = random_integer(nb_pts_affine);
641 if (f_v) {
642 cout << "orthogonal::create_random_orthogonal_reflection "
643 "iteration = " << cnt
644 << " trying rk_z=" << rk_z << endl;
645 }
646
647 AG_element_unrank(q, z, 1 /* stride */, d, rk_z);
648#else
649 for (i = 0; i < d; i++) {
650 z[i] = Os.random_integer(q);
651 }
652#endif
653
654 if (f_v) {
655 cout << "orthogonal::create_random_orthogonal_reflection "
656 "trying ";
657 Int_vec_print(cout, z, d);
658 cout << endl;
659 }
660
661 alpha = evaluate_quadratic_form(z, 1 /* stride */);
662 if (f_v) {
663 cout << "orthogonal::create_random_orthogonal_reflection "
664 "value of the quadratic form is " << alpha << endl;
665 }
666 if (alpha) {
667 break;
668 }
669 cnt++;
670 }
671 if (f_vv) {
672 cout << "orthogonal::create_random_orthogonal_reflection "
673 "cnt=" << cnt
674 //"rk_z = " << rk_z
675 << " alpha = " << alpha << " : ";
676 Int_vec_print(cout, z, d);
677 cout << endl;
678 }
679
680 if (f_v) {
681 cout << "orthogonal::create_random_orthogonal_reflection "
682 "before make_orthogonal_reflection" << endl;
683 }
684
685 make_orthogonal_reflection(Mtx, z, verbose_level - 1);
686
687 if (f_v) {
688 cout << "orthogonal::create_random_orthogonal_reflection "
689 "after make_orthogonal_reflection" << endl;
690 }
691
692
693
694 {
695 int *new_Gram;
696 new_Gram = NEW_int(d * d);
697
698 if (f_v) {
699 cout << "orthogonal::create_random_orthogonal_reflection "
700 "before transform_form_matrix" << endl;
701 }
702
703 F->Linear_algebra->transform_form_matrix(Mtx, Gram_matrix, new_Gram, d, 0 /* verbose_level */);
704
705 if (f_v) {
706 cout << "orthogonal::create_random_orthogonal_reflection "
707 "after transform_form_matrix" << endl;
708 }
709
710 if (Sorting.int_vec_compare(Gram_matrix, new_Gram, d * d) != 0) {
711 cout << "create_random_orthogonal_reflection "
712 "The Gram matrix is not preserved" << endl;
713 cout << "Gram matrix:" << endl;
715 d, d, d, F->log10_of_q);
716 cout << "transformed Gram matrix:" << endl;
718 d, d, d, F->log10_of_q);
719 exit(1);
720 }
721 FREE_int(new_Gram);
722 }
723
724 FREE_int(z);
725 if (f_v) {
726 cout << "orthogonal::create_random_orthogonal_reflection "
727 "done" << endl;
728 }
729
730}
731
732
734 int *M, int *z, int verbose_level)
735{
736 int f_v = (verbose_level >= 1);
737 int f_vv = (verbose_level >= 2);
738 int Qz, Qzv, i, j;
739
740 if (f_v) {
741 cout << "orthogonal::make_orthogonal_reflection" << endl;
742 }
743 Qz = evaluate_quadratic_form(z, 1);
744 Qzv = F->inverse(Qz);
745 Qzv = F->negate(Qzv);
746
748 for (i = 0; i < n; i++) {
749 for (j = 0; j < n; j++) {
750 M[i * n + j] = F->mult(Qzv, F->mult(ST_w[i], z[j]));
751 if (i == j) {
752 M[i * n + j] = F->add(1, M[i * n + j]);
753 }
754 }
755 }
756
757 if (f_vv) {
758 cout << "orthogonal::make_orthogonal_reflection created:" << endl;
760 }
761 if (f_v) {
762 cout << "orthogonal::make_orthogonal_reflection done" << endl;
763 }
764}
765
766void orthogonal::make_Siegel_Transformation(int *M, int *v, int *u,
767 int n, int *Gram, int verbose_level)
768// if u is singular and v \in \la u \ra^\perp, then
769// \pho_{u,v}(x) := x + \beta(x,v) u - \beta(x,u) v - Q(v) \beta(x,u) u
770// is called the Siegel transform (see Taylor p. 148)
771// Here Q is the quadratic form and \beta is
772// the corresponding bilinear form
773{
774 int f_v = (verbose_level >= 1);
775 int f_vv = (verbose_level >= 2);
776 int i, j, Qv, e;
777
778 if (f_v) {
779 cout << "orthogonal::make_Siegel_Transformation" << endl;
780 }
782 v, 1 /*stride*/,
783 epsilon, n - 1,
786
787
788 // compute w^T := Gram * v^T
789
791
792
793 // M := M + w^T * u
794 for (i = 0; i < n; i++) {
795 for (j = 0; j < n; j++) {
796 e = F->mult(ST_w[i], u[j]);
797 M[i * n + j] = F->add(M[i * n + j], e);
798 }
799 }
800
801 // compute w^T := Gram * u^T
803
804
805
806 // M := M - w^T * v
807 for (i = 0; i < n; i++) {
808 for (j = 0; j < n; j++) {
809 e = F->mult(ST_w[i], v[j]);
810 M[i * n + j] = F->add(M[i * n + j], F->negate(e));
811 }
812 }
813
814 // M := M - Q(v) * w^T * u
815
816 for (i = 0; i < n; i++) {
817 for (j = 0; j < n; j++) {
818 e = F->mult(ST_w[i], u[j]);
819 M[i * n + j] = F->add(M[i * n + j],
820 F->mult(F->negate(e), Qv));
821 }
822 }
823 if (f_vv) {
824 cout << "Siegel matrix:" << endl;
826 F->Linear_algebra->transform_form_matrix(M, Gram, Gram2, n, 0 /* verbose_level */);
827 cout << "transformed Gram matrix:" << endl;
829 cout << endl;
830 }
831 if (f_v) {
832 cout << "orthogonal::make_Siegel_Transformation done" << endl;
833 }
834
835}
836
838 long int rk1, long int rk2, int *v, int *w, int verbose_level)
839{
840 int f_v = (verbose_level >= 1);
841 int f_vv = (verbose_level >= 2);
842 int i;
843
844 if (f_v) {
845 cout << "orthogonal::Siegel_move_forward_by_index" << endl;
846 }
847 if (f_vv) {
848 cout << "orthogonal::Siegel_move_forward_by_index "
849 "rk1=" << rk1 << " rk2=" << rk2 << endl;
850 }
851 if (rk1 == rk2) {
852 for (i = 0; i < n; i++)
853 w[i] = v[i];
854 return;
855 }
856 unrank_point(Sv1, 1, rk1, verbose_level - 1);
857 unrank_point(Sv2, 1, rk2, verbose_level - 1);
858 if (f_vv) {
859 cout << "orthogonal::Siegel_move_forward_by_index" << endl;
860 cout << rk1 << " : ";
861 Int_vec_print(cout, Sv1, n);
862 cout << endl;
863 cout << rk2 << " : ";
864 Int_vec_print(cout, Sv2, n);
865 cout << endl;
866 }
867 Siegel_move_forward(Sv1, Sv2, v, w, verbose_level);
868 if (f_vv) {
869 cout << "orthogonal::Siegel_move_forward_by_index moving forward: ";
870 Int_vec_print(cout, v, n);
871 cout << endl;
872 cout << " to: ";
873 Int_vec_print(cout, w, n);
874 cout << endl;
875 }
876 if (f_v) {
877 cout << "orthogonal::Siegel_move_forward_by_index done" << endl;
878 }
879}
880
882 long int rk1, long int rk2, int *w, int *v, int verbose_level)
883{
884 int f_v = (verbose_level >= 1);
885 int f_vv = (verbose_level >= 2);
886 int i;
887
888 if (f_v) {
889 cout << "orthogonal::Siegel_move_backward_by_index" << endl;
890 }
891 if (f_vv) {
892 cout << "orthogonal::Siegel_move_backward_by_index "
893 "rk1=" << rk1 << " rk2=" << rk2 << endl;
894 }
895 if (rk1 == rk2) {
896 for (i = 0; i < n; i++)
897 v[i] = w[i];
898 return;
899 }
900 unrank_point(Sv1, 1, rk1, verbose_level - 1);
901 unrank_point(Sv2, 1, rk2, verbose_level - 1);
902 if (f_vv) {
903 cout << "orthogonal::Siegel_move_backward_by_index" << endl;
904 cout << rk1 << " : ";
905 Int_vec_print(cout, Sv1, n);
906 cout << endl;
907 cout << rk2 << " : ";
908 Int_vec_print(cout, Sv2, n);
909 cout << endl;
910 }
911 Siegel_move_backward(Sv1, Sv2, w, v, verbose_level);
912 if (f_vv) {
913 cout << "orthogonal::Siegel_move_backward_by_index moving backward: ";
914 Int_vec_print(cout, w, n);
915 cout << endl;
916 cout << " to ";
917 Int_vec_print(cout, v, n);
918 cout << endl;
919 }
920 if (f_v) {
921 cout << "orthogonal::Siegel_move_backward_by_index done" << endl;
922 }
923}
924
926 int *v1, int *v2, int *v3, int *v4, int verbose_level)
927{
928 int f_v = (verbose_level >= 1);
929 int f_vv = (verbose_level >= 2);
930 int rk1_subspace, rk2_subspace, root, i;
931
932 if (f_v) {
933 cout << "orthogonal::Siegel_move_forward" << endl;
934 }
935 if (f_vv) {
936 Int_vec_print(cout, v1, n);
937 cout << endl;
938 Int_vec_print(cout, v2, n);
939 cout << endl;
940 }
941 rk1_subspace = subspace->rank_point(v1, 1, verbose_level - 1);
942 rk2_subspace = subspace->rank_point(v2, 1, verbose_level - 1);
943 if (f_vv) {
944 cout << "orthogonal::Siegel_move_forward rk1_subspace=" << rk1_subspace << endl;
945 cout << "orthogonal::Siegel_move_forward rk2_subspace=" << rk2_subspace << endl;
946 }
947 if (rk1_subspace == rk2_subspace) {
948 for (i = 0; i < n; i++)
949 v4[i] = v3[i];
950 return;
951 }
952
953 root = subspace->find_root_parabolic(rk2_subspace, verbose_level - 2);
954 if (f_vv) {
955 cout << "orthogonal::Siegel_move_forward root=" << root << endl;
956 }
958 rk1_subspace, rk2_subspace, root, verbose_level - 2);
959 F->Linear_algebra->mult_matrix_matrix(v3, T1, v4, 1, n - 2, n - 2,
960 0 /* verbose_level */);
961 v4[n - 2] = v3[n - 2];
962 v4[n - 1] = v3[n - 1];
963 if (f_vv) {
964 cout << "orthogonal::Siegel_move_forward moving: ";
965 Int_vec_print(cout, v3, n);
966 cout << endl;
967 cout << " to ";
968 Int_vec_print(cout, v4, n);
969 cout << endl;
970 }
971 if (f_v) {
972 cout << "orthogonal::Siegel_move_forward done" << endl;
973 }
974}
975
977 int *v1, int *v2, int *v3, int *v4, int verbose_level)
978{
979 int f_v = (verbose_level >= 1);
980 int f_vv = (verbose_level >= 2);
981 long int rk1_subspace, rk2_subspace;
982 long int root;
983 int i;
984
985 if (f_v) {
986 cout << "orthogonal::Siegel_move_backward" << endl;
987 }
988 if (f_vv) {
989 Int_vec_print(cout, v1, n);
990 cout << endl;
991 Int_vec_print(cout, v2, n);
992 cout << endl;
993 }
994 rk1_subspace = subspace->rank_point(v1, 1, verbose_level - 1);
995 rk2_subspace = subspace->rank_point(v2, 1, verbose_level - 1);
996 if (f_vv) {
997 cout << "rk1_subspace=" << rk1_subspace << endl;
998 cout << "rk2_subspace=" << rk2_subspace << endl;
999 }
1000 if (rk1_subspace == rk2_subspace) {
1001 for (i = 0; i < n; i++)
1002 v4[i] = v3[i];
1003 return;
1004 }
1005
1007 rk2_subspace, verbose_level - 2);
1008 if (f_vv) {
1009 cout << "orthogonal::Siegel_move_backward root=" << root << endl;
1010 cout << "orthogonal::Siegel_move_backward image, to be moved back: " << endl;
1011 Int_vec_print(cout, v4, n);
1012 cout << endl;
1013 }
1015 rk1_subspace, rk2_subspace, root, verbose_level - 2);
1016 F->Linear_algebra->invert_matrix(T1, T2, n - 2, 0 /* verbose_level */);
1017 F->Linear_algebra->mult_matrix_matrix(v3, T2, v4, 1, n - 2, n - 2,
1018 0 /* verbose_level */);
1019 v4[n - 2] = v3[n - 2];
1020 v4[n - 1] = v3[n - 1];
1021 if (f_vv) {
1022 cout << "orthogonal::Siegel_move_backward moving: ";
1023 Int_vec_print(cout, v3, n);
1024 cout << endl;
1025 cout << " to ";
1026 Int_vec_print(cout, v4, n);
1027 cout << endl;
1028 }
1029 if (f_v) {
1030 cout << "orthogonal::Siegel_move_backward done" << endl;
1031 }
1032}
1033
1034
1035
1037 long int pt_from, long int pt_to,
1038 int nb, long int *ranks, int verbose_level)
1039{
1040 int *input_coords, *output_coords;
1041 int i;
1042
1043 input_coords = NEW_int(nb * n);
1044 output_coords = NEW_int(nb * n);
1045 for (i = 0; i < nb; i++) {
1047 input_coords + i * n, 1, ranks[i],
1048 verbose_level - 1);
1049 }
1050
1051 move_points(pt_from, pt_to,
1052 nb, input_coords, output_coords, verbose_level);
1053
1054 for (i = 0; i < nb; i++) {
1055 ranks[i] = rank_point(
1056 output_coords + i * n, 1, verbose_level - 1);
1057 }
1058
1059 FREE_int(input_coords);
1060 FREE_int(output_coords);
1061}
1062
1063void orthogonal::move_points_by_ranks(long int pt_from, long int pt_to,
1064 int nb, long int *input_ranks, long int *output_ranks,
1065 int verbose_level)
1066{
1067 int *input_coords, *output_coords;
1068 int i;
1069
1070 input_coords = NEW_int(nb * n);
1071 output_coords = NEW_int(nb * n);
1072 for (i = 0; i < nb; i++) {
1073 unrank_point(input_coords + i * n, 1,
1074 input_ranks[i], verbose_level - 1);
1075 }
1076
1077 move_points(pt_from, pt_to,
1078 nb, input_coords, output_coords, verbose_level);
1079
1080 for (i = 0; i < nb; i++) {
1081 output_ranks[i] = rank_point(
1082 output_coords + i * n, 1, verbose_level - 1);
1083 }
1084
1085 FREE_int(input_coords);
1086 FREE_int(output_coords);
1087}
1088
1089void orthogonal::move_points(long int pt_from, long int pt_to,
1090 int nb, int *input_coords, int *output_coords,
1091 int verbose_level)
1092{
1093 long int root;
1094 int i;
1095 int *tmp_coords = NULL;
1096 int *input_coords2;
1097 int *T;
1098
1099 if (pt_from == pt_to) {
1100 for (i = 0; i < nb * n; i++) {
1101 output_coords[i] = input_coords[i];
1102 }
1103 return;
1104 }
1105
1106 T = NEW_int(n * n);
1107 if (pt_from != 0) {
1108
1109 tmp_coords = NEW_int(n * nb);
1110 root = find_root(pt_from, verbose_level - 2);
1112 pt_from /* from */,
1113 0 /* to */,
1114 root /* root */,
1115 verbose_level - 2);
1116 F->Linear_algebra->mult_matrix_matrix(input_coords,
1117 T, tmp_coords, nb, n, n,
1118 0 /* verbose_level */);
1119 input_coords2 = tmp_coords;
1120 }
1121 else {
1122 input_coords2 = input_coords;
1123 }
1124
1125 root = find_root(pt_to, verbose_level - 2);
1127 0 /* from */,
1128 pt_to /* to */,
1129 root /* root */,
1130 verbose_level - 2);
1131 F->Linear_algebra->mult_matrix_matrix(input_coords2, T, output_coords, nb, 5, 5,
1132 0 /* verbose_level */);
1133
1134 if (tmp_coords) FREE_int(tmp_coords);
1135
1136 FREE_int(T);
1137}
1138
1139
1140void orthogonal::test_Siegel(int index, int verbose_level)
1141{
1142 int rk1, rk2, rk1_subspace, rk2_subspace, root, j, rk3, cnt, u, t2;
1143
1144 rk1 = type_and_index_to_point_rk(5, 0, verbose_level);
1145 cout << 0 << " : " << rk1 << " : ";
1146 unrank_point(v1, 1, rk1, verbose_level - 1);
1147 Int_vec_print(cout, v1, n);
1148 cout << endl;
1149
1150 rk2 = type_and_index_to_point_rk(5, index, verbose_level);
1151 cout << index << " : " << rk2 << " : ";
1152 unrank_point(v2, 1, rk2, verbose_level - 1);
1153 Int_vec_print(cout, v2, n);
1154 cout << endl;
1155
1156 rk1_subspace = subspace->rank_point(v1, 1, verbose_level - 1);
1157 rk2_subspace = subspace->rank_point(v2, 1, verbose_level - 1);
1158 cout << "rk1_subspace=" << rk1_subspace << endl;
1159 cout << "rk2_subspace=" << rk2_subspace << endl;
1160
1162 rk2_subspace, verbose_level);
1164 rk1_subspace, rk2_subspace, root, verbose_level);
1165
1166 cout << "Siegel map takes 1st point to" << endl;
1167 F->Linear_algebra->mult_matrix_matrix(v1, T1, v3, 1, n - 2, n - 2,
1168 0 /* verbose_level */);
1169 Int_vec_print(cout, v3, n - 2);
1170 cout << endl;
1171
1172 cnt = 0;
1173
1174 t2 = 1;
1175 for (j = 0; j < subspace->P[t2 - 1]; j++) {
1176 if (f_even) {
1177 cout << "f_even" << endl;
1178 exit(1);
1179 }
1181 //rk3 = type_and_index_to_point_rk(t2, j);
1182 //unrank_point(v3, 1, rk3);
1183 rk3 = rank_point(v3, 1, verbose_level - 1);
1184
1185 u = evaluate_bilinear_form(v1, v3, 1);
1186 if (u) {
1187 cout << "error, u not zero" << endl;
1188 }
1189
1190 //if (test_if_minimal_on_line(v3, v1, v_tmp)) {
1191
1192
1193 cout << "Siegel map takes 2nd point ";
1194 cout << cnt << " : " << j << " : " << rk3 << " : ";
1195 Int_vec_print(cout, v3, n);
1196 cout << " to ";
1197 F->Linear_algebra->mult_matrix_matrix(v3, T1, v_tmp, 1, n - 2, n - 2,
1198 0 /* verbose_level */);
1199
1200
1201 v_tmp[n - 2] = v3[n - 2];
1202 v_tmp[n - 1] = v3[n - 1];
1203 Int_vec_print(cout, v_tmp, n);
1204
1205
1206 //cout << "find_minimal_point_on_line " << endl;
1207 //find_minimal_point_on_line(v_tmp, v2, v4);
1208
1209 //cout << " minrep: ";
1210 //int_vec_print(cout, v4, n);
1211
1212 //normalize_point(v4, 1);
1213 //cout << " normalized: ";
1214 //int_vec_print(cout, v4, n);
1215
1216 cout << endl;
1217
1218 cnt++;
1219 //}
1220 }
1221 cout << endl;
1222}
1223
1224
1225}}}
1226
1227
void print_int_matrix(std::ostream &ost, int *A, int m, int n)
a collection of functions related to sorted vectors
void Siegel_Transformation(int epsilon, int k, int form_c1, int form_c2, int form_c3, int *M, int *v, int *u, int verbose_level)
void transform_form_matrix(int *A, int *Gram, int *new_Gram, int d, int verbose_level)
void invert_matrix(int *A, int *A_inv, 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 mult_vector_from_the_right(int *A, int *v, int *Av, int m, int n)
int perp(int n, int k, int *A, int *Gram, int verbose_level)
int evaluate_quadratic_form(int n, int nb_terms, int *i, int *j, int *coeff, int *x)
int evaluate_bilinear_form(int n, int *v1, int *v2, int *Gram)
void Siegel_map_between_singular_points(int *T, long int rk_from, long int rk_to, long int root, int epsilon, int algebraic_dimension, int form_c1, int form_c2, int form_c3, int *Gram_matrix, int verbose_level)
void Gram_matrix(int epsilon, int k, int form_c1, int form_c2, int form_c3, int *&Gram, int verbose_level)
long int rank_point(int *v, int stride, int verbose_level)
void Siegel_move_backward_by_index(long int rk1, long int rk2, int *w, int *v, int verbose_level)
void Siegel_move_forward_by_index(long int rk1, long int rk2, int *v, int *w, int verbose_level)
void Siegel_Transformation3(int *T, int *from, int *to, int *root, int *B, int *Bv, int *w, int *z, int *x, int verbose_level)
void Siegel_Transformation(int *T, long int rk_from, long int rk_to, long int root, 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)
void unrank_point(int *v, int stride, long int rk, int verbose_level)
void move_points(long int pt_from, long int pt_to, int nb, int *input_coords, int *output_coords, int verbose_level)
void parabolic_neighbor51_odd_unrank(long int index, int *v, int verbose_level)
int find_root_hyperbolic(long int rk2, int m, int verbose_level)
void Siegel_map_between_singular_points_hyperbolic(int *T, long int rk_from, long int rk_to, long int root, int m, int verbose_level)
void Siegel_move_backward(int *v1, int *v2, int *v3, int *v4, int verbose_level)
void Siegel_map_between_singular_points(int *T, long int rk_from, long int rk_to, long int root, int verbose_level)
void Siegel_Transformation2(int *T, long int rk_from, long int rk_to, long int root, int *B, int *Bv, int *w, int *z, int *x, int verbose_level)
void create_random_orthogonal_reflection(int *Mtx, int verbose_level)
long int type_and_index_to_point_rk(long int type, long int index, int verbose_level)
void make_Siegel_Transformation(int *M, int *v, int *u, int n, int *Gram, int verbose_level)
long int find_root(long int rk2, int verbose_level)
void move_points_by_ranks(long int pt_from, long int pt_to, int nb, long int *input_ranks, long int *output_ranks, int verbose_level)
void create_random_Siegel_transformation(int *Mtx, int verbose_level)
void Siegel_move_forward(int *v1, int *v2, int *v3, int *v4, int verbose_level)
void make_orthogonal_reflection(int *M, int *z, int verbose_level)
void move_points_by_ranks_in_place(long int pt_from, long int pt_to, int nb, long int *ranks, int verbose_level)
#define Int_vec_print_integer_matrix(A, B, C, D)
Definition: foundations.h:690
#define FREE_int(p)
Definition: foundations.h:640
#define NEW_int(n)
Definition: foundations.h:625
#define Int_vec_print_integer_matrix_width(A, B, C, D, E, F)
Definition: foundations.h:691
#define Int_matrix_print(A, B, C)
Definition: foundations.h:707
#define TRUE
Definition: foundations.h:231
#define FALSE
Definition: foundations.h:234
#define EVEN(x)
Definition: foundations.h:221
#define Int_vec_print(A, B, C)
Definition: foundations.h:685
the orbiter library for the classification of combinatorial objects