Orbiter 2022
Combinatorial Objects
cperm.cpp
Go to the documentation of this file.
1/*
2 * cperm.cpp
3 *
4 * Created on: Aug 14, 2021
5 * Author: betten
6 */
7
8#include "foundations.h"
9
10using namespace std;
11
12
13
14namespace orbiter {
15namespace layer1_foundations {
16namespace geometry_builder {
17
18
20{
21 l = 0;
22 data = NULL;
23}
24
26{
27
28}
29
31{
32 //cp_free(p);
33 data = new int[l];
34 cperm::l = l;
35 identity();
36}
37
39{
40 if (data) {
41 delete [] data;
42 data = NULL;
43 }
44 l = 0;
45}
46
48{
49 int i;
50
51 if (l != q->l) {
52 cout << "cp_mv p->l != q->l" << endl;
53 exit(1);
54 }
55 for (i = 0; i < l; i++) {
56 q->data[i] = data[i];
57 }
58}
59
61{
62 int i;
63
64 for (i = 0; i < l; i++) {
65 data[i] = i;
66 }
67}
68
70/* erst a, dann b; Ergebnis nach c */
71{
72 int i, j;
73
74 if (l != b->l) {
75 cout << "cp_mult l != b->l" << endl;
76 exit(1);
77 }
79 for (i = 0; i < l; i++) {
80 j = data[i];
81 c->data[i] = b->data[j];
82 }
83}
84
86/* b:= a^-1 */
87{
88 int i, j;
89
91 for (i = 0; i < l; i++) {
92 j = data[i];
93 b->data[j] = i;
94 }
95}
96
97void cperm::power(cperm *res, int exp)
98{
99 cperm *b = NULL;
100 cperm *c = NULL;
101 cperm *d = NULL;
102 int len;
103
104 len = l;
105 res->init_and_identity(len);
106 b = new cperm;
107 c = new cperm;
108 d = new cperm;
109 b->init_and_identity(len);
110 c->init_and_identity(len);
111 d->init_and_identity(len);
112
113 move_to(b);
114 while (exp > 0) {
115 /* res = b^exp * c */
116 if (ODD(exp)) {
117 b->mult(c, d);
118 d->move_to(c);
119 exp--;
120 continue; /* exp == 0 possible */
121 }
122 if (EVEN(exp)) {
123 b->mult(b, d);
124 d->move_to(b);
125 exp >>= 1;
126 }
127 }
128 c->move_to(res);
129
130 if (b) {
131 delete b;
132 }
133 if (c) {
134 delete c;
135 }
136 if (d) {
137 delete d;
138 }
139}
140
142{
143 int i;
144
145 cout << "[";
146 for (i = 0; i < l; i++) {
147 cout << data[i];
148 if (i < l - 1) {
149 cout << ", ";
150 }
151 }
152 cout << "]";
153}
154
156/* a := a (i i+1 ... i+l-1). */
157{
158 int m, j, k;
159 int *t;
160
161 t = new int[cperm::l];
162
163 for (m = 0; m < cperm::l; m++) {
164 j = data[m];
165 if (j >= i && (k = j - i) < l) {
166 t[k] = m;
167 }
168 }
169 /* now: t[k] -> i+k -> i+k+1 for 0 < k < l-1
170 * t[l-1] -> i+l-1 -> i */
171 for (k = 0; k < l - 1; k++) {
172 data[t[k]] = (i + k + 1);
173 }
174 data[t[l - 1]] = i;
175
176 delete [] t;
177}
178
179
180void cperm::mult_apply_tau_r(int i, int j)
181/* a := a (i j). */
182{
183 int k, i1, j1;
184
185 for (k = 0; k < l; k++) {
186 if (data[k] == i) {
187 i1 = k;
188 }
189 if (data[k] == j) {
190 j1 = k;
191 }
192 }
193 /* now: i1 a == i, j1 a == j */
194 data[i1] = j;
195 data[j1] = i;
196}
197
198void cperm::mult_apply_tau_l(int i, int j)
199/* a := (i j) a. */
200{
201 int i1, j1;
202
203 i1 = data[i];
204 j1 = data[j];
205 /* now: i -> j -> j1; j -> i -> i1 */
206 data[i] = j1;
207 data[j] = i1;
208}
209
211/* a := (i+l-1 i+l-2 ... i+1 i) a. */
212{
213 int t, m;
214
215 /* i+m -> i+m-1 -> a[i+m-1] for 1 < m < l
216 * i -> i+l-1 -> a[i+l-1] */
217 t = data[i + l - 1];
218 for (m = l - 1; m > 0; m--) {
219 data[i + m] = data[i + m - 1];
220 }
221 data[i] = t;
222}
223
224
225
226#if 0
227
228
229int cp_mult_apply_backwc_r(
230 CPERM *a, int i, int l)
231/* a := a (i+l-1 i+l-2 ... i+1 i). */
232{
233 int t[256], m, j, k;
234
235 if (l > 256) {
236 Srfs("cp_mult_apply_backwc_r", "l > 256");
237 return ERROR;
238 }
239 for (m = 0; m < a->l; m++) {
240 j = a->a[m];
241 if (j >= i && (k = j - i) < l)
242 t[k] = m;
243 }
244 /* now: t[k] -> i+k -> i+k-1 for 1 < k < l
245 * t[0] -> i -> i+l-1 */
246 for (k = 1; k < l; k++)
247 a->a[t[k]] = (i + k - 1);
248 a->a[t[0]] = (i + l - 1);
249 return OK;
250}
251
252int cp_mult_apply_forwc_l(
253 CPERM *a, int i, int l)
254/* a := (i i+1 ... i+l-1) a. */
255{
256 int t, m;
257
258 /* i+m -> i+m+1 -> a[i+m+1] for m < l - 1
259 * i+l-1 -> i -> a[i] */
260 t = a->a[i];
261 for (m = 0; m < l - 1; m++)
262 a->a[i + m] = a->a[i + m + 1];
263 a->a[i+l-1] = t;
264 return OK;
265}
266
267int cp_onep(CPERM *p)
268{
269 int i;
270
271 for (i = 0; i < p->l; i++)
272 if (p->a[i] != i)
273 return FALSE;
274 return TRUE;
275}
276
277int cp_cmp(CPERM *a, CPERM *b)
278{
279 int i;
280
281 if (a->l != b->l) {
282 Srfs("cp_cmp", "a->l != b->l");
283 return 0;
284 }
285 for (i = 0; i < a->l; i++) {
286 if (a->a[i] < b->a[i])
287 return -1;
288 if (a->a[i] > b->a[i])
289 return 1;
290 }
291 return 0;
292}
293
294
295#endif
296
297
298}}}
299
300
a permutation for use in class gen_geo
#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
the orbiter library for the classification of combinatorial objects