Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download

GAP 4.8.9 installation with standard packages -- copy to your CoCalc project to get it

563604 views
1
#include "typedef.h"
2
#include "matrix.h"
3
#include "voronoi.h"
4
#include "tools.h"
5
#include "ZZ_P.h"
6
#include "ZZ_gen_vs_P.h"
7
8
#define TOPLEVEL -1
9
10
#define TRACE(level, foo) \
11
if (level <= TOPLEVEL) { \
12
foo; \
13
}
14
15
/* Calculate the irreducible constituents of an order as input for the
16
* centering algorithm (to determine the invariant lattices) and for
17
* determine the radical. The order is supposed to be normalized,
18
* i.e. the standard maximal order Mn(R,dim) is an over_order of the
19
* given one.
20
*
21
* first a help-programm: Do the calculation for a matrix- set of
22
* generators and use this recursivly.
23
*/
24
25
/*
26
*
27
* input:
28
* matrix_TYP **generators:
29
* die Generatoren, fuer jeden Generator eine Matrix
30
* int num_gens: Anzahl der Generatoren
31
* int *num_irr_const: die Anzahl der irrduziblen Konstituenten.
32
*
33
* output:
34
* matrix_TYP **: die irreduziblen Konstituenten mod p fuer
35
* jeden Generator. Zuerst die Matrizen aller
36
* Generatoren fuer den ersten Konstituenten,
37
* dann fuer den zweiten, usf.
38
*
39
*/
40
41
static matrix_TYP **irr_help(matrix_TYP ** generators,
42
int num_gens,
43
int *num_irr_const,
44
int rec_cnt)
45
{
46
matrix_TYP *help, *mat, **upset1, **upset2, **gen1, **gen2;
47
matrix_TYP **r_gen, **p_gen, *VS;
48
int dim, rg, notfound, i, j, act, cnt;
49
int **V, **T1, **T2;
50
51
/* p_gen enthaelt die Generatoren mod p */
52
p_gen = ZZ_mod_gen(generators, num_gens);
53
for (i = 0; i < num_gens; i++) {
54
TRACE(1, fprintf(stderr, "generator nr %d\n", i));
55
TRACE(1, fput_mat(stderr, p_gen[i], "generator mod p", 0));
56
}
57
if (p_gen[0]->rows == 1) { /* really nothing to do */
58
*num_irr_const = 1;
59
return p_gen;
60
}
61
dim = p_gen[0]->rows;
62
VS = ZZ_gen_vs(act_prime, dim);
63
TRACE(2, fput_mat(stderr, VS, "Vektorraum", 0));
64
for (notfound = 1, i = 0; (i < VS->rows) && notfound; i++) {
65
/* help enthaelt eine Basis der VR, der von der Bahn
66
* aufgespannt wird
67
*/
68
help = ZZ_vec_bahn(VS->array.SZ[i], p_gen, num_gens);
69
TRACE(2, fput_mat(stderr, help, "Bahn", 0));
70
notfound = help->rows == dim;
71
if (notfound) {
72
free_mat(help);
73
}
74
}
75
free_mat(VS);
76
if (notfound) {
77
*num_irr_const = 1;
78
TRACE(0,fprintf(stderr, "Kein Basiswechsel\n"));
79
return p_gen;
80
}
81
r_gen=(matrix_TYP **)malloc(num_gens * sizeof(matrix_TYP *));
82
TRACE(1,fprintf(stderr,
83
"Found submodule of dimension %d, recursion count %d.\n",
84
help->rows, rec_cnt));
85
/* Submodule found: begin the recursion.
86
* Start with filling up help to a basis
87
*/
88
mat = init_mat(dim, dim, "p");
89
mat->prime = act_prime;
90
rg = help->rows;
91
act = 0;
92
TRACE(1, fput_mat(stderr, help, "Invarianter Teilraum", 0));
93
for (i = 0; i < help->rows; i++) {
94
memcpy(mat->array.SZ[i],
95
help->array.SZ[i], dim * sizeof(int));
96
while(mat->array.SZ[i][act] == 0) {
97
mat->array.SZ[rg][act] = 1;
98
rg++;
99
act++;
100
}
101
act++;
102
}
103
for (; rg < mat->rows; rg++, act++) {
104
mat->array.SZ[rg][act] = 1;
105
}
106
TRACE(2, fput_mat(stderr, mat, "Basis?", 0));
107
rg = help->rows;
108
free_mat(help);
109
help = mat_inv(mat);
110
TRACE(0,fprintf(stderr, "Recursion: %d", rec_cnt));
111
TRACE(0,fput_mat(stderr, mat, "Basiswechsel", 0));
112
113
/* Do the projection to the submoduls
114
*/
115
upset1 = (matrix_TYP **) malloc(num_gens * sizeof(matrix_TYP *));
116
upset2 = (matrix_TYP **) malloc(num_gens * sizeof(matrix_TYP *));
117
for (i = 0; i < num_gens; i++) {
118
/* Basiswechsel fuer die Generatoren durchfuehren
119
* diese operieren dann auf den Standardbasisvektoren
120
* so dass gen_vc wieder benutzt werden kann
121
* diese sollten jetzt eine Blockmatrix darstellen.
122
*/
123
r_gen[i] = mat_kon(mat, p_gen[i], help);
124
TRACE(2,fprintf(stderr,
125
"Transformierter Generator %d mod p, rg: %d\n",
126
i, rg));
127
TRACE(2,fput_mat(stderr, r_gen[i], "Generator transformiert",
128
0));
129
upset1[i] = init_mat(rg, rg, "ik");
130
upset2[i] = init_mat(dim - rg, dim - rg, "ik");
131
upset1[i]->prime = act_prime;
132
upset2[i]->prime = act_prime;
133
V = r_gen[i]->array.SZ;
134
T1 = upset1[i]->array.SZ;
135
T2 = upset2[i]->array.SZ;
136
for (j = 0; j < dim; j++) {
137
if (j < rg) {
138
/* Generatoren fuer den
139
invarianten Teilraum */
140
memcpy(T1[j], V[j],rg * sizeof(int));
141
} else {
142
/* Generatoren fuer den Rest */
143
memcpy(T2[j - rg], &V[j][rg],
144
(dim - rg) * sizeof(int));
145
}
146
}
147
/* die neuen Generatoren sind in upset_i */
148
free_mat(r_gen[i]);
149
free_mat(p_gen[i]);
150
}
151
free_mat(mat);
152
free_mat(help);
153
free(r_gen);
154
free(p_gen);
155
/*----------------------------------------------------*\
156
| Create the recursion-input |
157
\*----------------------------------------------------*/
158
gen1 = upset1;
159
gen2 = upset2;
160
TRACE(0, fprintf(stderr, "Teilraum\n"));
161
upset1 = irr_help(upset1, num_gens, &i, rec_cnt + 1);
162
TRACE(0, fprintf(stderr, "Faktorraum\n"));
163
upset2 = irr_help(upset2, num_gens, &j, rec_cnt + 1);
164
for (cnt = 0; cnt < num_gens; cnt++) {
165
free_mat(gen1[cnt]);
166
free_mat(gen2[cnt]);
167
}
168
free(gen1);
169
free(gen2);
170
*num_irr_const = i + j;
171
p_gen = (matrix_TYP **) malloc(*num_irr_const * num_gens * sizeof(matrix_TYP *));
172
memcpy(p_gen, upset1, i * num_gens * sizeof(matrix_TYP *));
173
memcpy(p_gen + num_gens * i, upset2,
174
j * num_gens * sizeof(matrix_TYP *));
175
free(upset1);
176
free(upset2);
177
return p_gen;
178
}
179
180
/***********************************************************************/
181
/* */
182
/* input: */
183
/* matrix_TYP **generators: */
184
/* die Generatoren, fuer jeden Generator eine Matrix */
185
/* int num_gens: Anzahl der Generatoren */
186
/* int *num_irr_const: die Anzahl der irrduziblen Konstituenten. */
187
/* int p: die Primzahl, modulo derer die Konstituenten berechnet */
188
/* werden */
189
/* */
190
/* output: */
191
/* matrix_TYP **: die irreduziblen Konstituenten mod p fuer */
192
/* jeden Generator. Zuerst die Matrizen aller */
193
/* Generatoren fuer den ersten Konstituenten, */
194
/* dann fuer den zweiten, usf. */
195
/* */
196
/***********************************************************************/
197
198
matrix_TYP **ZZ_irr_const(matrix_TYP **generators,
199
int num_gens, int p, int *num_irr_const)
200
{
201
matrix_TYP **irrconst;
202
int i, j;
203
204
init_prime(p);
205
irrconst = irr_help(generators, num_gens, num_irr_const, 0);
206
#if DEBUG
207
fprintf(stderr, "Primzahl: %d\n",p );
208
#endif
209
for (i = 0; i < *num_irr_const; i++) {
210
for (j = 0; j < num_gens; j++) {
211
TRACE(1, fprintf(stderr, "Konstituent: %d\n", i));
212
TRACE(1, fprintf(stderr, "Generator: %d\n", j));
213
TRACE(1, fput_mat(stderr, irrconst[i*num_gens + j], " :", 2));
214
}
215
}
216
return irrconst;
217
}
218
219