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

563665 views
1
#include "typedef.h"
2
#include "longtools.h"
3
#include "zass.h"
4
#include "matrix.h"
5
6
7
/**********************************************************************
8
@
9
@----------------------------------------------------------------------
10
@
11
@ static void coboundary(bravais_TYP *G,
12
@ matrix_TYP *C,
13
@ matrix_TYP *T)
14
@
15
@----------------------------------------------------------------------
16
@
17
***********************************************************************/
18
19
void coboundary(G,C,T)
20
bravais_TYP *G;
21
matrix_TYP *C,*T;
22
{
23
24
int i,
25
k,
26
l,
27
n;
28
29
matrix_TYP *A;
30
matrix_TYP **erg;
31
32
n = G->dim;
33
34
A = init_mat(n*G->gen_no,n+1,"k");
35
36
/* belegen der matrix A */
37
for (i=0;i<G->gen_no;i++){
38
for (k=0;k<n;k++){
39
for (l=0;l<n;l++){
40
if (k == l){
41
A->array.SZ[k+i*n][l] = G->gen[i]->array.SZ[k][l] - 1;
42
}
43
else{
44
A->array.SZ[k+i*n][l] = G->gen[i]->array.SZ[k][l];
45
}
46
}
47
}
48
}
49
50
for (i=0;i<G->gen_no;i++)
51
for (k=0;k<n;k++)
52
A->array.SZ[i*n+k][n] = C->array.SZ[i*n+k][0];
53
54
k = long_row_gauss(A);
55
real_mat(A,k,A->cols);
56
57
/* kick out the rows which have 0's in the first n entries */
58
for (i=A->rows-1;i>0;i--){
59
for (k=0;k<n && A->array.SZ[i][k] == 0;k++);
60
if (k == n){
61
if (A->array.SZ[i][n] % C->kgv){
62
fprintf(stderr,"error in coboundary\n");
63
exit(3);
64
}
65
else{
66
real_mat(A,A->rows-1,A->cols);
67
}
68
}
69
}
70
71
72
real_mat(C,A->rows,1);
73
74
for (i=0;i<A->rows;i++)
75
C->array.SZ[i][0] = A->array.SZ[i][n];
76
77
real_mat(A,A->rows,n);
78
79
Check_mat(A);
80
Check_mat(C);
81
82
/* put_mat(A,0,0,0);
83
put_mat(C,0,0,0); */
84
85
erg = long_solve_mat(A, C);
86
87
if (erg == NULL || erg[0] == NULL){
88
fprintf(stderr,"error in coboundary\n");
89
exit(3);
90
}
91
92
/* put_mat(erg[0],0,0,0); */
93
94
iscal_mul(T,erg[0]->kgv);
95
for (i=0;i<G->dim;i++){
96
T->array.SZ[i][G->dim] = erg[0]->array.SZ[i][0];
97
}
98
T->kgv = erg[0]->kgv;
99
Check_mat(T);
100
101
free_mat(A); A = NULL;
102
for(i=0;i<2;i++){
103
if (erg[i] != NULL) free_mat(erg[i]);
104
}
105
free(erg);
106
107
return;
108
}
109
110
111
112