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

563641 views
1
#include"typedef.h"
2
#include"matrix.h"
3
#include"longtools.h"
4
5
/**************************************************************************\
6
@---------------------------------------------------------------------------
7
@---------------------------------------------------------------------------
8
@ FILE: p_formspace.c
9
@---------------------------------------------------------------------------
10
@---------------------------------------------------------------------------
11
@
12
\**************************************************************************/
13
14
15
/**************************************************************************\
16
@---------------------------------------------------------------------------
17
@ matrix_TYP **p_formspace(B, Banz, prime, sym_opt, fdim)
18
@ matrix_TYP **B;
19
@ int Banz, prime, sym_opt, *fdim;
20
@
21
@ The same as formspace, just module the prime.
22
@---------------------------------------------------------------------------
23
@
24
\**************************************************************************/
25
matrix_TYP **p_formspace(B, Banz, prime, sym_opt, fdim)
26
matrix_TYP **B;
27
int Banz, prime, sym_opt, *fdim;
28
{
29
int i,j,k,l,m, no, p;
30
int dim, dd, anz;
31
matrix_TYP *X, **Xk, **E;
32
int **XX, **Bi;
33
int **pos, **sign;
34
35
36
p = prime;
37
dim = B[0]->cols;
38
if(B[0]->rows != dim)
39
{
40
printf("error in formspace: non-square matrix in group 'B'\n");
41
exit(3);
42
}
43
for(i=1;i<Banz;i++)
44
{
45
if(B[i]->rows != dim || B[i]->cols != dim)
46
{
47
printf("error in formspace: different dimesion of group elements\n");
48
exit(3);
49
}
50
}
51
if(sym_opt == 1)
52
dd = (dim *(dim+1))/2;
53
if(sym_opt == -1)
54
dd = (dim *(dim-1))/2;
55
if(sym_opt == 0)
56
dd = dim * dim;
57
if( (pos = (int **)malloc(dim *sizeof(int *))) == NULL)
58
{
59
printf("malloc of 'pos' in 'formspace' failed\n");
60
exit(2);
61
}
62
for(i=0;i<dim;i++)
63
{
64
if( (pos[i] = (int *)malloc(dim *sizeof(int))) == NULL)
65
{
66
printf("malloc of 'pos[%d]' in 'formspace' failed\n", i);
67
exit(2);
68
}
69
}
70
if( (sign = (int **)malloc(dim *sizeof(int *))) == NULL)
71
{
72
printf("malloc of 'sign' in 'formspace' failed\n");
73
exit(2);
74
}
75
for(i=0;i<dim;i++)
76
{
77
if( (sign[i] = (int *)malloc(dim *sizeof(int))) == NULL)
78
{
79
printf("malloc of 'sign[%d]' in 'formspace' failed\n", i);
80
exit(2);
81
}
82
}
83
if(sym_opt == 0)
84
{
85
no = 0;
86
for(i=0;i<dim;i++)
87
for(j=0;j<dim;j++)
88
{ pos[i][j] = no; sign[i][j] = 1; no++;}
89
}
90
if(sym_opt == 1)
91
{
92
no = 0;
93
for(i=0;i<dim;i++)
94
for(j=0;j<=i;j++)
95
{ pos[i][j] = no; sign[i][j] = 1; no++;}
96
no = 0;
97
for(i=0;i<dim;i++)
98
for(j=0;j<=i;j++)
99
{ pos[j][i] = no; sign[j][i] = 1; no++;}
100
}
101
if(sym_opt == -1)
102
{
103
no = 0;
104
for(i=0;i<dim;i++)
105
for(j=0;j<i;j++)
106
{ pos[i][j] = no; sign[i][j] = 1; no++;}
107
no = 0;
108
for(i=0;i<dim;i++)
109
for(j=0;j<i;j++)
110
{ pos[j][i] = no; sign[j][i] = -1; no++;}
111
for(i=0;i<dim;i++)
112
{ pos[i][i] = 0; sign[i][i] = 0;}
113
}
114
115
X = init_mat(dd * Banz, dd, "");
116
XX = X->array.SZ;
117
no = 0;
118
if(sym_opt == 0)
119
{
120
no = 0;
121
for(i=0;i<Banz;i++)
122
{
123
Bi = B[i]->array.SZ;
124
for(j=0;j<dim;j++)
125
for(k=0;k<dim;k++)
126
{
127
for(l=0;l<dim;l++)
128
for(m=0;m<dim;m++)
129
{
130
XX[no][pos[l][m]] += sign[l][m] * (Bi[l][j]%p) * (Bi[m][k]%p);
131
XX[no][pos[l][m]] %= p;
132
}
133
XX[no][pos[j][k]]--;
134
no++;
135
}
136
}
137
}
138
if(sym_opt == 1)
139
{
140
no = 0;
141
for(i=0;i<Banz;i++)
142
{
143
Bi = B[i]->array.SZ;
144
for(j=0;j<dim;j++)
145
for(k=0;k<=j;k++)
146
{
147
for(l=0;l<dim;l++)
148
for(m=0;m<dim;m++)
149
{
150
XX[no][pos[l][m]] += sign[l][m] * (Bi[l][j]%p) * (Bi[m][k]%p);
151
XX[no][pos[l][m]] %= p;
152
}
153
XX[no][pos[j][k]]--;
154
no++;
155
}
156
}
157
}
158
if(sym_opt == -1)
159
{
160
no = 0;
161
for(i=0;i<Banz;i++)
162
{
163
Bi = B[i]->array.SZ;
164
for(j=0;j<dim;j++)
165
for(k=0;k<j;k++)
166
{
167
for(l=0;l<dim;l++)
168
for(m=0;m<dim;m++)
169
{
170
XX[no][pos[l][m]] += sign[l][m] * (Bi[l][j]%p) * (Bi[m][k]%p);
171
XX[no][pos[l][m]] %= p;
172
}
173
XX[no][pos[j][k]]--;
174
no++;
175
}
176
}
177
}
178
for(i=0;i<X->rows;i++)
179
for(j=0;j<X->cols;j++)
180
X->array.SZ[i][j] %=p;
181
Xk = p_lse_solve(X, NULL, &anz, p);
182
free_mat(X);
183
anz--;
184
if(Xk[0] != NULL)
185
free_mat(Xk[0]);
186
if(anz != 0)
187
{
188
if( (E = (matrix_TYP **)malloc(anz *sizeof(matrix_TYP *))) == NULL)
189
{
190
printf("malloc of 'E' in 'formspace' failed\n");
191
exit(2);
192
}
193
}
194
else
195
E = NULL;
196
for(i=0;i<anz;i++)
197
{
198
E[i] = init_mat(dim, dim, "");
199
if(sym_opt == 0)
200
{
201
for(j=0;j<dim;j++)
202
for(k=0;k<dim;k++)
203
E[i]->array.SZ[j][k] = Xk[i+1]->array.SZ[0][pos[j][k]];
204
}
205
if(sym_opt == 1)
206
{
207
for(j=0;j<dim;j++)
208
for(k=0;k<=j;k++)
209
{
210
E[i]->array.SZ[j][k] = Xk[i+1]->array.SZ[0][pos[j][k]];
211
if(j != k)
212
E[i]->array.SZ[k][j] = E[i]->array.SZ[j][k];
213
}
214
}
215
if(sym_opt == -1)
216
{
217
for(j=0;j<dim;j++)
218
for(k=0;k<j;k++)
219
{
220
E[i]->array.SZ[j][k] = Xk[i+1]->array.SZ[0][pos[j][k]];
221
E[i]->array.SZ[k][j] = -E[i]->array.SZ[j][k];
222
}
223
for(j=0;j<dim;j++)
224
E[i]->array.SZ[j][j] = 0;
225
}
226
}
227
for(i=0;i<anz;i++)
228
Check_mat(E[i]);
229
for(i=0;i<anz;i++)
230
free_mat(Xk[i+1]);
231
for(i=0;i<dim;i++)
232
{ free(pos[i]); free(sign[i]);}
233
free(pos); free(sign);
234
*fdim = anz;
235
return(E);
236
}
237
238