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

563580 views
1
#include "typedef.h"
2
#include "matrix.h"
3
4
/**************************************************************************\
5
@---------------------------------------------------------------------------
6
@---------------------------------------------------------------------------
7
@ FILE: red_mat.c
8
@---------------------------------------------------------------------------
9
@---------------------------------------------------------------------------
10
@
11
\**************************************************************************/
12
13
#if 0
14
/*{{{ */
15
16
static void sdec_mat(mat, trf)
17
matrix_TYP *mat, *trf;
18
19
{
20
int dim, i, j, flag;
21
int **M, **m1;
22
23
M = mat->array.SZ;
24
dim= mat->cols;
25
dim--;
26
flag = (M[dim][dim] == 0);
27
28
while(flag) {
29
for(i = 0; flag && (i < dim); i++)
30
flag = (M[dim][i] == 0);
31
if (flag) flag = ((--dim > 0) && (M[dim][dim] == 0));
32
}
33
if (++dim < mat->cols) {
34
for (i = 0; i < mat->cols; i++)
35
if (i < dim)
36
M[i] = (int *)realloc(M[i], dim*sizeof(int));
37
else {
38
free(M[i]);
39
}
40
mat->array.SZ = (int **)realloc(M,dim*sizeof(int *));
41
mat->cols = mat->rows = trf->rows = dim;
42
}
43
m1 = (int **)malloc((dim+1) * sizeof(int *));
44
m1[dim] = (int *)malloc((dim) * sizeof(int ));
45
for (i = 0; i < dim; i++)
46
{
47
m1[i]=mat->array.SZ[dim-1-i];
48
}
49
for (i = 0; i < dim; i++)
50
{
51
mat->array.SZ[i]=m1[i];
52
}
53
for (j = 0; j < dim; j++) {
54
for (i = 0; i < dim; i++)
55
m1[dim][i]=mat->array.SZ[j][dim-1-i];
56
for (i = 0; i < dim; i++)
57
mat->array.SZ[j][i]=m1[dim][i];
58
}
59
free(m1[dim]);
60
free(m1);
61
}
62
/*}}} */
63
#else
64
/*{{{ from ldec_mat*/
65
static void sdec_mat(mat, trf)
66
matrix_TYP *mat, *trf;
67
{
68
int j,dim, i, flag;
69
int **M;
70
int **m1, **t1;
71
72
M = mat->array.SZ;
73
dim = mat->cols;
74
dim--;
75
flag = (M[dim][dim] == 0);
76
77
while (flag) {
78
for (i = 0; flag && (i < dim); i++) {
79
flag = (M[dim][i] == 0);
80
}
81
if (flag) {
82
flag = ((--dim > 0) && (M[dim][dim] == 0));
83
}
84
}
85
if (++dim < mat->cols) {
86
for (i = dim; i < mat->cols; i++) {
87
free(M[i]);
88
free(trf->array.SZ[i]);
89
}
90
for (i = 0; i < dim; i++) {
91
M[i] = (int *)realloc(M[i], dim* sizeof(int));
92
}
93
mat->array.SZ = (int **)realloc(M,dim*sizeof(int *));
94
trf->array.SZ = (int **)realloc(trf->array.SZ,dim*sizeof(int *));
95
trf->rows = mat->cols = mat->rows = dim;
96
}
97
m1 = (int **)malloc((dim+1) * sizeof(int *));
98
m1[dim] = (int *)malloc((dim) * sizeof(int ));
99
t1 = (int **)malloc(dim * sizeof(int *));
100
for (i = 0; i < dim; i++) {
101
m1[i]=mat->array.SZ[dim-1-i];
102
t1[i]=trf->array.SZ[dim-1-i];
103
}
104
for (i = 0; i < dim; i++) {
105
mat->array.SZ[i]=m1[i];
106
trf->array.SZ[i]=t1[i];
107
}
108
for (j = 0; j < dim; j++) {
109
for (i = 0; i < dim; i++) {
110
m1[dim][i]=mat->array.SZ[j][dim-1-i];
111
}
112
for (i = 0; i < dim; i++) {
113
mat->array.SZ[j][i]=m1[dim][i];
114
}
115
}
116
free(m1[dim]);
117
free(m1);
118
free(t1);
119
}
120
121
/*}}} */
122
#endif
123
124
/*
125
@
126
@ boolean extension(Mat,Trf);
127
@
128
@ Zusatzprogramm zu mat_red(): Ueberprueft bei M[i][i] = 2*M[i][j], ob
129
@ eine Addition zu weiterer Reduzierung fuehren kann.
130
@
131
static boolean extension(Mat,Trf)
132
matrix_TYP *Mat, *Trf;
133
{
134
int i,j,k, temp, ssignum;
135
int **M, *Z;
136
boolean flag = 0;
137
138
M = Mat->array.SZ;
139
Z = (int *)calloc(Mat->rows, sizeof(int));
140
for(i = 1; i < Mat->rows; i++) {
141
for(j = 0; (j < i) && (M[i][i] != 0); j++) {
142
if(abs(2*M[i][j]) >= abs(M[i][i])) {
143
if (M[i][i]*M[i][j] > 0) {
144
ssignum = -1;
145
for (k = 0;k < Mat->rows; k++) {
146
Z[k] = M[j][k] - M[i][k];
147
}
148
} else {
149
ssignum = 1;
150
for(k = 0; k < Mat->rows; k++) {
151
Z[k] = M[j][k] + M[i][k];
152
}
153
}
154
flag = 1;
155
}
156
if(flag) {
157
for (k = 0; k < Mat->rows; k++) {
158
if ((k != i) && (k != j)) {
159
if ( (temp =abs(2*Z[k])) > abs(M[k][k]) ||
160
temp > abs(M[j][j]) ) {
161
free(M[j]);
162
M[j] = Z;
163
if (ssignum > 0) {
164
for (k = 0; k < Mat->rows; k++) {
165
M[k][j] += M[k][i];
166
}
167
} else {
168
for (k = 0; k < Mat->rows; k++) {
169
M[k][j] -= M[k][i];
170
}
171
}
172
return(TRUE);
173
}
174
}
175
}
176
flag = 0;
177
}
178
}
179
}
180
free(Z);
181
return(FALSE);
182
}
183
184
*/
185
186
/*{{{}}}*/
187
/*{{{ smat_red*/
188
static matrix_TYP *smat_red (mat)
189
matrix_TYP *mat;
190
{
191
int **M, *M_i, *M_j, **m1;
192
rational *per, temp;
193
int i, j, k,l , flag;
194
int faktor, n;
195
int **T, *T_i, *T_j, **t1;
196
matrix_TYP *taM;
197
198
n = mat->cols;
199
taM = init_mat(n,n,"ik");
200
M = mat->array.SZ;
201
T = taM->array.SZ;
202
203
per = (rational *)malloc(n*sizeof(rational));
204
for ( i= 0; i< n; i ++) {
205
T[i][i] = 1;
206
}
207
do {
208
flag = 0;
209
for(i = n-1; i >=0; i--) {
210
M_i = M[i];
211
T_i = T[i];
212
for(j = n-1; j >=0; j--) {
213
M_j = M[j];
214
T_j = T[j];
215
if (i != j) {
216
if(M_i[i]) {
217
if(abs(2*M_i[j]) > abs(M_i[i])) {
218
faktor = (2*M_i[j])/M_i[i];
219
faktor = (faktor / 2)+(faktor % 2);
220
for(k = 0; k < n; k++) {
221
M_j[k] -= faktor * M_i[k];
222
T_j[k] -= faktor * T_i[k];
223
}
224
for(k = 0; k < n; k++) {
225
M[k][j] -= faktor * M[k][i];
226
}
227
flag = 1;
228
}
229
} else {
230
if (M_i[j]) {
231
if ((faktor = M_j[j] / (M_i[j]*2)) != 0) {
232
for(k = 0; k < n; k++) {
233
M_j[k] -= faktor * M_i[k];
234
T_j[k] -= faktor * T_i[k];
235
}
236
for (k = 0; k < n; k++) {
237
M[k][j] -= faktor*M[k][i];
238
}
239
flag = 1;
240
}
241
if(M_j[j] == 0) {
242
for(k = 0; k < n; k++) {
243
if((i != k) && (M[k][j])) {
244
if((faktor = M[k][j] / M_i[j])!=0) {
245
for(l = 0; l < n; l++) {
246
M[k][j] -= faktor * M_i[l];
247
T[k][l] -= faktor * T_i[l];
248
}
249
for(l = 0; l < n ; l++) {
250
M[l][k] -= faktor * M[l][i];
251
}
252
flag = 1;
253
}
254
}
255
}
256
}
257
}
258
}
259
}
260
}
261
}
262
} while ((flag) /* || extension(mat,taM) */ );
263
/*
264
* Sorting Mat in decreasing order of the absolute value of the
265
* diagonal elements.
266
*/
267
268
m1 = (int **)malloc((n+1) * sizeof(int *));
269
t1 = (int **)malloc((n+1) * sizeof(int *));
270
m1[n] = (int *)calloc(n , sizeof(int));
271
272
for (i = n-1; i >= 0; i--) {
273
per[i].z = abs(M[i][i]);
274
per[i].n = i;
275
}
276
for( j = n-1; j >=1; j--) {
277
temp = per[j];
278
flag = j;
279
for( i = j-1; i >= 0; i--) {
280
if (per[i].z < temp.z) {
281
temp = per[i];
282
flag= i;
283
}
284
}
285
if(flag != j) {
286
per[flag] = per[j];
287
per[j] = temp;
288
}
289
}
290
i = n;
291
while(per[--i].z == 0);
292
++i;
293
while((i<n)&&(flag = memcmp(m1[n],M[per[i].n],n*sizeof(int)))) {
294
i++;
295
}
296
if (i < n-1) {
297
for(j = i+1; j < n; j++) {
298
if( (flag = memcmp(m1[n],M[per[j].n],n*sizeof(int))) ) {
299
temp = per[i]; per[i] = per[j]; per[j] = temp;
300
i++; j = i+1;
301
}
302
}
303
}
304
for (i = 0; i < n; i++) {
305
m1[i] = M[i];
306
t1[i] = T[i];
307
}
308
for(i = 0; i < n; i++) {
309
M[i] = m1[per[i].n];
310
T[i] = t1[per[i].n];
311
memcpy(m1[n],M[i],n*sizeof(int));
312
for(j = 0; j < n; j++) {
313
M[i][j] = m1[n][per[j].n];
314
}
315
}
316
free(m1[n]);
317
free(m1);
318
free(t1);
319
free(per);
320
321
return (taM);
322
}
323
/*}}} */
324
/*{{{ sdec_mat*/
325
326
/*}}} */
327
/*{{{ mat_red*/
328
329
/**************************************************************************\
330
@---------------------------------------------------------------------------
331
@ matrix_TYP *mat_red(Mat)
332
@ matrix_TYP *Mat;
333
@
334
@ applies a pair_reduction to the symmetric matrix Mat
335
@ and returns the transformation matrix
336
@---------------------------------------------------------------------------
337
@
338
\**************************************************************************/
339
matrix_TYP *mat_red(Mat)
340
matrix_TYP *Mat;
341
{
342
return smat_red(Mat);
343
}
344
345
void dec_mat(Mat,Trf)
346
matrix_TYP *Mat, *Trf;
347
{
348
sdec_mat(Mat,Trf);
349
}
350
/*}}} */
351
352