-
Notifications
You must be signed in to change notification settings - Fork 6
/
zass_main.c
158 lines (130 loc) · 4.17 KB
/
zass_main.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
#include <typedef.h>
#include <getput.h>
#include <matrix.h>
#include <longtools.h>
#include <tools.h>
#include <zass.h>
#include <datei.h>
int main(int argc,char *argv[]){
matrix_TYP **matinv,
*relator_input,
**X,
**out;
bravais_TYP *G;
word *relator;
int anz_erzeuger,
i;
long dim;
/* ueberpruefen der uebergebenen flags */
/* juergens standart-function */
read_header(argc,argv);
if ((is_option('h') && optionnumber('h') == 0)||(FILEANZ <2)){
printf("Usage: %s 'file1' 'file2' ['file3'] ['file4'] [-s] [-c] [-d] [-t]\n",argv[0]);
printf("\n");
printf("file1: matrix_TYP containing a presentation for G.\n");
printf("file2: bravais_TYP containing the unimodular group G.\n");
printf("\n");
printf("Determines isomorphism type of the cohomology group H^1(G,Q^n/Z^n), or\n");
printf("in slight abuse of notation (since for finite G they are isomorphic)\n");
printf("the group of extensions H^2(G,Q^n/Z^n).\n");
printf("\n");
printf("Options:\n");
printf("-s : writes the system of equations nessecary to\n");
printf(" : determine the H^1(G,**) to file3\n");
printf("-c : writes the cocycles to file3.co or (or file4.co if\n");
printf(" : used together with -s) and the denomiantors to\n");
printf(" : file3.de (or file4.de respectively)\n");
printf("-d : writes a different output format, which is meant for\n");
printf(" : developing other programs, so do not us this option.\n");
printf("-t : give transformation matrix.\n");
printf("\n");
printf("Cf. Extensions/Vectorsystems, Presentation.\n");
if (is_option('h')){
exit(0);
}
else{
exit(31);
}
}
if (is_option('h')) { INFO_LEVEL = optionnumber('h'); }
/* einlesen der matrizen */
X = mget_mat(FILENAMES[0],&i);
if (i>1){
fprintf(stderr,"you should specify a single matrix for the presentation\n");
exit(3);
}
relator_input = X[0];
free(X);
/* read the group */
G = get_bravais(FILENAMES[1]);
anz_erzeuger = G->gen_no;
/* bereitstellen eines pointers fuer die inversen von mat */
matinv = (matrix_TYP **) calloc(anz_erzeuger,sizeof(matrix_TYP *));
/* speicher fuer die worte */
relator = (word *) calloc(relator_input->rows,sizeof(word));
/* konvertieren der inputmatrix in relator-format */
for (i=0;i<relator_input->rows;i++){
matrix_2_word(relator_input,relator+i,i);
}
out = cohomology(&dim,G->gen,matinv,relator,anz_erzeuger,relator_input->rows);
if (dim>0) printf("DIM = %ld\n", dim);
if (is_option('t') ||
is_option('d')){
printf("#3\n");
}
if (is_option('d')){
put_mat(out[0],NULL,"cozykel (columns, for all generators underneath)",2);
put_mat(out[1],NULL,"devisors",2);
put_mat(out[2],NULL,"tranformation matrix",2);
exit(0);
}
for (i=out[1]->cols-1;i>=0;i--){
if (out[1]->array.SZ[i][i] == 1 ||
out[1]->array.SZ[i][i] == -1 ||
out[1]->array.SZ[i][i] == 0){
kill_col(out[1],i);
kill_row(out[1],i);
}
}
/* now decide whether we really have a cohomology group */
if (out[0]->cols > 0){
if (is_option('t')){
printf("#3\n");
put_mat(out[0],NULL,
"cozykel (columns, for all generators underneath)",2);
put_mat(out[1],NULL,"devisors",2);
}
else{
printf("Isomorphism type of H^1(G,Q^n/Z^n): ");
printf("C_%d",out[1]->array.SZ[0][0]);
for (i=1;i<out[0]->cols;i++){
printf(" X ");
printf("C_%d",out[1]->array.SZ[i][i]);
}
printf("\n");
}
}
else{
printf("The group has trivial cohomology with this lattice.\n");
exit(0);
}
if (is_option('t')) put_mat(out[2],NULL,"tranformation matrix",2);
/* freigeben des Speichers fuer die matrizen */
for (i=0;i<anz_erzeuger;i++){
if (matinv[i] != NULL){
free_mat(matinv[i]);
}
}
free(matinv);
free_mat(out[0]);
free_mat(out[1]);
free_mat(out[2]);
free(out);
free_bravais(G);
for (i=0;i<relator_input->rows;i++){
wordfree(relator+i);
}
free(relator);
free_mat(relator_input);
exit(0);
} /* main */