Orbiter 2022
Combinatorial Objects
create_graph.cpp
Go to the documentation of this file.
1/*
2 * create_graph.cpp
3 *
4 * Created on: Nov 28, 2019
5 * Author: betten
6 */
7
8
9
10
11
12#include "orbiter.h"
13
14using namespace std;
15
16namespace orbiter {
17namespace layer5_applications {
18namespace apps_graph_theory {
19
20
22{
23 description = NULL;
24
26 CG = NULL;
27
28 N = 0;
29 Adj = NULL;
30
31
32}
33
35{
36 if (f_has_CG) {
38 }
39}
40
42 create_graph_description *description,
43 int verbose_level)
44{
45 int f_v = (verbose_level >= 1);
46
47 if (f_v) {
48 cout << "create_graph::init" << endl;
49 }
51
53
54 if (description->f_load) {
55 if (f_v) {
56 cout << "create_graph::init f_load" << endl;
57 }
58
59 f_has_CG = TRUE;
61 if (f_v) {
62 cout << "create_graph::init before CG->load, fname=" << description->fname << endl;
63 }
64 CG->load(description->fname, verbose_level);
65 if (f_v) {
66 cout << "create_graph::init after CG->load, fname=" << description->fname << endl;
67 }
68 f_has_CG = TRUE;
69 N = CG->nb_points;
70 if (f_v) {
71 cout << "create_graph::init number of vertices = " << N << endl;
72 }
73 label.assign(description->fname);
74 if (f_v) {
75 cout << "create_graph::init label = " << label << endl;
76 }
77
80
81 label_tex.assign("File\\_");
82 label_tex.append(label);
83
84 }
85
86 else if (description->f_Cayley_graph) {
87 if (f_v) {
88 cout << "create_graph::init f_Cayley_graph" << endl;
89 }
90
91 if (f_v) {
92 cout << "create_graph::init group=" << description->Cayley_graph_group << endl;
93 cout << "create_graph::init generators=" << description->Cayley_graph_gens << endl;
94 }
95
97
99
100
102
103 SG = G->get_strong_generators();
104
105
106 groups::sims *Sims;
107
108 //G = LG->initial_strong_gens->create_sims(verbose_level);
109 Sims = SG->create_sims(verbose_level);
110
111 cout << "group order G = " << Sims->group_order_lint() << endl;
112 cout << "group order coded element size = " << G->A_base->elt_size_in_int << endl;
113
114
115 int *v;
116 int sz;
117 int nb_gens;
118
120 v, sz, verbose_level);
121
122 nb_gens = sz / G->A_base->elt_size_in_int;
123
124 cout << "number of generators = " << nb_gens << endl;
125
126 cout << "generators: ";
127 Int_vec_print(cout, v, sz);
128 cout << endl;
129
131
133
134 gens->init_from_data(G->A, v, nb_gens, G->A_base->elt_size_in_int, verbose_level);
135
136 cout << "generators:" << endl;
137 gens->print(cout);
138
139
140
141 int *Elt1;
142 int *Elt2;
144 int i, h, j;
145
146 Elt1 = NEW_int(G->A_base->elt_size_in_int);
147 Elt2 = NEW_int(G->A_base->elt_size_in_int);
148 Sims->group_order(go);
149
150
151 N = go.as_lint();
152
153 Adj = NEW_int(N * N);
154 Int_vec_zero(Adj, N * N);
155
156 for (i = 0; i < go.as_lint(); i++) {
157
158
159 Sims->element_unrank_lint(i, Elt1);
160
161 if (f_v) {
162 cout << "Element " << setw(5) << i << " / "
163 << go.as_int() << ":" << endl;
164 G->A->element_print(Elt1, cout);
165 cout << endl;
166 G->A->element_print_as_permutation(Elt1, cout);
167 cout << endl;
168 }
169 for (h = 0; h < nb_gens; h++) {
170
171 G->A->element_mult(Elt1, gens->ith(h), Elt2, 0 /*verbose_level*/);
172
173 j = Sims->element_rank_lint(Elt2);
174
175 Adj[i * N + j] = 1;
176 Adj[j * N + i] = 1;
177
178 }
179
180
181 }
182 FREE_int(Elt1);
183 FREE_int(Elt2);
184
185
186 f_has_CG = FALSE;
187 if (f_v) {
188 cout << "create_graph::init number of vertices = " << N << endl;
189 }
190 label.assign("Cayley_graph_");
191 label.append(G->A->label);
192 if (f_v) {
193 cout << "create_graph::init label = " << label << endl;
194 }
195
198
199 label_tex.assign("Cayley\\_graph\\_");
200 label_tex.append(G->A->label_tex);
201
202 }
203
205 if (f_v) {
206 cout << "create_graph::init f_load_from_file_csv_no_border" << endl;
207 }
208
210 int *M;
211 int m, n;
212
213 Fio.int_matrix_read_csv_no_border(description->fname, M, m, n, verbose_level);
214 N = n;
215 Adj = M;
216
217 label.assign(description->fname);
218
221
222
223 label_tex.assign("File\\_");
224 label_tex.append(label);
225 }
226 else if (description->f_load_dimacs) {
227 if (f_v) {
228 cout << "create_graph::init f_load_from_file_dimacs" << endl;
229 }
230
232 int nb_V;
233 int i, j, h;
234 std::vector<std::vector<int>> Edges;
235
236 if (f_v) {
237 cout << "create_graph::init before Fio.read_dimacs_graph_format" << endl;
238 }
240 nb_V, Edges, verbose_level);
241 if (f_v) {
242 cout << "create_graph::init after Fio.read_dimacs_graph_format" << endl;
243 }
244
245 N = nb_V;
246 if (f_v) {
247 cout << "create_graph::init N=" << N << endl;
248 }
249 if (f_v) {
250 cout << "create_graph::init nb_E=" << Edges.size() << endl;
251 }
252 Adj = NEW_int(nb_V * nb_V);
253 Int_vec_zero(Adj, nb_V * nb_V);
254
255 for (h = 0; h < Edges.size(); h++) {
256 i = Edges[h][0];
257 j = Edges[h][1];
258 if (FALSE) {
259 cout << "create_graph::init edge " << h << " is " << i << " to " << j << endl;
260 }
261 Adj[i * nb_V + j] = 1;
262 Adj[j * nb_V + i] = 1;
263 }
264
265 label.assign(description->fname);
266
269
270
271 label_tex.assign("File\\_");
272 label_tex.append(label);
273 }
274 else if (description->f_edge_list) {
275
277 int h, i, j, a;
278
279 int *Idx;
280 int sz;
281
283
284 N = description->n;
285
286
287 Adj = NEW_int(N * N);
288 Int_vec_zero(Adj, N * N);
289 for (h = 0; h < sz; h++) {
290 a = Idx[h];
291 Combi.k2ij(a, i, j, N);
292 Adj[i * N + j] = 1;
293 Adj[j * N + i] = 1;
294 }
295 FREE_int(Idx);
296 char str[1000];
297 sprintf(str, "graph_v%d_e%d", description->n, sz);
298 label.assign(str);
299 sprintf(str, "Graph\\_%d\\_%d", description->n, sz);
300 label_tex.assign(str);
301 }
302 else if (description->f_edges_as_pairs) {
303 int h, i, j;
304 int *Idx;
305 int sz, sz2;
306
308
309 N = description->n;
310
311
312 Adj = NEW_int(N * N);
313 Int_vec_zero(Adj, N * N);
314 sz2 = sz >> 1;
315 for (h = 0; h < sz2; h++) {
316 i = Idx[2 * h + 0];
317 j = Idx[2 * h + 1];
318 Adj[i * N + j] = 1;
319 Adj[j * N + i] = 1;
320 }
321 FREE_int(Idx);
322 char str[1000];
323 sprintf(str, "graph_v%d_e%d", description->n, sz2);
324 label.assign(str);
325 sprintf(str, "Graph\\_%d\\_%d", description->n, sz2);
326 label_tex.assign(str);
327 }
328 else if (description->f_cycle) {
329
330 if (f_v) {
331 cout << "create_graph::init before create_cycle" << endl;
332 }
334 verbose_level);
335
336
337 if (f_v) {
338 cout << "create_graph::init after create_cycle" << endl;
339 }
340 }
341 else if (description->f_Hamming) {
342
343 if (f_v) {
344 cout << "create_graph::init before create_Hamming" << endl;
345 }
349 verbose_level);
350
351
352 if (f_v) {
353 cout << "create_graph::init after create_Hamming" << endl;
354 }
355 }
356 else if (description->f_Johnson) {
357
358 if (f_v) {
359 cout << "create_graph::init before create_Johnson" << endl;
360 }
364 verbose_level);
365
366
367 if (f_v) {
368 cout << "create_graph::init after create_Johnson" << endl;
369 }
370 }
371 else if (description->f_Paley) {
372
373 if (f_v) {
374 cout << "create_graph::init before create_Paley" << endl;
375 }
378 verbose_level);
379
380
381 if (f_v) {
382 cout << "create_graph::init after create_Paley" << endl;
383 }
384 }
385 else if (description->f_Sarnak) {
386
387 if (f_v) {
388 cout << "create_graph::init before create_Sarnak" << endl;
389 }
393 verbose_level);
394
395
396 if (f_v) {
397 cout << "create_graph::init after create_Sarnak" << endl;
398 }
399 }
400 else if (description->f_Schlaefli) {
401
402 if (f_v) {
403 cout << "create_graph::init before create_Schlaefli" << endl;
404 }
407 verbose_level);
408 if (f_v) {
409 cout << "create_graph::init after create_Schlaefli" << endl;
410 }
411 }
412 else if (description->f_Shrikhande) {
413
414 if (f_v) {
415 cout << "create_graph::init before create_Shrikhande" << endl;
416 }
417 create_Shrikhande(N, Adj, verbose_level);
418
419 if (f_v) {
420 cout << "create_graph::init after create_Shrikhande" << endl;
421 }
422 }
423 else if (description->f_Winnie_Li) {
424
425 if (f_v) {
426 cout << "create_graph::init before create_Winnie_Li" << endl;
427 }
431 verbose_level);
432
433 if (f_v) {
434 cout << "create_graph::init after create_Winnie_Li" << endl;
435 }
436 }
437 else if (description->f_Grassmann) {
438
439 if (f_v) {
440 cout << "create_graph::init before create_Grassmann" << endl;
441 }
447 verbose_level);
448
449 if (f_v) {
450 cout << "create_graph::init after create_Grassmann" << endl;
451 }
452 }
453 else if (description->f_coll_orthogonal) {
454
455 if (f_v) {
456 cout << "create_graph::init before create_coll_orthogonal" << endl;
457 }
461 description->coll_orthogonal_q, verbose_level);
462
463 if (f_v) {
464 cout << "create_graph::init after create_coll_orthogonal" << endl;
465 }
466 }
468
471
474
475 F->finite_field_init(5, FALSE /* f_without_tables */, 0);
476 Surf->init(F, verbose_level);
477
479 N = 120;
480 label.assign("trihedral_pair_disjointness");
481 label_tex.assign("trihedral\\_pair\\_disjointness");
482
483 FREE_OBJECT(Surf);
484 FREE_OBJECT(F);
485 }
487
488 char str[1000];
489
491
492 int n;
493
495
496
497 if (f_v) {
498 cout << "create_graph::init before GT.make_non_attacking_queens_graph" << endl;
499 }
500 GT.make_non_attacking_queens_graph(Adj, N, n, verbose_level);
501 if (f_v) {
502 cout << "create_graph::init after GT.make_non_attacking_queens_graph" << endl;
503 }
504
505
506
507 sprintf(str, "non_attacking_queens_graph_%d", n);
508 label.assign(str);
509 sprintf(str, "non\\_attacking\\_queens\\_graph\\_%d", n);
510 label_tex.assign(str);
511
512 }
514
516
517
518 if (f_v) {
519 cout << "create_graph::init before GT.make_disjoint_sets_graph" << endl;
520 }
521 GT.make_disjoint_sets_graph(Adj, N,
523 verbose_level);
524 if (f_v) {
525 cout << "create_graph::init after GT.make_disjoint_sets_graph" << endl;
526 }
527
528 string L;
530
532 String.chop_off_extension(L);
533 L.append("_disjoint_sets");
534
535 label.assign(L);
536
538 String.chop_off_extension(L);
539 L.append("\\_disjoint\\_sets");
540
541 label_tex.assign(L);
542 }
543 else if (description->f_orbital_graph) {
544
546
547 int idx;
549
551
553
555
556 if (t != t_any_group) {
557 cout << "object must be of type group, but is ";
559 cout << endl;
560 exit(1);
561 }
563
564
565
566 if (f_v) {
567 cout << "create_graph::init before GT.make_orbital_graph" << endl;
568 }
571 verbose_level);
572 if (f_v) {
573 cout << "create_graph::init after GT.make_orbital_graph" << endl;
574 }
575 if (f_v) {
576 cout << "create_graph::init label = " << label << endl;
577 cout << "create_graph::init label_tex = " << label_tex << endl;
578 cout << "create_graph::init done" << endl;
579 }
580
581 }
583
584
585
586 int idx;
588
590
592
594
595 if (t != t_vector) {
596 cout << "object must be of type vector, but is ";
598 cout << endl;
599 exit(1);
600 }
602
604 VB->v, VB->k, VB->len / VB->k,
605 verbose_level);
606
607
608
609 }
610 else if (description->f_chain_graph) {
611
612
613
614 int idx1;
616 int idx2;
618
621
623
625
626 if (t != t_vector) {
627 cout << "first partition must be of type vector, but is ";
629 cout << endl;
630 exit(1);
631 }
633
634 if (t != t_vector) {
635 cout << "second partition must be of type vector, but is ";
637 cout << endl;
638 exit(1);
639 }
642
644 VB1->v, VB1->len,
645 VB2->v, VB2->len,
646 verbose_level);
647
648
649
650 }
651
652
653
654 if (description->f_subset) {
655 if (f_v) {
656 cout << "create_graph::init the graph has a subset" << endl;
657 }
662 verbose_level);
663
664 int *subset;
665 int sz;
666
668
670 Adj, subset, sz,
673 verbose_level);
674
675 f_has_CG = TRUE;
676
679
680 FREE_int(subset);
681 if (f_v) {
682 cout << "create_graph::init created colored graph with two colors" << endl;
683 }
684
685 }
686 else {
687
688 if (!f_has_CG) {
689
691 if (f_v) {
692 cout << "create_graph::init before CG->init_adjacency_no_colors" << endl;
693 }
695 verbose_level);
696 if (f_v) {
697 cout << "create_graph::init after CG->init_adjacency_no_colors" << endl;
698 }
699
700 f_has_CG = TRUE;
701
702 if (f_v) {
703 cout << "create_graph::init created colored graph with one color" << endl;
704 }
705 }
706
707 }
708
709 int i;
710
711 for (i = 0; i < description->Modifications.size(); i++) {
712 description->Modifications[i].apply(CG, verbose_level);
713 }
714
715 CG->label.assign(label);
716 CG->label_tex.assign(label_tex);
717
718
719 if (f_v) {
720 cout << "create_graph::init label = " << label << endl;
721 cout << "create_graph::init done" << endl;
722 }
723}
724
725
726void create_graph::create_cycle(int &N, int *&Adj,
727 int n, int verbose_level)
728{
729 int f_v = (verbose_level >= 1);
730
731 if (f_v) {
732 cout << "create_graph::create_cycle" << endl;
733 }
734
736
737
738 if (f_v) {
739 cout << "create_graph::create_cycle before GT.make_cycle_graph" << endl;
740 }
741 GT.make_cycle_graph(Adj, N, n, verbose_level);
742 if (f_v) {
743 cout << "create_graph::create_cycle after GT.make_cycle_graph" << endl;
744 }
745
746 char str[1000];
747 sprintf(str, "Cycle_%d", n);
748 label.assign(str);
749 sprintf(str, "Cycle\\_%d", n);
750 label_tex.assign(str);
751
752
753 if (f_v) {
754 cout << "create_graph::create_cycle done" << endl;
755 }
756}
757
758
759void create_graph::create_Hamming(int &N, int *&Adj,
760 int n, int q, int verbose_level)
761{
762 int f_v = (verbose_level >= 1);
763
764 if (f_v) {
765 cout << "create_graph::create_Hamming" << endl;
766 }
767
769
770
771 if (f_v) {
772 cout << "create_graph::create_Hamming before GT.make_Hamming_graph" << endl;
773 }
774 GT.make_Hamming_graph(Adj, N, n, q, verbose_level);
775 if (f_v) {
776 cout << "create_graph::create_Hamming after GT.make_Hamming_graph" << endl;
777 }
778
779 char str[1000];
780 sprintf(str, "Hamming_%d_%d", n, q);
781 label.assign(str);
782 sprintf(str, "Hamming\\_%d\\_%d", n, q);
783 label_tex.assign(str);
784
785
786 if (f_v) {
787 cout << "create_graph::create_Hamming done" << endl;
788 }
789}
790
791
792void create_graph::create_Johnson(int &N, int *&Adj,
793 int n, int k, int s, int verbose_level)
794{
795 int f_v = (verbose_level >= 1);
796
797 if (f_v) {
798 cout << "create_graph::create_Johnson" << endl;
799 }
800
802
803
804 if (f_v) {
805 cout << "create_graph::create_Johnson before GT.make_Johnson_graph" << endl;
806 }
807 GT.make_Johnson_graph(Adj, N, n, k, s, verbose_level);
808 if (f_v) {
809 cout << "create_graph::create_Johnson after GT.make_Johnson_graph" << endl;
810 }
811
812 char str[1000];
813 sprintf(str, "Johnson_%d_%d_%d", n, k, s);
814 label.assign(str);
815 sprintf(str, "Johnson\\_%d\\_%d\\_%d", n, k, s);
816 label_tex.assign(str);
817
818
819 if (f_v) {
820 cout << "create_graph::create_Johnson done" << endl;
821 }
822}
823
824void create_graph::create_Paley(int &N, int *&Adj,
825 int q, int verbose_level)
826{
827 int f_v = (verbose_level >= 1);
828
829 if (f_v) {
830 cout << "create_graph::create_Paley" << endl;
831 }
832
833
835
836
837 if (f_v) {
838 cout << "create_graph::create_Paley before GT.make_Paley_graph" << endl;
839 }
840 GT.make_Paley_graph(Adj, N, q, verbose_level);
841 if (f_v) {
842 cout << "create_graph::create_Paley after GT.make_Paley_graph" << endl;
843 }
844
845 char str[1000];
846 sprintf(str, "Paley_%d", q);
847 label.assign(str);
848 sprintf(str, "Paley\\_%d", q);
849 label_tex.assign(str);
850
851
852 if (f_v) {
853 cout << "create_graph::create_Paley done" << endl;
854 }
855}
856
857void create_graph::create_Sarnak(int &N, int *&Adj,
858 int p, int q, int verbose_level)
859{
860 int f_v = (verbose_level >= 1);
861
862 if (f_v) {
863 cout << "create_graph::create_Sarnak" << endl;
864 }
865
866
867 int f_vv = (verbose_level >= 2);
868 int i, l, f_special = FALSE;
870
871
872
873 l = NT.Legendre(p, q, 0);
874 if (f_v) {
875 cout << "create_graph::create_Sarnak Legendre(" << p << ", " << q << ")=" << l << endl;
876 }
877
878
881 int f_semilinear = FALSE;
882 int f_basis = TRUE;
883
885 F->finite_field_init(q, FALSE /* f_without_tables */, 0);
886 //F->init_override_polynomial(q, override_poly, verbose_level);
887
889
890 if (l == 1) {
891 f_special = TRUE;
892
893 if (f_v) {
894 cout << "create_graph::create_Sarnak "
895 "Creating projective special linear group:" << endl;
896 }
898 f_semilinear,
899 f_basis,
900 verbose_level - 2);
901 }
902 else {
904
905 if (f_v) {
906 cout << "create_graph::create_Sarnak "
907 "Creating projective linear group:" << endl;
908 }
909 A->init_projective_group(2, F,
910 f_semilinear,
911 f_basis, TRUE /* f_init_sims */,
912 nice_gens,
913 verbose_level - 2);
914 FREE_OBJECT(nice_gens);
915 }
916
917
918
919 groups::sims *Sims;
920
921 Sims = A->Sims;
922
923
924 //longinteger_object go;
925 long int goi;
926
927 goi = Sims->group_order_lint();
928
929 if (f_v) {
930 cout << "create_graph::create_Sarnak "
931 "found a group of order " << goi << endl;
932 }
933
934
935
936
937 int a0, a1, a2, a3;
938 int sqrt_p;
939
940 int *sqrt_mod_q;
941 int I;
942 int *A4;
943 int nb_A4 = 0;
944 int j;
945
946 A4 = NEW_int((p + 1) * 4);
947 sqrt_mod_q = NEW_int(q);
948 for (i = 0; i < q; i++) {
949 sqrt_mod_q[i] = -1;
950 }
951 for (i = 0; i < q; i++) {
952 j = F->mult(i, i);
953 sqrt_mod_q[j] = i;
954 }
955 if (f_v) {
956 cout << "create_graph::create_Sarnak sqrt_mod_q:" << endl;
957 Int_vec_print(cout, sqrt_mod_q, q);
958 cout << endl;
959 }
960
961 sqrt_p = 0;
962 for (i = 1; i < p; i++) {
963 if (i * i > p) {
964 sqrt_p = i - 1;
965 break;
966 }
967 }
968 if (f_v) {
969 cout << "create_graph::create_Sarnak p=" << p << endl;
970 cout << "create_graph::create_Sarnak sqrt_p = " << sqrt_p << endl;
971 }
972
973
974 for (I = 0; I < q; I++) {
975 if (F->add(F->mult(I, I), 1) == 0) {
976 break;
977 }
978 }
979 if (I == q) {
980 cout << "create_graph::create_Sarnak did not find I" << endl;
981 exit(1);
982 }
983 if (f_v) {
984 cout << "create_graph::create_Sarnak I=" << I << endl;
985 }
986
987 for (a0 = 1; a0 <= sqrt_p; a0++) {
988 if (EVEN(a0)) {
989 continue;
990 }
991 for (a1 = -sqrt_p; a1 <= sqrt_p; a1++) {
992 if (ODD(a1)) {
993 continue;
994 }
995 for (a2 = -sqrt_p; a2 <= sqrt_p; a2++) {
996 if (ODD(a2)) {
997 continue;
998 }
999 for (a3 = -sqrt_p; a3 <= sqrt_p; a3++) {
1000 if (ODD(a3)) {
1001 continue;
1002 }
1003 if (a0 * a0 + a1 * a1 + a2 * a2 + a3 * a3 == p) {
1004 if (f_v) {
1005 cout << "create_graph::create_Sarnak solution " << nb_A4 << " : " << a0
1006 << ", " << a1 << ", " << a2 << ", "
1007 << a3 << ", " << endl;
1008 }
1009 if (nb_A4 == p + 1) {
1010 cout << "create_graph::create_Sarnak too many solutions" << endl;
1011 exit(1);
1012 }
1013 A4[nb_A4 * 4 + 0] = a0;
1014 A4[nb_A4 * 4 + 1] = a1;
1015 A4[nb_A4 * 4 + 2] = a2;
1016 A4[nb_A4 * 4 + 3] = a3;
1017 nb_A4++;
1018 }
1019 }
1020 }
1021 }
1022 }
1023
1024 if (f_v) {
1025 cout << "create_graph::create_Sarnak nb_A4=" << nb_A4 << endl;
1026 }
1027 if (nb_A4 != p + 1) {
1028 cout << "create_graph::create_Sarnak nb_A4 != p + 1" << endl;
1029 exit(1);
1030 }
1031
1032 if (f_v) {
1033 Int_matrix_print(A4, nb_A4, 4);
1034 }
1035
1037 int *Elt1;
1038 int *Elt2;
1039 int *Elt3;
1040 int M4[4];
1041 int det; //, s, sv;
1042
1043 Elt1 = NEW_int(A->elt_size_in_int);
1044 Elt2 = NEW_int(A->elt_size_in_int);
1045 Elt3 = NEW_int(A->elt_size_in_int);
1046
1048 gens->init(A, verbose_level - 2);
1049 gens->allocate(nb_A4, verbose_level - 2);
1050
1051 if (f_v) {
1052 cout << "create_graph::create_Sarnak making connection set:" << endl;
1053 }
1054 for (i = 0; i < nb_A4; i++) {
1055
1056 if (f_vv) {
1057 cout << "create_graph::create_Sarnak making generator " << i << ":" << endl;
1058 }
1059 a0 = A4[i * 4 + 0];
1060 a1 = A4[i * 4 + 1];
1061 a2 = A4[i * 4 + 2];
1062 a3 = A4[i * 4 + 3];
1063 while (a0 < 0) {
1064 a0 += q;
1065 }
1066 while (a1 < 0) {
1067 a1 += q;
1068 }
1069 while (a2 < 0) {
1070 a2 += q;
1071 }
1072 while (a3 < 0) {
1073 a3 += q;
1074 }
1075 a0 = a0 % q;
1076 a1 = a1 % q;
1077 a2 = a2 % q;
1078 a3 = a3 % q;
1079 if (f_vv) {
1080 cout << "create_graph::create_Sarnak making generator " << i << ": a0=" << a0
1081 << " a1=" << a1 << " a2=" << a2
1082 << " a3=" << a3 << endl;
1083 }
1084 M4[0] = F->add(a0, F->mult(I, a1));
1085 M4[1] = F->add(a2, F->mult(I, a3));
1086 M4[2] = F->add(F->negate(a2), F->mult(I, a3));
1087 M4[3] = F->add(a0, F->negate(F->mult(I, a1)));
1088
1089 if (f_vv) {
1090 cout << "M4=";
1091 Int_vec_print(cout, M4, 4);
1092 cout << endl;
1093 }
1094
1095 if (f_special) {
1096 det = F->add(F->mult(M4[0], M4[3]),
1097 F->negate(F->mult(M4[1], M4[2])));
1098
1099 if (f_vv) {
1100 cout << "det=" << det << endl;
1101 }
1102
1103#if 0
1104 s = sqrt_mod_q[det];
1105 if (s == -1) {
1106 cout << "create_graph::create_Sarnak determinant is not a square" << endl;
1107 exit(1);
1108 }
1109 sv = F->inverse(s);
1110 if (f_vv) {
1111 cout << "create_graph::create_Sarnak det=" << det << " sqrt=" << s
1112 << " mutiplying by " << sv << endl;
1113 }
1114 for (j = 0; j < 4; j++) {
1115 M4[j] = F->mult(sv, M4[j]);
1116 }
1117 if (f_vv) {
1118 cout << "create_graph::create_Sarnak M4=";
1119 int_vec_print(cout, M4, 4);
1120 cout << endl;
1121 }
1122#endif
1123 }
1124
1125 A->make_element(Elt1, M4, verbose_level - 1);
1126
1127 if (f_v) {
1128 cout << "create_graph::create_Sarnak s_" << i << "=" << endl;
1129 A->element_print_quick(Elt1, cout);
1130 }
1131
1132 A->element_move(Elt1, gens->ith(i), 0);
1133 }
1134
1135 if (f_v) {
1136 cout << "create_graph::create_Sarnak before Sims->Cayley_graph" << endl;
1137 }
1138 Sims->Cayley_graph(Adj, N, gens, verbose_level);
1139 if (f_v) {
1140 cout << "create_graph::create_Sarnak after Sims->Cayley_graph" << endl;
1141 }
1142
1143
1144 if (f_v) {
1145 cout << "create_graph::create_Sarnak "
1146 "The adjacency matrix of a graph with " << goi
1147 << " vertices has been computed" << endl;
1148 //int_matrix_print(Adj, goi, goi);
1149 }
1150
1151 int k;
1152 k = 0;
1153 for (i = 0; i < N; i++) {
1154 if (Adj[0 * N + i]) {
1155 k++;
1156 }
1157 }
1158 if (f_v) {
1159 cout << "create_graph::create_Sarnak the graph is regular of degree " << k << endl;
1160 }
1161
1162
1163 //N = goi;
1164
1165 char str[1000];
1166 sprintf(str, "Sarnak_%d_%d", p, q);
1167 label.assign(str);
1168 sprintf(str, "Sarnak\\_%d\\_%d", p, q);
1169 label_tex.assign(str);
1170
1171 FREE_OBJECT(gens);
1172 FREE_OBJECT(A);
1173 FREE_int(A4);
1174 FREE_int(Elt1);
1175 FREE_int(Elt2);
1176 FREE_int(Elt3);
1177 FREE_OBJECT(F);
1178
1179 if (f_v) {
1180 cout << "create_graph::create_Sarnak done" << endl;
1181 }
1182}
1183
1184
1185void create_graph::create_Schlaefli(int &N, int *&Adj,
1186 int q, int verbose_level)
1187{
1188 int f_v = (verbose_level >= 1);
1189
1190 if (f_v) {
1191 cout << "create_graph::create_Schlaefli" << endl;
1192 }
1193
1195
1196
1197 if (f_v) {
1198 cout << "create_graph::create_Schlaefli before GT.make_Schlaefli_graph" << endl;
1199 }
1200 GT.make_Schlaefli_graph(Adj, N, q, verbose_level);
1201 if (f_v) {
1202 cout << "create_graph::create_Schlaefli after GT.make_Schlaefli_graph" << endl;
1203 }
1204
1205 char str[1000];
1206
1207 sprintf(str, "Schlaefli_%d", q);
1208 label.assign(str);
1209 sprintf(str, "Schlaefli\\_%d", q);
1210 label_tex.assign(str);
1211
1212
1213 if (f_v) {
1214 cout << "create_graph::create_Schlaefli done" << endl;
1215 }
1216}
1217
1218void create_graph::create_Shrikhande(int &N, int *&Adj, int verbose_level)
1219{
1220 int f_v = (verbose_level >= 1);
1221
1222 if (f_v) {
1223 cout << "create_graph::create_Shrikhande" << endl;
1224 }
1225
1226 actions::action *A;
1229 int *v;
1230 int n = 8;
1231 int i, j;
1232 int nb_G, nb_S;
1233 long int goi;
1234 int f_no_base = FALSE;
1235
1237 A->init_symmetric_group(n, f_no_base, verbose_level);
1238 goi = A->group_order_lint();
1239
1240 if (f_v) {
1241 cout << "create_graph::create_Shrikhande "
1242 "Created group Sym(" << n << ") of size " << goi << endl;
1243 }
1244
1245 nb_G = 2;
1246 nb_S = 6;
1247
1249 gens_G->init(A, verbose_level - 2);
1250 gens_G->allocate(nb_G, verbose_level - 2);
1251
1252
1254 gens_S->init(A, verbose_level - 2);
1255 gens_S->allocate(nb_S, verbose_level - 2);
1256
1257 v = NEW_int(n);
1258
1259
1260 for (i = 0; i < nb_G; i++) {
1261 if (i == 0) {
1262 for (j = 0; j < 4; j++) {
1263 v[j] = (j + 1) % 4;
1264 }
1265 for (j = 0; j < 4; j++) {
1266 v[4 + j] = 4 + j;
1267 }
1268 }
1269 else {
1270 for (j = 0; j < 4; j++) {
1271 v[j] = j;
1272 }
1273 for (j = 0; j < 4; j++) {
1274 v[4 + j] = 4 + ((j + 1) % 4);
1275 }
1276 }
1277 A->make_element(gens_G->ith(i), v, 0 /* verbose_level */);
1278 }
1279
1280 if (f_v) {
1281 cout << "create_graph::create_Shrikhande "
1282 "generators for G:" << endl;
1283 for (i = 0; i < nb_G; i++) {
1284 cout << "generator " << i << ":" << endl;
1285 A->element_print(gens_G->ith(i), cout);
1286 }
1287 }
1288
1289 for (i = 0; i < nb_S; i++) {
1290 if (i == 0) {
1291 for (j = 0; j < 4; j++) {
1292 v[j] = (j + 1) % 4;
1293 }
1294 for (j = 0; j < 4; j++) {
1295 v[4 + j] = 4 + j;
1296 }
1297 }
1298 else if (i == 1) {
1299 for (j = 0; j < 4; j++) {
1300 v[j] = (4 + j - 1) % 4;
1301 }
1302 for (j = 0; j < 4; j++) {
1303 v[4 + j] = 4 + j;
1304 }
1305 }
1306 else if (i == 2) {
1307 for (j = 0; j < 4; j++) {
1308 v[j] = j;
1309 }
1310 for (j = 0; j < 4; j++) {
1311 v[4 + j] = 4 + ((j + 1) % 4);
1312 }
1313 }
1314 else if (i == 3) {
1315 for (j = 0; j < 4; j++) {
1316 v[j] = j;
1317 }
1318 for (j = 0; j < 4; j++) {
1319 v[4 + j] = 4 + ((4 + j - 1) % 4);
1320 }
1321 }
1322 else if (i == 4) {
1323 for (j = 0; j < 4; j++) {
1324 v[j] = (j + 1) % 4;
1325 }
1326 for (j = 0; j < 4; j++) {
1327 v[4 + j] = 4 + ((j + 1) % 4);
1328 }
1329 }
1330 else if (i == 5) {
1331 for (j = 0; j < 4; j++) {
1332 v[j] = (4 + j - 1) % 4;
1333 }
1334 for (j = 0; j < 4; j++) {
1335 v[4 + j] = 4 + ((4 + j - 1) % 4);
1336 }
1337 }
1338 A->make_element(gens_S->ith(i), v, 0 /* verbose_level */);
1339 }
1340
1341 if (f_v) {
1342 cout << "create_graph::create_Shrikhande "
1343 "generators for S:" << endl;
1344 for (i = 0; i < nb_S; i++) {
1345 cout << "generator " << i << ":" << endl;
1346 A->element_print(gens_S->ith(i), cout);
1347 }
1348 }
1349
1350 groups::sims *G;
1351
1352
1354 gens_G, 16, verbose_level);
1355
1356
1357
1358 if (f_v) {
1359 cout << "create_graph::create_Shrikhande "
1360 "before G->Cayley_graph" << endl;
1361 }
1362 G->Cayley_graph(Adj, N, gens_S, verbose_level);
1363 if (f_v) {
1364 cout << "create_graph::create_Shrikhande "
1365 "after G->Cayley_graph" << endl;
1366 }
1367
1368
1369
1370 if (f_v) {
1371 cout << "create_graph::create_Shrikhande "
1372 "The adjacency matrix of a graph with " <<
1373 goi << " vertices has been computed" << endl;
1374 //int_matrix_print(Adj, goi, goi);
1375 }
1376
1377 //N = goi;
1378
1379 char str[1000];
1380 sprintf(str, "Shrikhande");
1381 label.assign(str);
1382 sprintf(str, "Shrikhande");
1383 label_tex.assign(str);
1384
1385
1386 FREE_int(v);
1387 FREE_OBJECT(gens_G);
1388 FREE_OBJECT(gens_S);
1389
1390 if (f_v) {
1391 cout << "create_graph::create_Shrikhande done" << endl;
1392 }
1393}
1394
1395void create_graph::create_Winnie_Li(int &N, int *&Adj,
1396 int q, int index, int verbose_level)
1397{
1398 int f_v = (verbose_level >= 1);
1399
1400 if (f_v) {
1401 cout << "create_graph::create_Winnie_Li" << endl;
1402 }
1403
1405
1406
1407 if (f_v) {
1408 cout << "create_graph::create_Winnie_Li "
1409 "before Combi.make_Winnie_Li_graph" << endl;
1410 }
1411 GT.make_Winnie_Li_graph(Adj, N, q, index, verbose_level);
1412 if (f_v) {
1413 cout << "create_graph::create_Winnie_Li "
1414 "after Combi.make_Winnie_Li_graph" << endl;
1415 }
1416
1417
1418 char str[1000];
1419 sprintf(str, "Winnie_Li_%d_%d", q, index);
1420 label.assign(str);
1421 sprintf(str, "Winnie_Li\\_%d\\_%d", q, index);
1422 label_tex.assign(str);
1423
1424
1425
1426 if (f_v) {
1427 cout << "create_graph::create_Winnie_Li done" << endl;
1428 }
1429}
1430
1431void create_graph::create_Grassmann(int &N, int *&Adj,
1432 int n, int k, int q, int r, int verbose_level)
1433{
1434 int f_v = (verbose_level >= 1);
1435
1436 if (f_v) {
1437 cout << "create_graph::create_Grassmann" << endl;
1438 }
1439
1440
1442
1443
1444 if (f_v) {
1445 cout << "create_graph::create_Grassmann "
1446 "before GT.make_Grassmann_graph" << endl;
1447 }
1448 GT.make_Grassmann_graph(Adj, N, n, k, q, r, verbose_level);
1449 if (f_v) {
1450 cout << "create_graph::create_Grassmann "
1451 "after GT.make_Grassmann_graph" << endl;
1452 }
1453
1454
1455 char str[1000];
1456 sprintf(str, "Grassmann_%d_%d_%d_%d", n, k, q, r);
1457 label.assign(str);
1458 sprintf(str, "Grassmann\\_%d\\_%d\\_%d\\_%d", n, k, q, r);
1459 label_tex.assign(str);
1460
1461
1462 if (f_v) {
1463 cout << "create_graph::create_Grassmann done" << endl;
1464 }
1465}
1466
1468 int epsilon, int d, int q, int verbose_level)
1469{
1470 int f_v = (verbose_level >= 1);
1471
1472 if (f_v) {
1473 cout << "create_graph::create_coll_orthogonal" << endl;
1474 }
1475
1477
1478
1479 if (f_v) {
1480 cout << "create_graph::create_coll_orthogonal before "
1481 "GT.make_orthogonal_collinearity_graph" << endl;
1482 }
1483 GT.make_orthogonal_collinearity_graph(Adj, N,
1484 epsilon, d, q, verbose_level);
1485 if (f_v) {
1486 cout << "create_graph::create_coll_orthogonal after "
1487 "GT.make_orthogonal_collinearity_graph" << endl;
1488 }
1489
1490
1491 char str[1000];
1492 sprintf(str, "Coll_orthogonal_%d_%d_%d", epsilon, d, q);
1493 label.assign(str);
1494 sprintf(str, "Coll_orthogonal\\_%d\\_%d\\_%d", epsilon, d, q);
1495 label_tex.assign(str);
1496
1497 if (f_v) {
1498 cout << "create_graph::create_coll_orthogonal done" << endl;
1499 }
1500}
1501
1503 apps_algebra::any_group *AG, int orbit_idx, int verbose_level)
1504{
1505 int f_v = (verbose_level >= 1);
1506
1507 if (f_v) {
1508 cout << "create_graph::make_orbital_graph" << endl;
1509 }
1510
1512
1514
1516
1517 if (f_v) {
1518 cout << "create_graph::make_orbital_graph "
1519 "before AG->orbits_on_subsets" << endl;
1520 }
1521 AG->orbits_on_subsets(Control, PC, 2, verbose_level);
1522 if (f_v) {
1523 cout << "create_graph::make_orbital_graph "
1524 "after AG->orbits_on_subsets" << endl;
1525 }
1526
1527 long int set[2];
1528 int size;
1529
1530 PC->get_Poo()->get_set(2 /* level */, orbit_idx, set, size);
1531
1532 if (f_v) {
1533 cout << "create_graph::make_orbital_graph set: ";
1534 Lint_vec_print(cout, set, 2);
1535 cout << endl;
1536 }
1537
1538 orbit_of_sets *Orb;
1539
1541
1542 if (f_v) {
1543 cout << "create_graph::make_orbital_graph before Orb->init" << endl;
1544 }
1545 Orb->init(AG->A_base, AG->A,
1546 set, 2, AG->Subgroup_gens->gens, verbose_level);
1547 if (f_v) {
1548 cout << "create_graph::make_orbital_graph after Orb->init" << endl;
1549 }
1550
1551 int *M;
1552 int nb_points;
1553 int i, j, h;
1554
1555 nb_points = AG->A->degree;
1556
1557 M = NEW_int(nb_points * nb_points);
1558 Int_vec_zero(M, nb_points * nb_points);
1559 for (h = 0; h < Orb->used_length; h++) {
1560 i = Orb->Sets[h][0];
1561 j = Orb->Sets[h][1];
1562 M[i * nb_points + j] = 1;
1563 M[j * nb_points + i] = 1;
1564 }
1565
1566 FREE_OBJECT(Orb);
1567 N = nb_points;
1568 Adj = M;
1569
1570 char str[1000];
1571
1572 if (f_v) {
1573 cout << "create_graph::make_orbital_graph AG->A->label = " << AG->A->label << endl;
1574 cout << "create_graph::make_orbital_graph AG->A->label_tex = " << AG->A->label_tex << endl;
1575 }
1576
1577 sprintf(str, "_Orbital_%d", orbit_idx);
1578 label.assign("Group_");
1579 label.append(AG->A->label);
1580 label.append(str);
1581 sprintf(str, "Orbital\\_%d", orbit_idx);
1582 label_tex.assign("Group\\_");
1583 label_tex.append(AG->A->label_tex);
1584 label_tex.append(str);
1585
1586 if (f_v) {
1587 cout << "create_graph::make_orbital_graph done" << endl;
1588 }
1589}
1590
1592 int *Inc, int nb_rows, int nb_cols, int verbose_level)
1593{
1594 int f_v = (verbose_level >= 1);
1595
1596 if (f_v) {
1597 cout << "create_graph::make_collinearity_graph" << endl;
1598 }
1599
1600 N = nb_rows;
1601 Adj = NEW_int(N * N);
1602 Int_vec_zero(Adj, N * N);
1603
1604 int j, i1, i2;
1605
1606 for (j = 0; j < nb_cols; j++) {
1607 for (i1 = 0; i1 < nb_rows; i1++) {
1608 if (Inc[i1 * nb_cols + j] == 0) {
1609 continue;
1610 }
1611 for (i2 = i1 + 1; i2 < nb_rows; i2++) {
1612 if (Inc[i2 * nb_cols + j] == 0) {
1613 continue;
1614 }
1615 Adj[i1 * N + i2] = 1;
1616 Adj[i2 * N + i1] = 1;
1617 }
1618 }
1619 }
1620
1621 label.assign("collinearity_graph");
1622 label_tex.assign("collinearity\\_graph");
1623
1624 if (f_v) {
1625 cout << "create_graph::make_collinearity_graph done" << endl;
1626 }
1627}
1628
1629void create_graph::make_chain_graph(int &N, int *&Adj,
1630 int *part1, int sz1,
1631 int *part2, int sz2,
1632 int verbose_level)
1633{
1634 int f_v = (verbose_level >= 1);
1635
1636 if (f_v) {
1637 cout << "create_graph::make_chain_graph" << endl;
1638 }
1639 if (sz1 != sz2) {
1640 cout << "create_graph::make_chain_graph sz1 != sz2" << endl;
1641 }
1642
1643 int i, j;
1644 int N1, N2;
1645 int *first1;
1646 int *first2;
1647
1648 first1 = NEW_int(sz1 + 1);
1649 first2 = NEW_int(sz1 + 1);
1650
1651 N1 = 0;
1652 first1[0] = 0;
1653 for (i = 0; i < sz1; i++) {
1654 N1 += part1[i];
1655 first1[i + 1] = first1[i] + part1[i];
1656 }
1657 N2 = 0;
1658 first2[0] = N1;
1659 for (i = 0; i < sz2; i++) {
1660 N2 += part2[i];
1661 first2[i + 1] = first2[i] + part2[i];
1662 }
1663 N = N1 + N2;
1664
1665 Adj = NEW_int(N * N);
1666 Int_vec_zero(Adj, N * N);
1667
1668 int I, J, ii, jj;
1669
1670 for (I = 0; I < sz1; I++) {
1671 for (i = 0; i < part1[I]; i++) {
1672 ii = first1[I] + i;
1673 for (J = 0; J < sz2 - I; J++) {
1674 for (j = 0; j < part2[J]; j++) {
1675 jj = first2[J] + j;
1676 Adj[ii * N + jj] = 1;
1677 Adj[jj * N + ii] = 1;
1678 }
1679 }
1680 }
1681 }
1682
1683 label.assign("chain_graph");
1684 label_tex.assign("chain\\_graph");
1685
1686 if (f_v) {
1687 cout << "create_graph::make_chain_graph done" << endl;
1688 }
1689}
1690
1691
1692}}}
void make_trihedral_pair_disjointness_graph(int *&Adj, int verbose_level)
Definition: schlaefli.cpp:348
void init(field_theory::finite_field *F, int verbose_level)
functions related to strings and character arrays
to create a vector of field elements from class vector_builder_description
void finite_field_init(int q, int f_without_tables, int verbose_level)
void init_adjacency_no_colors(int nb_points, int *Adj, std::string &label, std::string &label_tex, int verbose_level)
void load(std::string &fname, int verbose_level)
void init_adjacency_two_colors(int nb_points, int *Adj, int *subset, int sz, std::string &label, std::string &label_tex, int verbose_level)
void int_matrix_read_csv_no_border(std::string &fname, int *&M, int &m, int &n, int verbose_level)
Definition: file_io.cpp:1522
void read_dimacs_graph_format(std::string &fname, int &nb_V, std::vector< std::vector< int > > &Edges, int verbose_level)
Definition: file_io.cpp:1773
void get_int_vector_from_label(std::string &label, int *&v, int &sz, 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
void element_print(void *elt, std::ostream &ost)
Definition: action_cb.cpp:347
void init_symmetric_group(int degree, int f_no_base, int verbose_level)
void element_mult(void *a, void *b, void *ab, int verbose_level)
Definition: action_cb.cpp:315
void init_projective_group(int n, field_theory::finite_field *F, int f_semilinear, int f_basis, int f_init_sims, data_structures_groups::vector_ge *&nice_gens, int verbose_level)
void init_projective_special_group(int n, field_theory::finite_field *F, int f_semilinear, int f_basis, int verbose_level)
void make_element(int *Elt, int *data, int verbose_level)
Definition: action.cpp:1875
void element_move(void *a, void *b, int verbose_level)
Definition: action_cb.cpp:335
groups::sims * create_sims_from_generators_with_target_group_order_lint(data_structures_groups::vector_ge *gens, long int target_go, int verbose_level)
void element_print_as_permutation(void *elt, std::ostream &ost)
Definition: action_cb.cpp:421
void init_from_data(actions::action *A, int *data, int nb_elements, int elt_size, int verbose_level)
Definition: vector_ge.cpp:175
void init(actions::action *A, int verbose_level)
Definition: vector_ge.cpp:55
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
void Cayley_graph(int *&Adj, int &sz, data_structures_groups::vector_ge *gens_S, int verbose_level)
a strong generating set for a permutation group with respect to a fixed action
Definition: groups.h:1703
data_structures_groups::vector_ge * gens
Definition: groups.h:1708
orbit of sets using a Schreier tree, used in packing::make_spread_table
Definition: orbits.h:106
void init(actions::action *A, actions::action *A2, long int *set, int sz, data_structures_groups::vector_ge *gens, int verbose_level)
to control the behavior of the poset classification algorithm
a wrapper for linear_group and permutation_group_create
groups::strong_generators * get_strong_generators()
Definition: any_group.cpp:2287
void orbits_on_subsets(poset_classification::poset_classification_control *Control, poset_classification::poset_classification *&PC, int subset_size, int verbose_level)
Definition: any_group.cpp:1567
a description of a graph using command line arguments
Definition: graph_theory.h:110
std::vector< graph_modification_description > Modifications
Definition: graph_theory.h:193
void create_Paley(int &N, int *&Adj, int q, int verbose_level)
void create_Hamming(int &N, int *&Adj, int n, int q, int verbose_level)
void create_coll_orthogonal(int &N, int *&Adj, int epsilon, int d, int q, int verbose_level)
void create_Shrikhande(int &N, int *&Adj, int verbose_level)
void create_Grassmann(int &N, int *&Adj, int n, int k, int q, int r, int verbose_level)
void create_cycle(int &N, int *&Adj, int n, int verbose_level)
void create_Schlaefli(int &N, int *&Adj, int q, int verbose_level)
void init(create_graph_description *description, int verbose_level)
void make_collinearity_graph(int &N, int *&Adj, int *Inc, int nb_rows, int nb_cols, int verbose_level)
void make_chain_graph(int &N, int *&Adj, int *part1, int sz1, int *part2, int sz2, int verbose_level)
void create_Sarnak(int &N, int *&Adj, int p, int q, int verbose_level)
void make_orbital_graph(int &N, int *&Adj, apps_algebra::any_group *AG, int orbit_idx, int verbose_level)
void create_Johnson(int &N, int *&Adj, int n, int k, int s, int verbose_level)
void create_Winnie_Li(int &N, int *&Adj, int q, int index, int verbose_level)
#define Int_vec_scan(A, B, C)
Definition: foundations.h:716
#define FREE_int(p)
Definition: foundations.h:640
#define Int_vec_zero(A, B)
Definition: foundations.h:713
#define NEW_OBJECT(type)
Definition: foundations.h:638
#define Lint_vec_print(A, B, C)
Definition: foundations.h:686
#define FREE_OBJECT(p)
Definition: foundations.h:651
#define NEW_int(n)
Definition: foundations.h:625
#define Int_matrix_print(A, B, C)
Definition: foundations.h:707
#define TRUE
Definition: foundations.h:231
#define FALSE
Definition: foundations.h:234
#define EVEN(x)
Definition: foundations.h:221
#define ODD(x)
Definition: foundations.h:222
#define Int_vec_print(A, B, C)
Definition: foundations.h:685
orbiter_kernel_system::orbiter_session * Orbiter
global Orbiter session
user_interface::orbiter_top_level_session * The_Orbiter_top_level_session
the orbiter library for the classification of combinatorial objects