Orbiter 2022
Combinatorial Objects
vector.cpp
Go to the documentation of this file.
1// vector.cpp
2//
3// Anton Betten
4// 18.12.1998
5// moved from D2 to ORBI Nov 15, 2007
6
8#include "discreta.h"
9
10#undef VECTOR_COPY_VERBOSE
11#undef VECTOR_CHANGE_KIND_VERBOSE
12
13using namespace std;
14
15
16namespace orbiter {
17namespace layer2_discreta {
18
19
21{
22 k = VECTOR;
23 self.vector_pointer = NULL;
24}
25
27 // copy constructor: this := x
28{
29 // cout << "Vector::copy constructor for object: " << << "\n";
30 clearself();
31 const_cast<discreta_base &>(x).copyobject_to(*this);
32}
33
35 // copy assignment
36{
37 // cout << "Vector::operator = (copy assignment)" << endl;
38 copyobject(const_cast<discreta_base &>(x));
39 return *this;
40}
41
43{
44 OBJECTSELF s;
45
46 s = self;
47 new(this) Vector;
48 self = s;
49 k = VECTOR;
50}
51
53{
54 // cout << "Vector::~Vector()\n";
56}
57
59{
60 if (self.vector_pointer == NULL)
61 return;
62 // cout << "Vector::freeself_vector():"; cout << *this << endl;
64 self.vector_pointer = NULL;
65}
66
68{
69 return VECTOR;
70}
71
73{
74 int i, l;
75
76#ifdef VECTOR_COPY_VERBOSE
77 cout << "in Vector::copyobject_to()\n";
78#endif
79 x.freeself();
80 if (x.s_kind() != VECTOR) {
81#ifdef VECTOR_CHANGE_KIND_VERBOSE
82 cout << "warning: Vector::copyobject_to x not a vector\n";
83#endif
84 x.c_kind(VECTOR);
85 x.clearself();
86 // x.printobjectkindln();
87 }
88#ifdef VECTOR_COPY_VERBOSE
89 cout << "source=" << *this << endl;
90 cout << "target=" << x << endl;
91#endif
92 l = s_l();
93#ifdef VECTOR_COPY_VERBOSE
94 cout << "l=" << l << endl;
95#endif
96 Vector & xx = x.as_vector();
97 xx.m_l(l);
98#ifdef VECTOR_COPY_VERBOSE
99 cout << "after xx.m_l(l)\n";
100#endif
101 for (i = 0; i < l; i++) {
102#ifdef VECTOR_COPY_VERBOSE
103 cout << "in Vector::copyobject_to() copy element "
104 << i << "=" << s_i(i) << "\n";
105#endif
106 xx[i] = s_i(i);
107 }
108}
109
110#undef PRINT_WITH_TYPE
111
112ostream& Vector::Print(ostream& ost)
113{
114 int i, l;
115
116 if (self.vector_pointer == NULL) {
117 ost << "vector not allocated";
118 }
119 l = s_l();
120#ifdef PRINT_WITH_TYPE
121 ost << "(VECTOR of length " << l << ", \n";
122#endif
123 for (i = 0; i < l; i++) {
124 s_i(i).print(ost);
125 if (i < l - 1)
126 ost << ", \n";
127 }
128#ifdef PRINT_WITH_TYPE
129 ost << ")";
130#endif
131 ost << "\n";
132 return ost;
133}
134
135ostream& Vector::print(ostream& ost)
136{
137 int i, l;
138
139 // cout << "Vector::print()" << endl;
140 if (self.vector_pointer == NULL) {
141 ost << "vector not allocated";
142 }
143 l = s_l();
145 ost << "[";
146 for (i = 0; i < l; i++) {
147 s_i(i).print(ost);
148 if (i < l - 1)
149 ost << ", ";
150 }
151 ost << "]";
152 }
153 else {
154#ifdef PRINT_WITH_TYPE
155 ost << "(VECTOR of length " << l << ", ";
156#else
157 ost << "(";
158#endif
159 for (i = 0; i < l; i++) {
160 s_i(i).print(ost);
161 if (i < l - 1)
162 ost << ", ";
163 }
164 ost << ")";
165 }
166 return ost;
167}
168
169ostream& Vector::print_unformatted(ostream& ost)
170{
171 int i, l;
172
173 if (self.vector_pointer == NULL) {
174 ost << "vector not allocated";
175 }
176 l = s_l();
177 for (i = 0; i < l; i++) {
178 s_i(i).print(ost);
179 ost << " ";
180 }
181 return ost;
182}
183
184ostream& Vector::print_intvec(ostream& ost)
185{
186 int i, l;
187
188 if (self.vector_pointer == NULL) {
189 ost << "vector not allocated";
190 }
191 l = s_l();
192 ost << "(";
193 for (i = 0; i < l; i++) {
194 ost << s_ii(i);
195 if (i < l - 1)
196 ost << " ";
197 }
198 ost << ")";
199 return ost;
200}
201
203{
204 int l;
205
206 if (self.vector_pointer == NULL) {
207 cout << "Vector::s_i() vector_pointer == NULL\n";
208 exit(1);
209 }
210 l = self.vector_pointer[-1].s_i_i();
211 if ( i < 0 || i >= l ) {
212 cout << "Vector::s_i() addressing error, i = " << i << ", length = " << l << "\n";
213 exit(1);
214 }
215 return self.vector_pointer[i];
216}
217
219{
220 if (self.vector_pointer == NULL)
221 return 0;
222 // cout << "Vector::s_l()" << endl;
223 return self.vector_pointer[-1].s_i_i();
224}
225
226void Vector::m_l(int l)
227{
228 // cout << "vector::m_l() l=" << l << "\n";
229 // printobjectkind(cout);
230 // cout << *this << "\n";
231 // cout << "calling freeself\n";
232 freeself();
233 // cout << "Vector::m_l(), calling calloc_nobjects_plus_length\n";
235}
236
237void Vector::m_l_n(int l)
238{
239 int i;
240
241 m_l(l);
242 for (i = 0; i < l; i++) {
243 s_i(i).m_i_i(0);
244 }
245}
246
247void Vector::m_l_e(int l)
248{
249 int i;
250
251 m_l(l);
252 for (i = 0; i < l; i++) {
253 s_i(i).m_i_i(1);
254 }
255}
256
258{
259 int i;
260
261 m_l(l);
262 for (i = 0; i < l; i++) {
263 s_i(i) = x;
264 }
265}
266
268{
269 Vector v;
270 int i, ll;
271
272 ll = s_l();
273 v.m_l(l);
274 for (i = 0; i < MINIMUM(l, ll); i++) {
275 v.s_i(i).swap(s_i(i));
276 }
277 swap(v);
278 return *this;
279}
280
282{
283 if (x.s_kind() == MATRIX) {
286 }
287 else if (x.s_kind() == VECTOR) {
288 cout << "Vector::mult_to() error: cannot multiply vector with vector\n";
289 exit(1);
290 // Vector& px = x.as_vector();
291 // vector_mult_to(px, y);
292 }
293 else {
294 cout << "vector::mult_to() object x is of bad type\n";
295 exit(1);
296 }
297}
298
300{
301 int i, l;
302
303 y.freeself();
304 if (s_kind() != VECTOR) {
305 cout << "Vector::add_to() this is not a vector\n";
306 exit(1);
307 }
308 if (x.s_kind() != VECTOR) {
309 cout << "matrix::add_to() x is not a vector\n";
310 exit(1);
311 }
312 Vector& px = x.as_vector();
313 Vector py;
314
315 l = s_l();
316 if (l != px.s_l()) {
317 cout << "vector::add_to() l != px.s_l()\n";
318 exit(1);
319 }
320 py.m_l(l);
321 for (i = 0; i < l; i++) {
322 py[i].add(s_i(i), px[i]);
323 }
324 py.swap(y);
325}
326
328{
329 realloc(s_l() + 1);
330}
331
333{
334 int l = s_l();
335
336 if (l == 0) {
337 cout << "Vector::dec() length is zero\n";
338 exit(1);
339 }
340 realloc(l - 1);
341}
342
344{
345 int l1, l2, i, c;
346
347 if (s_kind() != VECTOR) {
348 return compare_with(a);
349 }
350 if (a.s_kind() != VECTOR) {
351 cout << "a is not a vector\n";
352 exit(1);
353 }
354 Vector& v = a.as_vector();
355 l1 = s_l();
356 l2 = v.s_l();
357 for (i = 0; i < l1; i++) {
358 if (i < l2) {
359 c = s_i(i).compare_with(v[i]);
360 if (c != 0)
361 return c;
362 }
363 else {
364 return -1;
365 }
366 }
367 if (l2 > l1)
368 return 1;
369 return 0;
370}
371
373{
374 Vector w;
375 int i, l1, l2, l3;
376
377 l1 = s_l();
378 l2 = v.s_l();
379 l3 = l1 + l2;
380 w.m_l(l3);
381 for (i = 0; i < l1; i++) {
382 w[i].swap(s_i(i));
383 }
384 for (i = 0; i < l2; i++) {
385 w[l1 + i].swap(v[i]);
386 }
387 swap(w);
388}
389
391{
392 int l;
393
394 l = s_l();
395 inc();
396 m_ii(l, a);
397 return *this;
398}
399
401{
402 int l;
403
404 l = s_l();
405 inc();
406 s_i(l) = a;
407 return *this;
408}
409
411{
412 int j, l;
413
414 l = s_l();
415 // cout << "Vector::insert_element(" << i << ", " << x << "), l=" << l << "\n";
416 inc();
417 for (j = l; j > i; j--) {
418 s_i(j).swap(s_i(j - 1));
419 }
420 // cout << "before s_i(i) = x;\n";
421 // cout << "s_i(i)=" << s_i(i) << endl;
422 // cout << "x=" << x << endl;
423 s_i(i) = x;
424 return *this;
425}
426
428{
429 int l;
430
431 l = s_l();
432 if (i >= l) {
433 cout << "Vector::get_and_delete_element() i >= l" << endl;
434 exit(1);
435 }
436 x.swap(s_i(i));
437 return delete_element(i);
438}
439
441{
442 int l, j;
443 l = s_l();
444 for (j = i + 1; j < l; j++) {
445 s_i(j - 1).swap(s_i(j));
446 }
447 dec();
448 return *this;
449}
450
452{
454}
455
457 // inserts x into the sorted Vector x.
458 // ifthere are already occurences of x, the new x is added
459 // behind the x already there.
460 // returns true if the element was already in the Vector.
461{
462 int idx;
463
464 if (search(x, &idx)) {
465 // cout << "insert_sorted() found element at " << idx << endl;
466 idx++;
467 insert_element(idx, x);
468 return true;
469 }
470 else {
471 // cout << "insert_sorted() element not found, inserting at " << idx << endl;
472 insert_element(idx, x);
473 return false;
474 }
475}
476
478 // returns TRUE if the object x has been found.
479 // idx contains the position where the object which
480 // has been found lies.
481 // if there are more than one element equal to x in the Vector,
482 // the last one will be found.
483 // if the element has not been found, idx contains the position of
484 // the next larger element.
485 // This is the position to insert x if required.
486{
487 int l, r, m, res, len;
488 bool f_found = false;
489
490 len = s_l();
491 if (len == 0) {
492 *idx = 0;
493 return false;
494 }
495 l = 0;
496 r = len;
497 // invariant:
498 // p[i] <= v for i < l;
499 // p[i] > v for i >= r;
500 // r - l is the length of the area to search in.
501 while (l < r) {
502 m = (l + r) >> 1;
503 // if the length of the search area is even
504 // we examine the element above the middle
505 res = s_i(m).compare_with(x);
506 // cout << "search l=" << l << " m=" << m << " r="
507 // << r << "res=" << res << endl;
508 if (res <= 0) {
509 l = m + 1;
510 if (res == 0)
511 f_found = true;
512 }
513 else
514 r = m;
515 }
516 // now: l == r;
517 // and f_found is set accordingly */
518 if (f_found)
519 l--;
520 *idx = l;
521 return f_found;
522}
523
524static void quicksort(Vector& v, int left, int right);
525static void quicksort_with_logging(Vector& v, permutation& p, int left, int right);
526static void partition(Vector& v, int left, int right, int *middle);
527static void partition_with_logging(Vector& v, permutation& p, int left, int right, int *middle);
528
530{
531 int l;
532
533 l = s_l();
534 quicksort(*this, 0, l - 1);
535 return *this;
536}
537
539{
540 permutation p, pv;
541
543 pv = p;
544 pv.invert();
545 fellow.apply_permutation(pv);
546}
547
549 // the permutation p tells where the sorted elements
550 // lay before, i.e. p[i] is the position of the
551 // sorted element i in the unsorted Vector.
552{
553 int l;
554
555 l = s_l();
556 p.m_l(l);
557 p.one();
558 quicksort_with_logging(*this, p, 0, l - 1);
559 return *this;
560}
561
562
563static void quicksort(Vector& v, int left, int right)
564{
565 int middle;
566
567 if (left < right) {
568 partition(v, left, right, &middle);
569 quicksort(v, left, middle - 1);
570 quicksort(v, middle + 1, right);
571 }
572}
573
574static void quicksort_with_logging(Vector& v, permutation& p, int left, int right)
575{
576 int middle;
577
578 if (left < right) {
579 partition_with_logging(v, p, left, right, &middle);
580 quicksort_with_logging(v, p, left, middle - 1);
581 quicksort_with_logging(v, p, middle + 1, right);
582 }
583}
584
585static void partition(Vector& v, int left, int right, int *middle)
586{
587 int l, r, m, len, m1, res, pivot;
588
589 // pivot strategy: take the element in the middle:
590 len = right + 1 - left;
591 m1 = len >> 1;
592 pivot = left;
593 if (m1)
594 v[pivot].swap(v[left + m1]);
595 l = left;
596 r = right;
597 while (l < r) {
598 while (TRUE) {
599 if (l > right)
600 break;
601 res = v[l].compare_with(v[pivot]);
602 if (res > 0)
603 break;
604 l++;
605 }
606 while (TRUE) {
607 if (r < left)
608 break;
609 res = v[r].compare_with(v[pivot]);
610 if (res <= 0)
611 break;
612 r--;
613 }
614 // now v[l] > v[pivot] and v[r] <= v[pivot]
615 if (l < r)
616 v[l].swap(v[r]);
617 }
618 m = r;
619 if (left != m)
620 v[left].swap(v[m]);
621 *middle = m;
622}
623
624static void partition_with_logging(Vector& v, permutation& p, int left, int right, int *middle)
625{
626 int l, r, m, len, m1, res, pivot;
628
629 // pivot strategy: take the element in the middle:
630 len = right + 1 - left;
631 m1 = len >> 1;
632 pivot = left;
633 if (m1) {
634 v[pivot].swap(v[left + m1]);
635 Algo.int_swap(p[pivot], p[left + m1]);
636 }
637 l = left;
638 r = right;
639 while (l < r) {
640 while (TRUE) {
641 if (l > right)
642 break;
643 res = v[l].compare_with(v[pivot]);
644 if (res > 0)
645 break;
646 l++;
647 }
648 while (TRUE) {
649 if (r < left)
650 break;
651 res = v[r].compare_with(v[pivot]);
652 if (res <= 0)
653 break;
654 r--;
655 }
656 // now v[l] > v[pivot] and v[r] <= v[pivot]
657 if (l < r) {
658 v[l].swap(v[r]);
659 Algo.int_swap(p[l], p[r]);
660 }
661 }
662 m = r;
663 if (left != m) {
664 v[left].swap(v[m]);
665 Algo.int_swap(p[left], p[m]);
666 }
667 *middle = m;
668}
669
670
672{
673 int l = s_l();
674 int i;
675
676 x = s_i(0);
677 for (i = 1; i < l; i++) {
678 x += s_i(i);
679 }
680}
681
682
683
684
685void Vector::n_choose_k_first(int n, int k)
686{
687 int i;
688
689 m_l_n(k);
690 for (i = 0; i < k; i++) {
691 m_ii(i, i);
692 }
693}
694
695int Vector::n_choose_k_next(int n, int k)
696{
697 int i, ii, a;
698
699 if (k != s_l()) {
700 cout << "Vector::n_choose_k_next() k != s_l()";
701 exit(1);
702 }
703 for (i = 0; i < k; i++) {
704 a = s_ii(k - 1 - i);
705 if (a < n - 1 - i) {
706 m_ii(k - 1 - i, a + 1);
707 for (ii = i - 1; ii >= 0; ii--) {
708 m_ii(k - 1 - ii, s_ii(k - 1 - ii - 1) + 1);
709 }
710 return TRUE;
711 }
712 }
713 return FALSE;
714}
715
717{
718 int l = s_l();
719 int i, j;
720
721 for (i = l - 1, j = 0; i >= 0; i--, j++) {
722 if (s_ii(i) < j) {
723 s_i(i).inc();
724 return TRUE;
725 }
726 else
727 m_ii(i, 0);
728 }
729 return FALSE;
730}
731
733//Computes the permutation $p$ defined by its lehmercode (this).
734{
735 int i, k, l;
736 Vector list;
737
738 l = s_l();
739 p.m_l(l);
740 list.m_l(l);
741
742 // list := (0,1,2,...,l-1):
743 for (i = 0; i < l; i++)
744 list.m_ii(i, i);
745
746 for (i = 0; i < l; i++) {
747 k = s_ii(i);
748 p[i] = list.s_ii(k);
749 list.delete_element(k);
750 }
751}
752
753void Vector::q_adic(int n, int q)
754{
755 int r, i = 0;
756
757 m_l(0);
758 do {
759 inc();
760 r = n % q;
761 m_ii(i, r);
762 n /= q;
763 i++;
764 } while(n);
765}
766
768{
769 int r, n = 0, i, l;
770
771 l = s_l();
772 n = 0;
773 for (i = l - 1; i >= 0; i--) {
774 n *= q;
775 r = s_ii(i);
776 n += r;
777 }
778 return n;
779}
780
782{
783 int i, l;
784
785 l = s_l();
786 for (i = 0; i < l; i++) {
787 s_i(i) *= a;
788 }
789}
790
791void Vector::first_word(int n, int q)
792{
793 m_l_n(n);
794}
795
797{
798 int n, i;
799
800 n = s_l();
801 i = n - 1;
802 while (s_ii(i) == q - 1) {
803 m_ii(i, 0);
804 i--;
805 if (i < 0)
806 return FALSE;
807 }
808 s_i(i).inc();
809 return TRUE;
810}
811
813{
814 m_l_n(n);
815}
816
818{
819 do {
820 if (!next_word(q))
821 return FALSE;
822 } while (!is_regular_word());
823 return TRUE;
824}
825
827// works correct only for Vectors over the integers
828{
829 int n, i, k, ipk, f_rg;
830
831 n = s_l();
832 if (n == 1)
833 return TRUE;
834 k = 1;
835 do {
836 i = 0;
837 ipk = i + k;
838 while (s_ii(ipk) == s_ii(i) && i < n - 1) {
839 i++;
840 if (ipk == n - 1)
841 ipk = 0;
842 else
843 ipk++;
844 }
845 f_rg = (s_ii(ipk) < s_ii(i));
846 k++;
847 } while (f_rg && k <= n - 1);
848 return f_rg;
849}
850
852{
853 int i, j, l;
854 Vector v;
855
856 l = s_l();
857 v.m_l(l);
858 for (i = 0; i < l; i++) {
859 j = p.s_i(i);
860 v[j].swap(s_i(i));
861 }
862 swap(v);
863}
864
866{
867 int i, l, a, b;
868
869 l = s_l();
870 for (i = 0; i < l; i++) {
871 a = s_ii(i);
872 b = p.s_i(a);
873 m_ii(i, b);
874 }
875}
876
877void Vector::content(Vector & c, Vector & where)
878{
879 int i, l, idx;
881 Vector v;
882
883 v.m_l(0);
884 where.m_l(0);
885 c.m_l(0);
886 l = s_l();
887 for (i = 0; i < l; i++) {
888 x = s_i(i);
889 if (c.search(x, &idx)) {
890 }
891 else {
892 c.insert_element(idx, x);
893 where.insert_element(idx, v);
894 }
895 where[idx].as_vector().append_integer(i);
896 }
897}
898
900{
901 int i, l, idx;
903 integer int_ob;
904
905 int_ob.m_i(0);
906 mult.m_l(0);
907 c.m_l(0);
908 l = s_l();
909 for (i = 0; i < l; i++) {
910 x = s_i(i);
911 if (c.search(x, &idx)) {
912 }
913 else {
914 c.insert_element(idx, x);
915 mult.insert_element(idx, int_ob);
916 }
917 mult[idx].inc();
918 }
919}
920
922// homogeneous integer Vector predicate
923{
924 int i, l;
925
926 l = s_l();
927 for (i = 0; i < l; i++) {
928 if (s_i(i).s_kind() != INTEGER)
929 return FALSE;
930 }
931 return TRUE;
932}
933
935// homogeneous integer Vector predicate,
936// test for 1 char numbers;
937// only to apply if hip TRUE. */
938{
939 int i, l, k;
940
941 l = s_l();
942 for (i = 0; i < l; i++) {
943 if (s_i(i).s_kind() != INTEGER) {
944 cout << "Vector::hip1(): object not of type INTEGER\n";
945 exit(1);
946 }
947 k = s_ii(i);
948 if (!ONE_char_int(k))
949 return FALSE;
950 }
951 return TRUE;
952}
953
954void Vector::write_mem(memory & m, int debug_depth)
955{
956 int i, l, k;
957 char f_hip = 0, f_hip1 = 0;
958
959 l = s_l();
960 m.write_int(l);
961 f_hip = (char) hip();
962 if (f_hip)
963 f_hip1 = (char) hip1();
964 if (debug_depth > 0) {
965 cout << "writing ";
966 if (f_hip) {
967 if (f_hip1)
968 cout << "hip1 ";
969 else
970 cout << "hip ";
971 }
972 cout << "Vector of length " << l << endl;
973 }
974 m.write_char(f_hip);
975 if (f_hip) {
976 m.write_char(f_hip1);
977 if (f_hip1) {
978 for (i = 0; i < l; i++) {
979 k = s_ii(i);
980 m.write_char((char) k);
981 }
982 }
983 else {
984 for (i = 0; i < l; i++) {
985 m.write_int(s_ii(i));
986 }
987 }
988 }
989 else {
990 for (i = 0; i < l; i++) {
991 if (debug_depth > 0) {
992 cout << l << " ";
993 if ((l % 20) == 0)
994 cout << endl;
995 }
996 s_i(i).write_memory(m, debug_depth - 1);
997 }
998 }
999}
1000
1001void Vector::read_mem(memory & m, int debug_depth)
1002{
1003 int i, l, k;
1004 char c, f_hip = 0, f_hip1 = 0;
1005
1006 m.read_int(&l);
1007 m_l(l);
1008 m.read_char(&f_hip);
1009 if (f_hip) {
1010 m.read_char(&f_hip1);
1011 }
1012 if (debug_depth > 0) {
1013 cout << "reading ";
1014 if (f_hip) {
1015 if (f_hip1)
1016 cout << "hip1 ";
1017 else
1018 cout << "hip ";
1019 }
1020 cout << "Vector of length " << l << endl;
1021 }
1022 if (f_hip) {
1023 if (f_hip1) {
1024 for (i = 0; i < l; i++) {
1025 m.read_char(&c);
1026 k = (int) c;
1027 m_ii(i, k);
1028 }
1029 }
1030 else {
1031 for (i = 0; i < l; i++) {
1032 m.read_int(&k);
1033 m_ii(i, k);
1034 }
1035 }
1036 }
1037 else {
1038 for (i = 0; i < l; i++) {
1039 if (debug_depth > 0) {
1040 cout << l << " ";
1041 if ((l % 20) == 0)
1042 cout << endl;
1043 }
1044 s_i(i).read_memory(m, debug_depth - 1);
1045 }
1046 }
1047}
1048
1050{
1051 int i, l;
1052 char f_hip, f_hip1;
1053 int size = 0;
1054
1055 l = s_l();
1056 size += 4; /* l */
1057 f_hip = (char) hip();
1058 size += 1; /* f_hip */
1059 if (f_hip) {
1060 f_hip1 = (char) hip1();
1061 size += 1; /* f_hip1 */
1062 if (f_hip1)
1063 size += 1 * l;
1064 else
1065 size += 4 * l;
1066 }
1067 else {
1068 for (i = 0; i < l; i++)
1069 size += s_i(i).calc_size_on_file();
1070 }
1071 return size;
1072}
1073
1075{
1076 discreta_base av, b;
1077 int i, l;
1078
1079 av = a;
1080 av.invert();
1081 l = s_l();
1082 for (i = 0; i < l; i++) {
1083 b = av;
1084 b *= s_i(i);
1085 b *= a;
1086 s_i(i) = b;
1087 }
1088}
1089
1091{
1092 discreta_base av;
1093
1094 av = a;
1095 av.invert();
1096 conjugate(av);
1097}
1098
1099void merge(Vector &v1, Vector &v2, Vector &v3)
1100{
1101 int l1, l2, l3, i1 = 0, i2 = 0, r;
1102 int f_add1; //, f_add2;
1103
1104 l1 = v1.s_l();
1105 l2 = v2.s_l();
1106 l3 = l1 + l2;
1107 v3.m_l(l3);
1108 while (i1 < l1 || i2 < l2) {
1109 f_add1 = FALSE;
1110 //f_add2 = FALSE;
1111 if (i1 < l1 && i2 < l2) {
1112 r = v1[i1].compare_with(v2[i2]);
1113 if (r < 0)
1114 f_add1 = TRUE;
1115 //else
1116 // f_add2 = TRUE;
1117 }
1118 else if (i1 < l1)
1119 f_add1 = TRUE;
1120 //else
1121 // f_add2 = TRUE;
1122 if (f_add1) {
1123 v3[i1 + i2] = v1[i1];
1124 i1++;
1125 }
1126 else {
1127 v3[i1 + i2] = v2[i2];
1128 i2++;
1129 }
1130 }
1131}
1132
1133void merge_with_fellows(Vector &v1, Vector &v1_fellow,
1134 Vector &v2, Vector &v2_fellow,
1135 Vector &v3, Vector &v3_fellow)
1136{
1137 int l1, l2, l3, i1 = 0, i2 = 0, r;
1138 int f_add1; //, f_add2;
1139
1140 l1 = v1.s_l();
1141 l2 = v2.s_l();
1142 l3 = l1 + l2;
1143 v3.m_l(l3);
1144 v3_fellow.m_l(l3);
1145 while (i1 < l1 || i2 < l2) {
1146 f_add1 = FALSE;
1147 //f_add2 = FALSE;
1148 if (i1 < l1 && i2 < l2) {
1149 r = v1[i1].compare_with(v2[i2]);
1150 if (r < 0)
1151 f_add1 = TRUE;
1152 //else
1153 // f_add2 = TRUE;
1154 }
1155 else if (i1 < l1)
1156 f_add1 = TRUE;
1157 //else
1158 // f_add2 = TRUE;
1159 if (f_add1) {
1160 v3[i1 + i2] = v1[i1];
1161 v3_fellow[i1 + i2] = v1_fellow[i1];
1162 i1++;
1163 }
1164 else {
1165 v3[i1 + i2] = v2[i2];
1166 v3_fellow[i1 + i2] = v2_fellow[i2];
1167 i2++;
1168 }
1169 }
1170}
1171
1172void merge_with_value(Vector &idx1, Vector &idx2, Vector &idx3,
1173 Vector &val1, Vector &val2, Vector &val3)
1174{
1175 int i1, i2, l1, l2, a1, a2, f_add1, f_add2;
1176 Vector v;
1177
1178 idx3.m_l(0);
1179 val3.m_l(0);
1180 i1 = 0;
1181 i2 = 0;
1182 l1 = idx1.s_l();
1183 l2 = idx2.s_l();
1184 while (i1 < l1 || i2 < l2) {
1185 f_add1 = FALSE;
1186 f_add2 = FALSE;
1187 if (i1 < l1 && i2 < l2) {
1188 a1 = idx1.s_ii(i1);
1189 a2 = idx2.s_ii(i2);
1190 if (a1 == a2) {
1191 v.m_l(2);
1192 v.m_ii(0, val1.s_ii(i1));
1193 v.m_ii(1, val2.s_ii(i2));
1194 idx3.append_integer(a1);
1195 val3.append(v);
1196 i1++;
1197 i2++;
1198 }
1199 else if (a1 < a2)
1200 f_add1 = TRUE;
1201 else
1202 f_add2 = TRUE;
1203 }
1204 else {
1205 if (i1 < l1)
1206 f_add1 = TRUE;
1207 else
1208 f_add2 = TRUE;
1209 }
1210 if (f_add1) {
1211 a1 = idx1.s_ii(i1);
1212 v.m_l(2);
1213 v.m_ii(0, val1.s_ii(i1));
1214 v.m_ii(1, 0);
1215 idx3.append_integer(a1);
1216 val3.append(v);
1217 i1++;
1218 }
1219 if (f_add2) {
1220 a2 = idx2.s_ii(i2);
1221 v.m_l(2);
1222 v.m_ii(0, 0);
1223 v.m_ii(1, val2.s_ii(i2));
1224 idx3.append_integer(a2);
1225 val3.append(v);
1226 i2++;
1227 }
1228
1229 }
1230}
1231
1233{
1234 int i, l, a, b;
1235
1236 l = s_l();
1237 for (i = 0; i < l; i++) {
1238 a = s_ii(i);
1239 b = v.s_ii(a);
1240 m_ii(i, b);
1241 }
1242}
1243
1245{
1246 int i, l;
1247
1248 l = s_l();
1249 for (i = 0; i < l; i++) {
1250 s_i(i).as_vector().replace(v);
1251 }
1252}
1253
1254void Vector::extract_subvector(Vector & v, int first, int len)
1255{
1256 int i;
1257
1258 v.m_l(len);
1259 for (i = 0; i < len; i++) {
1260 v.s_i(i) = s_i(first + i);
1261 }
1262}
1263
1264
1266// top (=highest) element which is different from zero becomes one
1267{
1268 int i, j, l;
1269 discreta_base a;
1270
1271 l = s_l();
1272 for (i = l - 1; i >= 0; i--) {
1273 if (!s_i(i).is_zero()) {
1274 if (s_i(i).is_one())
1275 return;
1276 a = s_i(i);
1277 a.invert();
1278 for (j = i; j >= 0; j--) {
1279 s_i(j) *= a;
1280 }
1281 return;
1282 }
1283 }
1284 cout << "Vector::PG_element_normalize() zero vector()" << endl;
1285 exit(1);
1286}
1287
1289{
1290 domain *d;
1291 int l, i, j, q, q_power_j, b;
1292
1293 if (!is_finite_field_domain(d)) {
1294 cout << "Vector::PG_element_rank() no finite field domain" << endl;
1295 exit(1);
1296 }
1298 l = s_l();
1299 if (l <= 0) {
1300 cout << "Vector::PG_element_rank() vector not allocated()" << endl;
1301 exit(1);
1302 }
1304 for (i = l - 1; i >= 0; i--) {
1305 if (!s_i(i).is_zero())
1306 break;
1307 }
1308 if (i < 0) {
1309 cout << "Vector::PG_element_rank() zero vector" << endl;
1310 exit(1);
1311 }
1312 if (!s_i(i).is_one()) {
1313 cout << "Vector::PG_element_rank() vector not normalized" << endl;
1314 exit(1);
1315 }
1316
1317 b = 0;
1318 q_power_j = 1;
1319 for (j = 0; j < i; j++) {
1320 b += q_power_j;
1321 q_power_j *= q;
1322 }
1323
1324
1325 a = 0;
1326 for (j = i - 1; j >= 0; j--) {
1327 a += s_ii(j);
1328 if (j > 0)
1329 a *= q;
1330 }
1331 a += b;
1332}
1333
1335{
1336 domain *d;
1337 int l, i, j, q, q_power_j, b;
1338
1339 if (!is_finite_field_domain(d)) {
1340 cout << "Vector::PG_element_rank_modified() no finite field domain" << endl;
1341 exit(1);
1342 }
1344 l = s_l();
1345 if (l <= 0) {
1346 cout << "Vector::PG_element_rank_modified() vector not allocated()" << endl;
1347 exit(1);
1348 }
1350 for (i = 0; i < l; i++) {
1351 if (!s_i(i).is_zero())
1352 break;
1353 }
1354 if (i == l) {
1355 cout << "Vector::PG_element_rank_modified() zero vector" << endl;
1356 exit(1);
1357 }
1358 for (j = i + 1; j < l; j++) {
1359 if (!s_i(j).is_zero())
1360 break;
1361 }
1362 if (j == l) {
1363 // we have the unit vector vector e_i
1364 a = i;
1365 return;
1366 }
1367
1368 for (i = l - 1; i >= 0; i--) {
1369 if (!s_i(i).is_zero())
1370 break;
1371 }
1372 if (i < 0) {
1373 cout << "Vector::PG_element_rank_modified() zero vector" << endl;
1374 exit(1);
1375 }
1376 if (!s_i(i).is_one()) {
1377 cout << "Vector::PG_element_rank_modified() vector not normalized" << endl;
1378 exit(1);
1379 }
1380
1381 b = 0;
1382 q_power_j = 1;
1383 for (j = 0; j < i; j++) {
1384 b += q_power_j - 1;
1385 q_power_j *= q;
1386 }
1387
1388
1389 a = 0;
1390 for (j = i - 1; j >= 0; j--) {
1391 a += s_ii(j);
1392 if (j > 0)
1393 a *= q;
1394 }
1395 a += b;
1396 a += l - 1;
1397}
1398
1400{
1401 domain *d;
1402 int q, n, l, qhl, k, j, r, a1 = a;
1403
1404 if (!is_finite_field_domain(d)) {
1405 cout << "Vector::PG_element_unrank() no finite field domain" << endl;
1406 exit(1);
1407 }
1409 n = s_l();
1410 if (n <= 0) {
1411 cout << "Vector::PG_element_unrank() vector not allocated()" << endl;
1412 exit(1);
1413 }
1414
1415 l = 0;
1416 qhl = 1;
1417 while (l < n) {
1418 if (a >= qhl) {
1419 a -= qhl;
1420 qhl *= q;
1421 l++;
1422 continue;
1423 }
1424 s_i(l).one();
1425 for (k = l + 1; k < n; k++) {
1426 s_i(k).zero();
1427 }
1428 j = 0;
1429 while (a != 0) {
1430 r = a % q;
1431 m_ii(j, r);
1432 j++;
1433 a -= r;
1434 a /= q;
1435 }
1436 for ( ; j < l; j++)
1437 m_ii(j, 0);
1438 return;
1439 }
1440 cout << "Vector::PG_element_unrank() a too large" << endl;
1441 cout << "n = " << n << endl;
1442 cout << "a = " << a1 << endl;
1443 exit(1);
1444}
1445
1447{
1448 domain *d;
1449 int q, n, l, qhl, k, j, r, a1 = a;
1450
1451 if (!is_finite_field_domain(d)) {
1452 cout << "Vector::PG_element_unrank_modified() no finite field domain" << endl;
1453 exit(1);
1454 }
1456 n = s_l();
1457 if (n <= 0) {
1458 cout << "Vector::PG_element_unrank_modified() vector not allocated()" << endl;
1459 exit(1);
1460 }
1461 if (a < n) {
1462 for (k = 0; k < n; k++) {
1463 if (k == a)
1464 s_i(k).one();
1465 else
1466 s_i(k).zero();
1467 }
1468 return;
1469 }
1470 a -= (n - 1);
1471
1472 l = 0;
1473 qhl = 1;
1474 while (l < n) {
1475 if (a >= qhl) {
1476 a -= (qhl - 1);
1477 qhl *= q;
1478 l++;
1479 continue;
1480 }
1481 s_i(l).one();
1482 for (k = l + 1; k < n; k++) {
1483 s_i(k).zero();
1484 }
1485 j = 0;
1486 while (a != 0) {
1487 r = a % q;
1488 m_ii(j, r);
1489 j++;
1490 a -= r;
1491 a /= q;
1492 }
1493 for ( ; j < l; j++)
1494 m_ii(j, 0);
1495 return;
1496 }
1497 cout << "Vector::PG_element_unrank_modified() a too large" << endl;
1498 cout << "n = " << n << endl;
1499 cout << "a = " << a1 << endl;
1500 exit(1);
1501}
1502
1504{
1505 domain *d;
1506 int q, l, i;
1507
1508 if (!is_finite_field_domain(d)) {
1509 cout << "Vector::AG_element_rank() no finite field domain" << endl;
1510 exit(1);
1511 }
1513 l = s_l();
1514 if (l <= 0) {
1515 cout << "Vector::AG_element_rank() vector not allocated()" << endl;
1516 exit(1);
1517 }
1518 a = 0;
1519 for (i = l - 1; i >= 0; i--) {
1520 a += s_ii(i);
1521 if (i > 0)
1522 a *= q;
1523 }
1524}
1525
1527{
1528 domain *d;
1529 int q, n, i, b;
1530
1531 if (!is_finite_field_domain(d)) {
1532 cout << "Vector::AG_element_unrank() no finite field domain" << endl;
1533 exit(1);
1534 }
1536 n = s_l();
1537 if (n <= 0) {
1538 cout << "Vector::AG_element_unrank() vector not allocated()" << endl;
1539 exit(1);
1540 }
1541 for (i = 0; i < n; i++) {
1542 b = a % q;
1543 m_ii(i, b);
1544 a /= q;
1545 }
1546}
1547
1549{
1550 int i, l, w;
1551
1552 w = 0;
1553 l = s_l();
1554 for (i = 0; i < l; i++) {
1555 if (!s_i(i).is_zero())
1556 w++;
1557 }
1558 return w;
1559}
1560
1562{
1563 int l, i;
1564 discreta_base b;
1565
1566 l = s_l();
1567 if (l != w.s_l()) {
1568 cout << "Vector::scalar_product() l != w.s_l()" << endl;
1569 exit(1);
1570 }
1571 for (i = 0; i < l; i++) {
1572 if (i == 0) {
1573 a.mult(s_i(i), w[i]);
1574 }
1575 else {
1576 b.mult(s_i(i), w[i]);
1577 a += b;
1578 }
1579 }
1580}
1581
1583{
1584 int l, i;
1585 discreta_base b;
1586
1587 l = s_l();
1588 if (l != w.s_l()) {
1589 cout << "Vector::hadamard_product() l != w.s_l()" << endl;
1590 exit(1);
1591 }
1592 for (i = 0; i < l; i++) {
1593 s_i(i) *= w[i];
1594 }
1595}
1596
1598{
1599 int l1 = s_l();
1600 int l2 = b.s_l();
1601 int l3 = 0;
1602 int i, idx;
1603
1604 if (l2 < l1) {
1605 b.intersect(*this, c);
1606 return;
1607 }
1608 c.m_l(l1);
1609 for (i = 0; i < l1; i++) {
1610 if (b.search(s_i(i), &idx)) {
1611 c[l3++] = s_i(i);
1612 }
1613 }
1614 c.realloc(l3);
1615}
1616
1617
1619// V is a Vector of sorted Vectors,
1620// v becomes the set of elements lying in all Vectors of V
1621{
1622 Vector vl;
1623 int l, i, j;
1624 permutation p;
1625 Vector vv;
1626
1627 l = V.s_l();
1628 if (l == 0) {
1629 cout << "intersection_of_vectors() no vectors" << endl;
1630 exit(1);
1631 }
1632 vl.m_l_n(l);
1633 for (i = 0; i < l; i++) {
1634 vl.m_ii(i, V[i].as_vector().s_l());
1635 }
1636 vl.sort_with_logging(p);
1637 j = p[0];
1638 v = V[j].as_vector();
1639 for (i = 1; i < l; i++) {
1640 j = p[i];
1641 v.intersect(V[j].as_vector(), vv);
1642 vv.swap(v);
1643 }
1644}
1645
1647{
1648 int i, l, s = 0;
1649
1650 l = s_l();
1651 for (i = 0; i < l; i++) {
1652 Vector &v = s_i(i).as_vector();
1653 if (v.s_kind() != VECTOR) {
1654 cout << "vector::vector_of_vectors_overall_length element is not a vector" << endl;
1655 cout << *this << endl;
1656 exit(1);
1657 }
1658 s += v.s_l();
1659 }
1660 return s;
1661}
1662
1664{
1665 int l = exponents.s_l();
1666 m_l_n(l);
1667}
1668
1670{
1671 int n, i;
1672
1673 n = s_l();
1674 i = n - 1;
1675 if (i < 0)
1676 return FALSE;
1677 while (s_ii(i) == exponents.s_ii(i)) {
1678 m_ii(i, 0);
1679 i--;
1680 if (i < 0)
1681 return FALSE;
1682 }
1683 s_i(i).inc();
1684 return TRUE;
1685}
1686
1688{
1689 int n, i;
1690
1691 n = s_l();
1692 i = n - 1;
1693 if (i < 0)
1694 return FALSE;
1695 while (s_ii(i) == exponents.s_ii(i)) {
1696 m_ii(i, 0);
1697 i--;
1698 if (i < 0)
1699 return FALSE;
1700 }
1701 s_i(i).inc();
1702 for (i = 0; i < n; i++) {
1703 if (s_ii(i) < exponents.s_ii(i))
1704 break;
1705 }
1706 if (i < n)
1707 return TRUE;
1708 else
1709 return FALSE;
1710}
1711
1713{
1714 int n, i;
1715 discreta_base a;
1716
1717 x.m_i_i(1);
1718 n = s_l();
1719 for (i = 0; i < n; i++) {
1720 if (s_ii(i) == 0)
1721 continue;
1722 a = primes[i];
1723 a.power_int(s_ii(i));
1724 x *= a;
1725 }
1726}
1727
1728int Vector::hash(int hash0)
1729{
1730 int h = hash0;
1731 int i, l;
1732
1733 l = s_l();
1734 h = hash_int(h, s_l());
1735 for (i = 0; i < l; i++) {
1736 if (s_i(i).s_kind() != INTEGER) {
1737 cout << "Vector::hash() must be vector of integers" << endl;
1738 exit(1);
1739 }
1740 h = hash_int(h, s_ii(i));
1741 }
1742 return h;
1743}
1744
1746// w must be sorted
1747{
1748 int i, idx;
1749
1750 for (i = 0; i < s_l(); i++) {
1751 if (!w.search(s_i(i), &idx))
1752 return FALSE;
1753 }
1754 return TRUE;
1755}
1756
1758{
1759 int l1, l2, l3, i, k;
1760
1761 l1 = v1.s_l();
1762 l2 = v2.s_l();
1763 l3 = l1 + l2;
1764 m_l(l3);
1765 k = 0;
1766 for (i = 0; i < l1; i++) {
1767 s_i(k) = v1.s_i(i);
1768 k++;
1769 }
1770 for (i = 0; i < l2; i++) {
1771 s_i(k) = v2.s_i(i);
1772 k++;
1773 }
1774}
1775
1776#undef DEBUG_PRint_WORD_NICELY
1777
1778void Vector::print_word_nicely(ostream &ost, int f_generator_labels, Vector &generator_labels)
1779{
1780 if (f_generator_labels) {
1781 print_word_nicely_with_generator_labels(ost, generator_labels);
1782 }
1783 else {
1784 print_word_nicely2(ost);
1785 }
1786#ifdef DEBUG_PRint_WORD_NICELY
1787 cout << *this << " = ";
1788 if (f_generator_labels) {
1789 print_word_nicely_with_generator_labels(cout, generator_labels);
1790 }
1791 else {
1792 print_word_nicely2(cout);
1793 }
1794 cout << endl;
1795#endif
1796}
1797
1799{
1800 int i, j, e, l;
1801 char c;
1802
1803 l = s_l();
1804 // ost << "";
1805 for (i = 0; i < l; i += e) {
1806 for (j = i + 1; j < l; j++) {
1807 if (!s_i(j).eq(s_i(i)))
1808 break;
1809 }
1810 e = j - i;
1811 c = 'a' + s_ii(i);
1812 ost << c;
1813 if (e >= 10) {
1814 ost << "^{" << e << "} ";
1815 }
1816 else if (e >= 2) {
1817 ost << "^" << e << " ";
1818 }
1819 else
1820 ost << " ";
1821 }
1822 // ost << "";
1823}
1824
1825void Vector::print_word_nicely_with_generator_labels(ostream &ost, Vector &generator_labels)
1826{
1827 int i, j, e, l;
1828
1829 l = s_l();
1830 for (i = 0; i < l; i += e) {
1831 for (j = i + 1; j < l; j++) {
1832 if (!s_i(j).eq(s_i(i)))
1833 break;
1834 }
1835 e = j - i;
1836 hollerith &h = generator_labels[s_ii(i)].as_hollerith();
1837 ost << h.s();
1838 if (e >= 10) {
1839 ost << "^{" << e << "} ";
1840 }
1841 else if (e >= 2) {
1842 ost << "^" << e << " ";
1843 }
1844 else
1845 ost << " ";
1846 }
1847}
1848
1850{
1851 int i, l, ll;
1852
1853 l = s_l();
1854 lengths.m_l_n(l);
1855 for (i = 0; i < l; i++) {
1856 ll = s_i(i).as_vector().s_l();
1857 lengths.m_ii(i, ll);
1858 }
1859}
1860
1862{
1863 int i, l, o;
1864
1865 l = s_l();
1866 vec_of_orders.m_l_n(l);
1867 for (i = 0; i < l; i++) {
1868 o = s_i(i).order();
1869 vec_of_orders.m_ii(i, o);
1870 }
1871}
1872
1873}}
DISCRETA vector class for vectors of DISCRETA objects.
Definition: discreta.h:797
void first_word(int n, int q)
Definition: vector.cpp:791
Vector & append(discreta_base &x)
Definition: vector.cpp:400
void apply_permutation_to_elements(permutation &p)
Definition: vector.cpp:865
void PG_element_unrank_modified(int a)
Definition: vector.cpp:1446
void mult_scalar(discreta_base &a)
Definition: vector.cpp:781
void extract_subvector(Vector &v, int first, int len)
Definition: vector.cpp:1254
void mult_to(discreta_base &x, discreta_base &y)
Definition: vector.cpp:281
int n_choose_k_next(int n, int k)
Definition: vector.cpp:695
void q_adic(int n, int q)
Definition: vector.cpp:753
void scalar_product(Vector &w, discreta_base &a)
Definition: vector.cpp:1561
Vector & get_and_delete_element(int i, discreta_base &x)
Definition: vector.cpp:427
void vector_of_vectors_replace(Vector &v)
Definition: vector.cpp:1244
void print_word_nicely_with_generator_labels(std::ostream &ost, Vector &generator_labels)
Definition: vector.cpp:1825
int compare_with(discreta_base &a)
Definition: vector.cpp:343
void n_choose_k_first(int n, int k)
Definition: vector.cpp:685
std::ostream & Print(std::ostream &)
Definition: vector.cpp:112
Vector & append_integer(int a)
Definition: vector.cpp:390
void apply_permutation(permutation &p)
Definition: vector.cpp:851
std::ostream & print_intvec(std::ostream &ost)
Definition: vector.cpp:184
void conjugate(discreta_base &a)
Definition: vector.cpp:1074
void first_divisor(Vector &exponents)
Definition: vector.cpp:1663
void append_vector(Vector &v)
Definition: vector.cpp:372
void lehmercode2perm(permutation &p)
Definition: vector.cpp:732
int next_non_trivial_divisor(Vector &exponents)
Definition: vector.cpp:1687
void concatenation(Vector &v1, Vector &v2)
Definition: vector.cpp:1757
std::ostream & print_unformatted(std::ostream &ost)
Definition: vector.cpp:169
void first_regular_word(int n, int q)
Definition: vector.cpp:812
discreta_base & s_i(int i)
Definition: vector.cpp:202
void hadamard_product(Vector &w)
Definition: vector.cpp:1582
void intersect(Vector &b, Vector &c)
Definition: vector.cpp:1597
void add_to(discreta_base &x, discreta_base &y)
Definition: vector.cpp:299
void m_l_x(int l, discreta_base &x)
Definition: vector.cpp:257
Vector & operator=(const discreta_base &x)
Definition: vector.cpp:34
Vector & delete_element(int i)
Definition: vector.cpp:440
void get_first_and_remove(discreta_base &x)
Definition: vector.cpp:451
void sum_of_all_entries(discreta_base &x)
Definition: vector.cpp:671
void vector_of_vectors_lengths(Vector &lengths)
Definition: vector.cpp:1849
void m_ii(int i, int a)
Definition: discreta.h:824
void write_mem(memory &m, int debug_depth)
Definition: vector.cpp:954
void PG_element_rank_modified(int &a)
Definition: vector.cpp:1334
Vector & sort_with_logging(permutation &p)
Definition: vector.cpp:548
void sort_with_fellow(Vector &fellow)
Definition: vector.cpp:538
void print_word_nicely(std::ostream &ost, int f_generator_labels, Vector &generator_labels)
Definition: vector.cpp:1778
void read_mem(memory &m, int debug_depth)
Definition: vector.cpp:1001
void content_multiplicities_only(Vector &c, Vector &mult)
Definition: vector.cpp:899
void content(Vector &c, Vector &where)
Definition: vector.cpp:877
bool insert_sorted(discreta_base &x)
Definition: vector.cpp:456
Vector & insert_element(int i, discreta_base &x)
Definition: vector.cpp:410
void get_element_orders(Vector &vec_of_orders)
Definition: vector.cpp:1861
void multiply_out(Vector &primes, discreta_base &x)
Definition: vector.cpp:1712
int next_divisor(Vector &exponents)
Definition: vector.cpp:1669
bool search(discreta_base &x, int *idx)
Definition: vector.cpp:477
void print_word_nicely2(std::ostream &ost)
Definition: vector.cpp:1798
void conjugate_with_inverse(discreta_base &a)
Definition: vector.cpp:1090
std::ostream & print(std::ostream &)
Definition: vector.cpp:135
void copyobject_to(discreta_base &x)
Definition: vector.cpp:72
DISCRETA base class. All DISCRETA classes are derived from this class.
Definition: discreta.h:382
virtual std::ostream & print(std::ostream &)
Definition: base.cpp:219
void add(discreta_base &x, discreta_base &y)
Definition: base.cpp:674
void mult(discreta_base &x, discreta_base &y)
Definition: base.cpp:367
virtual int compare_with(discreta_base &a)
Definition: base.cpp:274
void read_memory(memory &m, int debug_depth)
Definition: base.cpp:1201
void swap(discreta_base &a)
Definition: base.cpp:179
void copyobject(discreta_base &x)
Definition: base.cpp:194
discreta_base & power_int(int l)
Definition: base.cpp:447
void write_memory(memory &m, int debug_depth)
Definition: base.cpp:1103
void multiply_vector_from_left(Vector &x, Vector &y)
DISCRETA class for influencing arithmetic operations.
Definition: discreta.h:1360
DISCRETA string class.
Definition: discreta.h:626
DISCRETA integer class.
Definition: discreta.h:667
DISCRETA class to serialize data structures.
Definition: discreta.h:582
DISCRETA permutation class.
Definition: discreta.h:976
#define MINIMUM(x, y)
Definition: foundations.h:216
#define TRUE
Definition: foundations.h:231
#define FALSE
Definition: foundations.h:234
#define ONE_char_int(a)
Definition: foundations.h:225
enum printing_mode_enum current_printing_mode()
Definition: global.cpp:1573
discreta_base * calloc_nobjects_plus_length(int n, kind k)
Definition: global.cpp:121
void free_nobjects_plus_length(discreta_base *p)
Definition: global.cpp:144
void intersection_of_vectors(Vector &V, Vector &v)
Definition: vector.cpp:1618
void merge_with_fellows(Vector &v1, Vector &v1_fellow, Vector &v2, Vector &v2_fellow, Vector &v3, Vector &v3_fellow)
Definition: vector.cpp:1133
int hash_int(int hash0, int a)
Definition: global.cpp:1618
int is_finite_field_domain(domain *&d)
Definition: domain.cpp:242
void merge(Vector &v1, Vector &v2, Vector &v3)
Definition: vector.cpp:1099
void merge_with_value(Vector &idx1, Vector &idx2, Vector &idx3, Vector &val1, Vector &val2, Vector &val3)
Definition: vector.cpp:1172
int finite_field_domain_order_int(domain *d)
Definition: domain.cpp:251
the orbiter library for the classification of combinatorial objects
DISCRETA internal class.
Definition: discreta.h:353