Orbiter 2022
Combinatorial Objects
heisenberg.cpp
Go to the documentation of this file.
1// heisenberg.cpp
2//
3// Anton Betten
4//
5// April 27, 2017
6
7#include "foundations.h"
8
9
10using namespace std;
11
12
13namespace orbiter {
14namespace layer1_foundations {
15namespace algebra {
16
17
19{
20 null();
21}
22
24{
25 freeself();
26}
27
29{
30 Elt1 = NULL;
31 Elt2 = NULL;
32 Elt3 = NULL;
33 Elt4 = NULL;
34}
35
37{
38 if (Elt1) {
40 }
41 if (Elt2) {
43 }
44 if (Elt3) {
46 }
47 if (Elt4) {
49 }
50}
51
52void heisenberg::init(field_theory::finite_field *F, int n, int verbose_level)
53{
54 int f_v = (verbose_level >= 1);
55 //int f_vv = (verbose_level >= 2);
57
58 if (f_v) {
59 cout << "heisenberg::init n=" << n << " q=" << F->q << endl;
60 }
61 q = F->q;
64 len = 2 * n + 1;
66
67 Elt1 = NEW_int(len);
68 Elt2 = NEW_int(len);
69 Elt3 = NEW_int(len);
70 Elt4 = NEW_int(len);
71 if (f_v) {
72 cout << "heisenberg::init done" << endl;
73 }
74}
75
76void heisenberg::unrank_element(int *Elt, long int rk)
77{
79 Gg.AG_element_unrank(q, Elt, 1, len, rk);
80}
81
82long int heisenberg::rank_element(int *Elt)
83{
84 long int rk;
86
87 rk = Gg.AG_element_rank(q, Elt, 1, len);
88 return rk;
89}
90
91void heisenberg::element_add(int *Elt1, int *Elt2, int *Elt3, int verbose_level)
92{
93 int a;
94
97 Elt3[2 * n] = F->add(Elt3[2 * n], a);
98}
99
100void heisenberg::element_negate(int *Elt1, int *Elt2, int verbose_level)
101{
102 int a;
103
106 Elt2[2 * n] = F->add(Elt2[2 * n], a);
107}
108
109
110int heisenberg::element_add_by_rank(int rk_a, int rk_b, int verbose_level)
111{
112 int rk;
113
114 unrank_element(Elt1, rk_a);
115 unrank_element(Elt2, rk_b);
116 element_add(Elt1, Elt2, Elt3, 0 /* verbose_level */);
117 rk = rank_element(Elt3);
118 return rk;
119}
120
121int heisenberg::element_negate_by_rank(int rk_a, int verbose_level)
122{
123 int rk;
124
125 unrank_element(Elt1, rk_a);
126 element_negate(Elt1, Elt2, 0 /* verbose_level */);
127 rk = rank_element(Elt2);
128 return rk;
129}
130
131void heisenberg::group_table(int *&Table, int verbose_level)
132{
133 int f_v = (verbose_level >= 1);
134 //int f_vv = (verbose_level >= 2);
135 int i, j, k;
136
137 if (f_v) {
138 cout << "heisenberg::group_table" << endl;
139 }
141 for (i = 0; i < group_order; i++) {
143 for (j = 0; j < group_order; j++) {
145 element_add(Elt1, Elt2, Elt3, 0 /* verbose_level */);
146 k = rank_element(Elt3);
147 Table[i * group_order + j] = k;
148 }
149 }
150 if (f_v) {
151 cout << "heisenberg::group_table finished" << endl;
152 }
153}
154
155void heisenberg::group_table_abv(int *&Table_abv, int verbose_level)
156{
157 int f_v = (verbose_level >= 1);
158 //int f_vv = (verbose_level >= 2);
159 int i, j, k;
160
161 if (f_v) {
162 cout << "heisenberg::group_table" << endl;
163 }
164 Table_abv = NEW_int(group_order * group_order);
165 for (i = 0; i < group_order; i++) {
167 for (j = 0; j < group_order; j++) {
170 element_add(Elt1, Elt3, Elt4, 0 /* verbose_level */);
171 k = rank_element(Elt4);
172 Table_abv[i * group_order + j] = k;
173 }
174 }
175 if (f_v) {
176 cout << "heisenberg::group_table finished" << endl;
177 }
178}
179
180void heisenberg::generating_set(int *&gens, int &nb_gens, int verbose_level)
181{
182 int f_v = (verbose_level >= 1);
183 //int f_vv = (verbose_level >= 2);
184 int i, j, cnt, k;
186
187 if (f_v) {
188 cout << "heisenberg::generating_set" << endl;
189 }
190 nb_gens = (n * F->e) * 2 + F->e;
191 gens = NEW_int(nb_gens);
192 cnt = 0;
193 for (i = 0; i < n; i++) {
194 for (j = 0; j < F->e; j++) {
196 Elt1[i] = NT.i_power_j(F->p, j);
197 k = rank_element(Elt1);
198 gens[cnt++] = k;
199 }
200 }
201 for (i = 0; i < n; i++) {
202 for (j = 0; j < F->e; j++) {
204 Elt1[n + i] = NT.i_power_j(F->p, j);
205 k = rank_element(Elt1);
206 gens[cnt++] = k;
207 }
208 }
209
210 for (j = 0; j < F->e; j++) {
212 Elt1[2 * n] = NT.i_power_j(F->p, j);
213 k = rank_element(Elt1);
214 gens[cnt++] = k;
215 }
216
217 if (cnt != nb_gens) {
218 cout << "heisenberg::generating_set cnt != nb_gens" << endl;
219 exit(1);
220 }
221 if (f_v) {
222 cout << "heisenberg::generating_set finished" << endl;
223 }
224}
225
226}}}
227
void element_negate(int *Elt1, int *Elt2, int verbose_level)
Definition: heisenberg.cpp:100
void element_add(int *Elt1, int *Elt2, int *Elt3, int verbose_level)
Definition: heisenberg.cpp:91
void generating_set(int *&gens, int &nb_gens, int verbose_level)
Definition: heisenberg.cpp:180
void init(field_theory::finite_field *F, int n, int verbose_level)
Definition: heisenberg.cpp:52
int element_negate_by_rank(int rk_a, int verbose_level)
Definition: heisenberg.cpp:121
void group_table_abv(int *&Table_abv, int verbose_level)
Definition: heisenberg.cpp:155
int element_add_by_rank(int rk_a, int rk_b, int verbose_level)
Definition: heisenberg.cpp:110
void group_table(int *&Table, int verbose_level)
Definition: heisenberg.cpp:131
void unrank_element(int *Elt, long int rk)
Definition: heisenberg.cpp:76
various functions related to geometries
Definition: geometry.h:721
void AG_element_unrank(int q, int *v, int stride, int len, long int a)
long int AG_element_rank(int q, int *v, int stride, int len)
#define FREE_int(p)
Definition: foundations.h:640
#define NEW_int(n)
Definition: foundations.h:625
the orbiter library for the classification of combinatorial objects