Orbiter 2022
Combinatorial Objects
brick_domain.cpp
Go to the documentation of this file.
1// brick_domain.cpp
2//
3// Anton Betten
4//
5// Jan 10, 2013
6
7#include "foundations.h"
8
9using namespace std;
10
11
12namespace orbiter {
13namespace layer1_foundations {
14namespace combinatorics {
15
16
17
19{
20 null();
21}
22
24{
25 freeself();
26}
27
29{
30}
31
33{
34 //int i;
35
36 null();
37}
38
40{
41 int f_v = (verbose_level >= 1);
42 //int i;
43
45 q = F->q;
46 if (F->e > 1) {
47 cout << "brick_domain::init field order must be a prime" << endl;
48 exit(1);
49 }
50 nb_bricks = 2 * q * q;
51 if (f_v) {
52 cout << "brick_domain::init q=" << q << " nb_bricks=" << nb_bricks << endl;
53 }
54}
55
57 int &f_vertical, int &x0, int &y0, int verbose_level)
58{
59 int f_v = (verbose_level >= 1);
60
61 f_vertical = rk % 2;
62 rk >>= 1;
63 x0 = rk % q;
64 rk /= q;
65 y0 = rk;
66 if (f_v) {
67 cout << "brick_domain::unrank rk=" << rk
68 << " f_vertical=" << f_vertical
69 << " x0=" << x0 << " y0=" << y0 << endl;
70 }
71}
72
73int brick_domain::rank(int f_vertical, int x0, int y0, int verbose_level)
74{
75 int f_v = (verbose_level >= 1);
76 int rk;
77
78 rk = y0;
79 rk *= q;
80 rk += x0;
81 rk *= 2;
82 if (f_vertical) {
83 rk++;
84 }
85 if (f_v) {
86 cout << "brick_domain::rank rk=" << rk
87 << " f_vertical=" << f_vertical
88 << " x0=" << x0 << " y0=" << y0 << endl;
89 }
90 return rk;
91}
92
94 int &x1, int &y1, int &x2, int &y2,
95 int verbose_level)
96{
97 //int f_v = (verbose_level >= 1);
98 int x0, y0, f_vertical;
99
100 unrank(rk, f_vertical, x0, y0, verbose_level);
101 x1 = x0;
102 y1 = y0;
103 if (f_vertical) {
104 x2 = x1;
105 y2 = F->add(y1, 1);
106 }
107 else {
108 x2 = F->add(x1, 1);
109 y2 = y1;
110 }
111}
112
114 int x2, int y2, int verbose_level)
115{
116 int f_v = (verbose_level >= 1);
117 int rk;
118 int x0, y0, f_vertical;
119
120 if (x1 == x2) {
121 f_vertical = TRUE;
122 x0 = x1;
123 if (y2 == F->add(y1, 1)) {
124 y0 = y1;
125 }
126 else if (y1 == F->add(y2, 1)) {
127 y0 = y2;
128 }
129 else {
130 cout << "brick_domain::rank_coordinates y-coordinates apart" << endl;
131 exit(1);
132 }
133 }
134 else if (y1 == y2) {
135 f_vertical = FALSE;
136 y0 = y1;
137 if (x2 == F->add(x1, 1)) {
138 x0 = x1;
139 }
140 else if (x1 == F->add(x2, 1)) {
141 x0 = x2;
142 }
143 else {
144 cout << "brick_domain::rank_coordinates x-coordinates apart" << endl;
145 exit(1);
146 }
147 }
148 else {
149 cout << "brick_domain::rank_coordinates "
150 "neither vertical nor horizontal" << endl;
151 exit(1);
152 }
153 rk = y0;
154 rk *= q;
155 rk += x0;
156 rk *= 2;
157 if (f_vertical) {
158 rk++;
159 }
160 if (f_v) {
161 cout << "brick_domain::rank_coordinates rk=" << rk
162 << " f_vertical=" << f_vertical
163 << " x0=" << x0 << " y0=" << y0 << endl;
164 }
165 return rk;
166}
167
168#if 0
169void brick_test(int q, int verbose_level)
170{
171 brick_domain B;
172 int i, j;
173 int f_vertical, x, y, x2, y2;
174 finite_field F;
175
176 F.finite_field_init(q, FALSE /* f_without_tables */, 0);
177 B.init(&F, verbose_level);
178 for (i = 0; i < B.nb_bricks; i++) {
179 B.unrank(i, f_vertical, x, y, 0);
180 j = B.rank(f_vertical, x, y, 0);
181 if (j != i) {
182 cout << "brick_test i != j in rank" << endl;
183 exit(1);
184 }
185 B.unrank_coordinates(i, x, y, x2, y2, 0);
186 j = B.rank_coordinates(x, y, x2, y2, 0);
187 if (j != i) {
188 cout << "brick_test i != j in rank_coordinates" << endl;
189 cout << "i=" << i << endl;
190 cout << "x=" << x << endl;
191 cout << "y=" << y << endl;
192 cout << "x2=" << x2 << endl;
193 cout << "y2=" << y2 << endl;
194 exit(1);
195 }
196 }
197 cout << "brick_test: OK" << endl;
198}
199#endif
200
201}}}
202
203
int rank(int f_vertical, int x0, int y0, int verbose_level)
void unrank_coordinates(int rk, int &x1, int &y1, int &x2, int &y2, int verbose_level)
void unrank(int rk, int &f_vertical, int &x0, int &y0, int verbose_level)
int rank_coordinates(int x1, int y1, int x2, int y2, int verbose_level)
void init(field_theory::finite_field *F, int verbose_level)
#define TRUE
Definition: foundations.h:231
#define FALSE
Definition: foundations.h:234
the orbiter library for the classification of combinatorial objects