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 "longtools.h"
4
#include "getput.h"
5
#include "tools.h"
6
#include "zass.h"
7
8
extern int INFO_LEVEL;
9
10
matrix_TYP **cong_solve(matrix_TYP *A)
11
/* loest das system linearer congruenzen A x = 0 ( mod Z^n) fuer
12
x in Q^n.
13
Die loesungen stehen in cong_solve[0], die zugehoerigen nenner
14
in cong_solve[1], die transformationsmatrix in cong_solve[2] */
15
{
16
matrix_TYP **loesungen,
17
*umform,
18
*A_tr;
19
long i,
20
j,
21
found,
22
hilf;
23
24
if (INFO_LEVEL & 4){
25
printf("entering cong_solve\n");
26
}
27
28
loesungen = (matrix_TYP **) malloc(4 * sizeof(matrix_TYP*));
29
30
umform = scalar(A->cols,1);
31
32
A_tr = tr_pose(A);
33
loesungen[1] = long_elt_mat(umform,A_tr,NULL);
34
loesungen[1]->kgv = A->kgv;
35
loesungen[1]->flags.Integral = A->flags.Integral;
36
Check_mat(loesungen[1]);
37
loesungen[2] = tr_pose(umform);
38
loesungen[3] = copy_mat(loesungen[1]);
39
real_mat(loesungen[3], loesungen[3]->rows, loesungen[3]->rows);
40
41
if (INFO_LEVEL & 4){
42
put_mat(loesungen[1],NULL,"loesungen[1]",2);
43
put_mat(umform,NULL,"umform",2);
44
}
45
46
real_mat(loesungen[1],A->cols,A->cols);
47
48
if (INFO_LEVEL & 4){
49
put_mat(A,NULL,"A",2);
50
put_mat(loesungen[1],NULL,"loesungen[1]",2);
51
put_mat(umform,NULL,"umform",2);
52
}
53
54
loesungen[0] = init_mat(A->cols,1,"k");
55
found = 0;
56
57
for (i=0;i<loesungen[1]->cols;i++){
58
if (((loesungen[1]->array.SZ[i][i])!=1) &&
59
((loesungen[1]->array.SZ[i][i])!=(-1))){
60
61
/* die matrix der loesungen wird um eine spalte groesser */
62
found++;
63
real_mat(loesungen[0],loesungen[0]->rows,found);
64
65
/* speichern der neu gefundenen loesung */
66
hilf = loesungen[0]->cols-1;
67
for (j=0;j<loesungen[0]->rows;j++){
68
loesungen[0]->array.SZ[j][hilf] =
69
umform->array.SZ[i][j];
70
}
71
72
/* speichern des dazugehoerigen nenners */
73
loesungen[1]->array.SZ[found-1][found-1] = loesungen[1]->array.SZ[i][i];
74
/* loesungen[1]->array.SZ[hilf][hilf] = loesungen[1]->array.SZ[i][i]; */
75
}
76
}
77
78
free_mat(umform);
79
free_mat(A_tr);
80
81
if (found == 0)
82
real_mat(loesungen[0],loesungen[0]->rows,found);
83
real_mat(loesungen[1],loesungen[1]->rows,loesungen[0]->cols);
84
real_mat(loesungen[1],loesungen[0]->cols,loesungen[0]->cols);
85
86
if (INFO_LEVEL & 4){
87
put_mat(loesungen[0],NULL,"loesungen[0]",2);
88
put_mat(loesungen[1],NULL,"loesungen[1]",2);
89
}
90
91
Check_mat(loesungen[0]);
92
Check_mat(loesungen[1]);
93
94
return loesungen;
95
} /* cong_solve */
96
97