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

563680 views
1
/* last change: 16.03.01 by Oliver Heidbuechel */
2
3
4
5
#include <typedef.h>
6
#include <matrix.h>
7
#include <bravais.h>
8
#include <base.h>
9
#include <graph.h>
10
#include <zass.h>
11
#include <datei.h>
12
#include <longtools.h>
13
#include <sort.h>
14
#include <presentation.h>
15
16
17
typedef struct{
18
int **x;
19
int ***l;
20
int ***o;
21
} SOL_TYP;
22
23
24
25
/* ----------------------------------------------------------------------------- */
26
static SOL_TYP *init_SOL_TYP(int gitter_no,
27
int aff_i,
28
int aff_j,
29
boolean oflag)
30
{
31
int i, j;
32
33
SOL_TYP *sol;
34
35
36
37
sol = (SOL_TYP *)calloc(gitter_no, sizeof(SOL_TYP));
38
39
for (i = 0; i < gitter_no; i++){
40
sol[i].x = (int **)calloc(aff_i, sizeof(int *));
41
sol[i].l = (int ***)calloc(aff_i, sizeof(int **));
42
if (oflag)
43
sol[i].o = (int ***)calloc(aff_i, sizeof(int **));
44
for (j = 0; j < aff_i; j++){
45
sol[i].x[j] = (int *)calloc(aff_j, sizeof(int));
46
sol[i].l[j] = (int **)calloc(aff_j, sizeof(int *));
47
if (oflag)
48
sol[i].o[j] = (int **)calloc(aff_j, sizeof(int *));
49
}
50
}
51
52
return(sol);
53
}
54
55
56
57
/* ----------------------------------------------------------------------------- */
58
static void free_SOL_TYP(SOL_TYP *sol,
59
int gitter_no,
60
int aff_i,
61
int aff_j)
62
{
63
int i, j, k;
64
65
for (i = 0; i < gitter_no; i++){
66
for (j = 0; j < aff_i; j++){
67
for (k = 0; k < aff_j; k++){
68
if (sol[i].l[j][k] != NULL)
69
free(sol[i].l[j][k]);
70
if (sol[i].o != NULL && sol[i].o[j] != NULL && sol[i].o[j][k] != NULL)
71
free(sol[i].o[j][k]);
72
}
73
free(sol[i].l[j]);
74
free(sol[i].x[j]);
75
if (sol[i].o != NULL && sol[i].o[j] != NULL)
76
free(sol[i].o[j]);
77
}
78
free(sol[i].l);
79
free(sol[i].x);
80
if (sol[i].o != NULL)
81
free(sol[i].o);
82
}
83
free(sol);
84
}
85
86
87
88
/* ----------------------------------------------------------------------------- */
89
static boolean gibt_gitter_beitrag(int *gitter_no,
90
int laenge,
91
int no)
92
{
93
int i;
94
95
for (i = 1 ; i <= laenge; i++){
96
if (gitter_no[i] == no)
97
return (TRUE);
98
}
99
return (FALSE);
100
}
101
102
103
104
/* ----------------------------------------------------------------------------- */
105
/* test if two groups are equal */
106
/* ----------------------------------------------------------------------------- */
107
static int test_fkt(bravais_TYP *t,
108
bravais_TYP *G)
109
{
110
int i, j, k, counter, flagge, ret;
111
112
matrix_TYP **Gorbit, *tmp;
113
114
115
Gorbit = (matrix_TYP **)calloc(G->order, sizeof(matrix_TYP *));
116
Gorbit[0] = init_mat(t->dim, t->dim, "1");
117
counter = 1;
118
i = 0;
119
120
while (counter < G->order){
121
for (j = 0; j < G->gen_no; j++){
122
tmp = mat_mul(Gorbit[i], G->gen[j]);
123
flagge = 1;
124
for (k = 0; k < counter && flagge != 0; k++){
125
flagge = cmp_mat(tmp, Gorbit[k]);
126
}
127
if (flagge != 0){
128
Gorbit[counter] = tmp;
129
counter++;
130
}
131
else{
132
free_mat(tmp);
133
}
134
}
135
i++;
136
}
137
138
ret = 1;
139
for (i = 0; i < t->gen_no; i++){
140
flagge = 0;
141
for (j = 0; j < G->order; j++){
142
if (cmp_mat(Gorbit[j], t->gen[i]) == 0){
143
flagge = 1;
144
break;
145
}
146
}
147
if (flagge == 0){
148
ret = 0;
149
break;
150
}
151
}
152
153
for (i = 0; i < G->order; i++){
154
free_mat(Gorbit[i]);
155
}
156
free(Gorbit);
157
158
return(ret);
159
}
160
161
162
163
/* ----------------------------------------------------------------------------- */
164
/* calculate graph of incidences for k-subgroups for a given geometric class */
165
/* beeing not 1 or -1! */
166
/* ----------------------------------------------------------------------------- */
167
matrix_TYP *subgroupgraph(Q_data_TYP *data,
168
boolean oflag)
169
{
170
int i, j, k, l, m, q, flagge, reps_no,
171
image_gen_no, S1_word_no, norm_no, kernel_order, orbit_no,
172
*kernel_list, *orbit_length, *length,
173
***WORDS, *WORDS_no,
174
i__, j__, counter, translanz, *kernel_factor,
175
lattice_orbits_no, *lattice_orbits, *lattice_orbit_length,
176
**gitter_no, *smallest, i__first, reps_flag,
177
*primes, *exponent, *konj_wort;
178
179
QtoZ_entry_TYP entry;
180
181
matrix_TYP *erg,
182
*id,
183
*lattice,
184
*invlattice,
185
*diag,
186
*phi,
187
*kernel_mat,
188
**kernel_gen,
189
**kernel_elements,
190
**image,
191
**lNli,
192
**S1,
193
**S1_inv,
194
**S_ksi,
195
***dataNinv,
196
**orbit_rep,
197
**new_rep,
198
***reps,
199
*coz_j,
200
*coz_i,
201
*cocycle,
202
**translationen,
203
**TRASH;
204
205
word *relator;
206
207
bravais_TYP *G;
208
209
H1_mod_ker_TYP H1_mod_ker;
210
211
SOL_TYP *zwischenerg;
212
213
rational eins;
214
215
216
217
eins.z = eins.n = 1;
218
219
dataNinv = (matrix_TYP ***)calloc(data->Z_no, sizeof(matrix_TYP **));
220
for (i = 0; i < data->Z_no; i++){
221
dataNinv[i] = (matrix_TYP **)calloc(data->Z[i]->normal_no, sizeof(matrix_TYP *));
222
}
223
id = init_mat(data->G->dim, data->G->dim, "1");
224
erg = init_mat(data->all, data->all, "");
225
226
/* convert presentation into relator format */
227
relator = (word *) calloc(data->pres->rows,sizeof(word));
228
for (i = 0; i < data->pres->rows; i++){
229
matrix_2_word(data->pres, relator + i, i);
230
}
231
232
for (i = 0; i < data->Z_no; i++){
233
234
translationen = transl_aff_normal(data->Z[i]->gen, data->Z[i]->gen_no, &translanz);
235
236
for (j = 0; j < data->Z_no; j++){
237
entry = data->INZ->entry[i][j];
238
zwischenerg = init_SOL_TYP(entry.anz, data->aff_no[i], data->aff_no[j], oflag);
239
gitter_no = (int **)calloc(data->aff_no[i], sizeof(int *));
240
for (k = 0; k < data->aff_no[i]; k++){
241
gitter_no[k] = (int *)calloc(entry.anz + 1, sizeof(int));
242
}
243
kernel_factor = (int *)calloc(entry.anz, sizeof(int));
244
primes = (int *)calloc(entry.anz, sizeof(int));
245
exponent = (int *)calloc(entry.anz, sizeof(int));
246
for (k = 0; k < entry.anz; k++){
247
lattice = entry.lattice[k];
248
249
/* calculate index of the sublattice */
250
for (l = 0; l < lattice->rows; l++){
251
if (entry.lsf[k]->array.SZ[l][l] != 1){
252
primes[k] = entry.lsf[k]->array.SZ[l][l];
253
exponent[k]++;
254
}
255
}
256
257
invlattice = mat_inv(lattice);
258
diag = matrix_on_diagonal(lattice, data->G->gen_no);
259
260
/* calculate information about Ker phi | B^1 */
261
TRASH = kernel_factor_fct(translationen, translanz, data->Z[i]->gen_no, lattice,
262
&kernel_factor[k]);
263
for (l = 0; l < kernel_factor[k]; l++){
264
free_mat(TRASH[l]);
265
}
266
free(TRASH);
267
268
/* test if lattice^(-1) data->Z[i]->gen[l] lattice == data->Z[j]->gen[l] */
269
flagge = 1;
270
G = konj_bravais(data->Z[i], invlattice);
271
if (GRAPH_DEBUG){
272
if (!test_fkt(G, data->Z[j])){
273
fprintf(stderr, "ERROR 1 in subgroupgraph!\n");
274
exit(8);
275
}
276
}
277
for (l = 0; l < G->gen_no; l++){
278
if (cmp_mat(data->Z[j]->gen[l], G->gen[l]) != 0){
279
flagge = 0;
280
break;
281
}
282
}
283
284
/* calculate phi: H^1(Z[i], Q^n/lattice) -> H^1(Z[i], Q^n/Z^n) */
285
if (flagge == 0){
286
cocycle = H1_of_standard_to_GL(G, data->Z[j], data->X[j]);
287
calculate_phi(diag, cocycle, data->X[i], data->X[j], data->X_2_inv[i], &phi,
288
&kernel_mat, &image, &image_gen_no, &H1_mod_ker);
289
free_mat(cocycle);
290
}
291
else{
292
calculate_phi(diag, data->X[j][0], data->X[i], data->X[j], data->X_2_inv[i], &phi,
293
&kernel_mat, &image, &image_gen_no, &H1_mod_ker);
294
}
295
kernel_gen = col_to_list(kernel_mat);
296
kernel_elements = (matrix_TYP **)calloc(data->coho_size[j], sizeof(matrix_TYP *));
297
kernel_list = aufspannen(data->coho_size[j], kernel_elements, kernel_gen,
298
kernel_mat->cols, data->X[j][1], &kernel_order);
299
free_bravais(G);
300
301
/* calculate S1 = Stab_N(L)*/
302
if (phi->cols > 0){
303
norm_no = data->Z[j]->normal_no;
304
lNli = (matrix_TYP **)calloc(norm_no, sizeof(matrix_TYP *));
305
for (l = 0; l < norm_no; l++){
306
lNli[l] = mat_kon(lattice, data->Z[j]->normal[l], invlattice);
307
}
308
309
S1 = calculate_S1(id, lNli, norm_no, &S1_word_no,
310
data->N[j], dataNinv[j], data->X[j][1]);
311
312
S1_inv = (matrix_TYP **)calloc(S1_word_no, sizeof(matrix_TYP *));
313
for (l = 0; l < norm_no; l++){
314
free_mat(lNli[l]);
315
}
316
free(lNli);
317
}
318
else{
319
/* trivial part */
320
S1_word_no = 0;
321
}
322
323
if (H1_mod_ker.flag == 0 && H1_mod_ker.erz_no > 0){
324
/* representation from S1 on H^1(G,Q^n/lattice) / Ker(phi) */
325
new_rep = new_representation(S1, S1_word_no, H1_mod_ker, data->X[j][1]);
326
327
/* orbit on H^1(G,Q^n/lattice) / Ker(phi) */
328
reps = H1_mod_ker_orbit_alg(H1_mod_ker, new_rep, S1_word_no, &reps_no, &length,
329
&WORDS, &WORDS_no, NULL);
330
331
/* l = 0 (d.h. Untergruppen der zerfallenden Gruppe) */
332
/* orbit on 0 + Ker(phi): l = 0 */
333
orbit_rep = orbit_ker(kernel_elements, kernel_order, data->X[j][1], S1,
334
S1_word_no, data->coho_size[j], kernel_list, &orbit_no,
335
&orbit_length);
336
337
/* edges in the graph */
338
i__ = data->first_aff[i];
339
if (orbit_no > 0){
340
gitter_no[0][0]++;
341
gitter_no[0][gitter_no[0][0]] = k;
342
}
343
344
for (m = 0; m < orbit_no; m++){
345
j__ = number_of_affine_class(data, orbit_rep[m], j, 0, oflag, &konj_wort);
346
zwischenerg[k].x[0][j__]++;
347
if (zwischenerg[k].l[0][j__] == NULL){
348
zwischenerg[k].l[0][j__] = (int *)calloc(orbit_no + 1, sizeof(int));
349
}
350
if (oflag && zwischenerg[k].o[0][j__] == NULL){
351
zwischenerg[k].o[0][j__] = (int *)calloc(orbit_no + 1, sizeof(int));
352
}
353
zwischenerg[k].l[0][j__][0]++;
354
zwischenerg[k].l[0][j__][ zwischenerg[k].l[0][j__][0] ] =
355
orbit_length[m];
356
if (oflag){
357
zwischenerg[k].o[0][j__][0]++;
358
zwischenerg[k].o[0][j__][ zwischenerg[k].o[0][j__][0] ] =
359
obergruppenzahl(invlattice, data->Z[j]->normal,
360
data->norm_inv[j], data->stab_coz[j][j__],
361
data->stab_gen_no[j][j__], konj_wort);
362
free(konj_wort);
363
}
364
}
365
free(orbit_length);
366
for (m = 0; m < orbit_no; m++){
367
free_mat(orbit_rep[m]);
368
}
369
free(orbit_rep);
370
371
372
/* l > 0 (d.h. Untergruppen der nicht zerfallenden Gruppen) */
373
/* orbit on ksi + Ker(phi): l = 0 */
374
kernel_elements_2_affine(kernel_elements, data->coho_size[j]);
375
376
for (l = 1; l < reps_no; l++){
377
/* welcher Repraesentant ist Untergruppe des
378
Standardvertreter einer affinen Klasse (welcher?)? */
379
reps_flag = 0;
380
for (m = 0; m < length[l]; m++){
381
coz_i = mat_mul(phi, reps[l][m]);
382
i__ = number_of_affine_class(data, coz_i, i, 1, FALSE, NULL);
383
free_mat(coz_i);
384
if (m == 0)
385
i__first = i__;
386
if (abs(i__first) != abs(i__)){
387
/* paranoia test */
388
fprintf(stderr, "ERROR 2 in subgroupgraph!\n");
389
exit(9);
390
}
391
if (i__ > 0){
392
reps_flag = 1;
393
/* break; */
394
}
395
}
396
397
if (reps_flag != 1){
398
/* printf("HHHHHHHHHHHHHHHHHHHHH\n"); */
399
/* Die Gruppen U_{l,m}, die gegeben sind durch reps[l][m],
400
sind Untergruppen einer Raumgruppe R, die nicht der
401
Standardvertreter S der affinen Klasse ist (fuer alle m)!
402
Es sei n mit R^n = S. Dann ist U_l^n Untergruppe
403
von S. Diese Gruppen werden bei dem Gitter nL betrachtet,
404
wobei L das aktuell betrachtete Gitter sei. L und nL sind
405
offensichtlich nicht in einer Bahn unter der Punktgruppe
406
des affinen Nomalisators von S, d.h. unter dem Stabilisator
407
des Coykels von S. */
408
}
409
else{
410
i__ = abs(i__); /* nur noetig, wenn break auskommentiert */
411
412
/* consider only standard representatives */
413
counter = 0;
414
S_ksi = (matrix_TYP **)calloc(WORDS_no[l], sizeof(matrix_TYP *));
415
for (m = 0; m < WORDS_no[l]; m++){
416
/* simplify the words */
417
normalize_word(WORDS[l][m]);
418
if (WORDS[l][m][0] == 1 && WORDS[l][m][1] < 0)
419
WORDS[l][m][1] *= (-1);
420
if (word_already_there(WORDS[l], m) == 0){
421
S_ksi[counter] = graph_mapped_word(WORDS[l][m], S1, S1_inv, data->X[j][1]);
422
if (mat_search(S_ksi[counter], S_ksi, counter, mat_comp) != -1){
423
free_mat(S_ksi[counter]);
424
}
425
else{
426
mat_quicksort(S_ksi, 0, counter, mat_comp);
427
counter++;
428
}
429
}
430
}
431
432
/* Da es uns nur um Anzahlen geht, koennen wir auch o.B.d.A. Bahnen auf
433
reps[l][0] + Kern (phi) berechnen */
434
orbit_rep = orbit_ksi_plus_ker(reps[l][0], kernel_elements, kernel_order,
435
data->X[j][1], S_ksi, counter,
436
data->coho_size[j], kernel_list, &orbit_no,
437
&orbit_length);
438
439
/* edges in tbe graph */
440
if (gitter_no[i__][gitter_no[i__][0]] != k || gitter_no[i__][0] == 0){
441
gitter_no[i__][0]++;
442
gitter_no[i__][gitter_no[i__][0]] = k;
443
}
444
for (m = 0; m < orbit_no; m++){
445
coz_j = mat_add(orbit_rep[m], reps[l][0], eins, eins);
446
j__ = number_of_affine_class(data, coz_j, j, 0, oflag, &konj_wort);
447
free_mat(coz_j);
448
zwischenerg[k].x[i__][j__]++;
449
if (zwischenerg[k].l[i__][j__] == NULL){
450
zwischenerg[k].l[i__][j__] = (int *)calloc(orbit_no + 1, sizeof(int));
451
}
452
if (oflag && zwischenerg[k].o[i__][j__] == NULL){
453
zwischenerg[k].o[i__][j__] = (int *)calloc(orbit_no + 1, sizeof(int));
454
}
455
zwischenerg[k].l[i__][j__][0]++;
456
zwischenerg[k].l[i__][j__][ zwischenerg[k].l[i__][j__][0] ] =
457
orbit_length[m];
458
if (oflag){
459
zwischenerg[k].o[i__][j__][0]++;
460
zwischenerg[k].o[i__][j__][ zwischenerg[k].o[i__][j__][0] ] =
461
obergruppenzahl(invlattice, data->Z[j]->normal,
462
data->norm_inv[j], data->stab_coz[j][j__],
463
data->stab_gen_no[j][j__], konj_wort);
464
free(konj_wort);
465
}
466
}
467
468
/* clean */
469
free(orbit_length);
470
for (m = 0; m < orbit_no; m++){
471
free_mat(orbit_rep[m]);
472
}
473
free(orbit_rep);
474
for (m = 0; m < counter; m++)
475
free_mat(S_ksi[m]);
476
free(S_ksi);
477
}
478
}
479
}
480
else{
481
/* trivial part */
482
switch (H1_mod_ker.flag){
483
case 0:
484
case 2:
485
/* orbit on 0 + Ker(phi) */
486
orbit_rep = orbit_ker(kernel_elements, kernel_order, data->X[j][1], S1,
487
S1_word_no, data->coho_size[j], kernel_list, &orbit_no,
488
&orbit_length);
489
490
/* edges in the graph */
491
i__ = data->first_aff[i];
492
if (orbit_no > 0){
493
gitter_no[0][0]++;
494
gitter_no[0][gitter_no[0][0]] = k;
495
}
496
for (m = 0; m < orbit_no; m++){
497
j__ = number_of_affine_class(data, orbit_rep[m], j, 0, oflag, &konj_wort);
498
zwischenerg[k].x[0][j__]++;
499
if (zwischenerg[k].l[0][j__] == NULL){
500
zwischenerg[k].l[0][j__] = (int *)calloc(orbit_no + 1, sizeof(int));
501
}
502
if (oflag && zwischenerg[k].o[0][j__] == NULL){
503
zwischenerg[k].o[0][j__] = (int *)calloc(orbit_no + 1, sizeof(int));
504
}
505
zwischenerg[k].l[0][j__][0]++;
506
zwischenerg[k].l[0][j__][ zwischenerg[k].l[0][j__][0] ] =
507
orbit_length[m];
508
if (oflag){
509
zwischenerg[k].o[0][j__][0]++;
510
zwischenerg[k].o[0][j__][ zwischenerg[k].o[0][j__][0] ] =
511
obergruppenzahl(invlattice, data->Z[j]->normal,
512
data->norm_inv[j], data->stab_coz[j][j__],
513
data->stab_gen_no[j][j__], konj_wort);
514
free(konj_wort);
515
}
516
}
517
free(orbit_length);
518
for (m = 0; m < orbit_no; m++){
519
free_mat(orbit_rep[m]);
520
}
521
free(orbit_rep);
522
break;
523
case 1:
524
case 3:
525
zwischenerg[k].x[0][0]++;
526
zwischenerg[k].l[0][0] = (int *)calloc(2, sizeof(int));
527
zwischenerg[k].l[0][0][0] = 1;
528
zwischenerg[k].l[0][0][1] = 1;
529
if (oflag){
530
zwischenerg[k].o[0][0] = (int *)calloc(2, sizeof(int));
531
zwischenerg[k].o[0][0][0] = 1;
532
zwischenerg[k].o[0][0][1] =
533
obergruppenzahl(invlattice, data->Z[j]->normal,
534
data->norm_inv[j], data->stab_coz[j][0],
535
data->stab_gen_no[j][0], NULL);
536
}
537
gitter_no[0][0]++;
538
gitter_no[0][gitter_no[0][0]] = k;
539
break;
540
default:
541
fprintf(stderr, "ERROR 4 in subgroupgraph!\n");
542
exit(5);
543
}
544
}
545
546
/* clean */
547
if (H1_mod_ker.flag == 0 && H1_mod_ker.erz_no > 0){
548
for (l = 0; l < S1_word_no; l++){
549
free_mat(new_rep[l]);
550
}
551
free(new_rep);
552
for (l = 1; l < reps_no; l++){
553
for (m = 0; m < WORDS_no[l]; m++){
554
free(WORDS[l][m]);
555
}
556
for (m = 0; m < length[l]; m++){
557
free_mat(reps[l][m]);
558
}
559
free(reps[l]);
560
free(WORDS[l]);
561
}
562
free(WORDS);
563
free(WORDS_no);
564
free(reps);
565
free(length);
566
}
567
free_H1_mod_ker_TYP(H1_mod_ker);
568
for (l = 0; l < data->coho_size[j]; l++){
569
if (kernel_elements[l] != NULL)
570
free_mat(kernel_elements[l]);
571
}
572
free(kernel_elements);
573
free(kernel_list);
574
for (l = 0; l < kernel_mat->cols; l++){
575
free_mat(kernel_gen[l]);
576
}
577
free(kernel_gen);
578
free_mat(kernel_mat);
579
for (l = 0; l < image_gen_no; l++){
580
free_mat(image[l]);
581
}
582
if (phi->cols > 0){
583
for (l = 0; l < S1_word_no; l++){
584
free_mat(S1[l]);
585
if (S1_inv[l] != NULL)
586
free_mat(S1_inv[l]);
587
}
588
free(S1);
589
free(S1_inv);
590
}
591
free(image);
592
free_mat(diag);
593
free_mat(invlattice);
594
free_mat(phi);
595
}
596
597
/* output */
598
for (k = 0; k < data->aff_no[i] && entry.anz > 1; k++){
599
600
/* mehrere Teilgitter */
601
if (gitter_no[k][0] > 1){
602
/* orbit on lattices for each affine class with subgroups from
603
different lattices */
604
lattice_orbits = (int *)calloc(entry.anz, sizeof(int));
605
lattice_orbit_length = (int *)calloc(entry.anz + 1, sizeof(int));
606
smallest = (int *)calloc(entry.anz + 1, sizeof(int));
607
/* Stabilisatoren nur bei Bedarf berechnen (get_Q_data und
608
free_Q_data aendern !!!!!)
609
if (data->stab_coz[i][k] == NULL){
610
data->stab_coz[i][k] = stab_coz(data->WORDS[i][k], data->NUMBER_OF_WORDS[i][k],
611
data->Z[i]->normal, data->norm_inv[i],
612
data->Z[i]->normal_no, j,
613
&data->stab_gen_no[i][k]);
614
}
615
*/
616
lattice_orbits_no = orbit_on_lattices(entry.lsf, entry.anz, data->stab_coz[i][k],
617
data->stab_gen_no[i][k], lattice_orbits,
618
lattice_orbit_length, smallest, NULL);
619
620
for (l = 1; l <= lattice_orbits_no; l++){
621
if (gibt_gitter_beitrag(gitter_no[k], gitter_no[k][0], smallest[l])){
622
printf("%i: ", k + 1 + data->first_aff[i]);
623
for (m = 0; m < data->aff_no[j]; m++){
624
if (zwischenerg[smallest[l]].x[k][m] > 0){
625
for (q = 0; q < zwischenerg[smallest[l]].x[k][m]; q++){
626
printf("%i (%i, ", m + 1 + data->first_aff[j],
627
lattice_orbit_length[l] *
628
zwischenerg[smallest[l]].l[k][m][q + 1] *
629
kernel_factor[smallest[l]]);
630
if (oflag)
631
printf("%i, ", zwischenerg[smallest[l]].o[k][m][q + 1]);
632
printf("%i^%i) ", primes[smallest[l]], exponent[smallest[l]]);
633
erg->array.SZ[k + data->first_aff[i]][m + data->first_aff[j]]++;
634
}
635
}
636
}
637
printf("\n");
638
}
639
}
640
641
free(lattice_orbits);
642
free(lattice_orbit_length);
643
free(smallest);
644
}
645
else{
646
/* for this affine class, there are only subgroups from one lattice */
647
if (gitter_no[k][0] == 1){
648
printf("%i: ", k + 1 + data->first_aff[i]);
649
for (l = 0; l < data->aff_no[j]; l++){
650
if (zwischenerg[gitter_no[k][1]].x[k][l] > 0){
651
for (q = 0; q < zwischenerg[gitter_no[k][1]].x[k][l]; q++){
652
printf("%i (%i, ", l + 1 + data->first_aff[j],
653
zwischenerg[gitter_no[k][1]].l[k][l][q + 1] *
654
kernel_factor[gitter_no[k][1]]);
655
if (oflag)
656
printf("%i, ", zwischenerg[gitter_no[k][1]].o[k][l][q + 1]);
657
printf("%i^%i) ", primes[gitter_no[k][1]], exponent[gitter_no[k][1]]);
658
erg->array.SZ[k + data->first_aff[i]][l + data->first_aff[j]]++;
659
}
660
}
661
}
662
printf("\n");
663
}
664
}
665
}
666
if (entry.anz == 1){
667
/* there is only one lattice */
668
for (k = 0; k < data->aff_no[i]; k++){
669
if (gitter_no[k][0] != 0){
670
printf("%i: ", k + 1 + data->first_aff[i]);
671
for (l = 0; l < data->aff_no[j]; l++){
672
if (zwischenerg[0].x[k][l] > 0){
673
for (q = 0; q < zwischenerg[0].x[k][l]; q++){
674
printf("%i (%i, ", l + 1 + data->first_aff[j],
675
zwischenerg[0].l[k][l][q + 1] *
676
kernel_factor[0]);
677
if (oflag)
678
printf("%i, ", zwischenerg[0].o[k][l][q + 1]);
679
printf("%i^%i) ", primes[0], exponent[0]);
680
erg->array.SZ[k + data->first_aff[i]][l + data->first_aff[j]]++;
681
}
682
}
683
}
684
printf("\n");
685
}
686
}
687
}
688
free_SOL_TYP(zwischenerg, entry.anz, data->aff_no[i], data->aff_no[j]);
689
for (k = 0 ; k < data->aff_no[i]; k++){
690
free(gitter_no[k]);
691
}
692
free(gitter_no);
693
free(kernel_factor);
694
free(exponent);
695
free(primes);
696
}
697
for (j = 0; j < translanz; j++){
698
free_mat(translationen[j]);
699
}
700
free(translationen);
701
}
702
703
/* clean up */
704
for (i = 0; i < data->pres->rows; i++)
705
wordfree(relator + i);
706
free(relator);
707
free_mat(id);
708
for (i = 0; i < data->Z_no; i++){
709
for (j = 0; j < data->Z[i]->normal_no; j++){
710
if (dataNinv[i][j] != NULL)
711
free_mat(dataNinv[i][j]);
712
}
713
free(dataNinv[i]);
714
}
715
free(dataNinv);
716
717
return(erg);
718
}
719
720
721
722
723
724