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

563667 views
1
#include "typedef.h"
2
#include "matrix.h"
3
#include "voronoi.h"
4
#include "ZZ_P.h"
5
6
static matrix_TYP *Mod, *Trf;
7
static rational c;
8
9
/*{{{}}} */
10
/*{{{ lll_init, static */
11
static void
12
lll_init (Mat, lll_bnd)
13
matrix_TYP *Mat;
14
int lll_bnd;
15
16
{
17
int **Z, **N;
18
int i;
19
20
21
c.z = lll_bnd;
22
c.n = lll_bnd + 1;
23
24
Trf = mat_red (Mat);
25
dec_mat (Mat, Trf);
26
27
if (LLLREDUCED)
28
{
29
Mod = init_mat (Mat->rows, Mat->rows, "srl");
30
Z = Mod->array.SZ;
31
N = Mod->array.N;
32
for (i = 0; i < Mat->rows; i++)
33
{
34
Z[i][i] = 1;
35
}
36
}
37
}
38
/*}}} */
39
/*{{{ upd_mod, static */
40
41
static void
42
upd_mod (Mat, pos)
43
matrix_TYP *Mat;
44
int pos;
45
46
{
47
int **Z, **N, **A;
48
rational sum, help;
49
int i, j;
50
51
sum = help = Zero;
52
53
A = Mat->array.SZ;
54
Z = Mod->array.SZ;
55
N = Mod->array.N;
56
if (pos == 1)
57
Z[0][0] = A[0][0];
58
for (i = 0; i <= pos; i++)
59
{
60
sum.z = 0;
61
sum.n = 1;
62
for (j = 0; j < i; j++)
63
{
64
help.z = Z[j][j] * Z[pos][j] * Z[i][j];
65
help.n = N[j][j] * N[pos][j] * N[i][j];
66
sum.z *= help.n;
67
help.z *= sum.n;
68
sum.z += help.z;
69
sum.n *= help.n;
70
Normal (&sum);
71
}
72
if ((i != pos) && (Z[i][i] != 0))
73
{
74
N[pos][i] = sum.n * Z[i][i];
75
sum.n = sum.n * A[pos][i] - sum.z;
76
Z[pos][i] = sum.n * N[i][i];
77
}
78
else
79
{
80
N[pos][i] = sum.n;
81
sum.n *= A[pos][i];
82
Z[pos][i] = sum.n - sum.z;
83
}
84
Normal2 (&Z[pos][i], &N[pos][i]);
85
}
86
}
87
88
/*}}} */
89
/*{{{ reduce, static */
90
static boolean
91
reduce (Mat, k, l)
92
matrix_TYP *Mat;
93
int k, l;
94
95
{
96
rational d;
97
int **Z, **N, **A, **T, *T_help;
98
int i;
99
int f, waste;
100
101
d = Zero;
102
f = waste = 0;
103
104
Z = Mod->array.SZ;
105
N = Mod->array.N;
106
A = Mat->array.SZ;
107
T = Trf->array.SZ;
108
d.z = abs (Z[k][l]);
109
d.n = N[k][l];
110
if ((d.z * 11) > d.n)
111
{
112
f = d.z / d.n;
113
d.z %= d.n;
114
if (d.z > (d.n / 2))
115
f++;
116
if (f != 0)
117
{
118
if (Z[k][l] < 0)
119
f *= -1;
120
for (i = 0; i < l; i++)
121
{
122
Z[k][i] =
123
Z[k][i] * N[l][i] - f * N[k][i] * Z[l][i];
124
N[k][i] *= N[l][i];
125
Normal2 (&Z[k][i], &N[k][i]);
126
}
127
Z[k][i] -= f * N[k][i];
128
A[k][k] -= (2 * A[k][l] - f * A[l][l]) * f;
129
for (i = 0; i <= l; i++)
130
A[k][i] -= f * A[l][i];
131
for (; i < k; i++)
132
A[k][i] -= f * A[i][l];
133
for (i++; i < Mat->rows; i++)
134
A[i][k] -= f * A[i][l];
135
for (i = 0; i < Trf->cols; i++)
136
T[k][i] -= f * T[l][i];
137
}
138
if (A[k][k] == 0)
139
{
140
kill_row (Mat, k);
141
kill_col (Mat, k);
142
T_help = T[k];
143
/* Mat->cols = --Mat->rows; */
144
for (i = k; i < Mat->rows; i++)
145
{
146
T[i] = T[i + 1];
147
/* A[i] = A[i+1];
148
for ( j = k; j <= i; j++)
149
A[i][j]= A[i][j+1]; A[i][j+1] = 0; */
150
}
151
T[i] = T_help;
152
A = Mat->array.SZ;
153
return (FALSE);
154
}
155
}
156
return (TRUE);
157
}
158
/*}}} */
159
/*{{{ swap, static */
160
161
static void
162
swap (Mat, i)
163
164
matrix_TYP *Mat;
165
166
int i;
167
168
{
169
rational help;
170
int **Z, **N, **A, **T, *t;
171
int j;
172
int k;
173
174
help = Zero;
175
k = 0;
176
177
A = Mat->array.SZ;
178
Z = Mod->array.SZ;
179
N = Mod->array.N;
180
T = Trf->array.SZ;
181
t = T[i + 1];
182
T[i + 1] = T[i];
183
T[i] = t;
184
for (j = 0; j < i; j++)
185
{
186
k = A[i + 1][j];
187
A[i + 1][j] = A[i][j];
188
A[i][j] = k;
189
k = 0;
190
Z[i][j] = Z[i + 1][j];
191
Z[i + 1][j] = 0;
192
N[i][j] = N[i + 1][j];
193
N[i + 1][j] = 1;
194
}
195
k = A[i][i];
196
A[i][i] = A[i + 1][i + 1];
197
A[i + 1][i + 1] = k;
198
k = 0;
199
for (j += 2; j < Mat->rows; j++)
200
{
201
k = A[j][i + 1];
202
A[j][i + 1] = A[j][i];
203
A[j][i] = k;
204
k = 0;
205
}
206
help.z = Z[i + 1][i] * Z[i + 1][i] * Z[i][i] * N[i + 1][i + 1];
207
help.n = N[i + 1][i] * N[i + 1][i] * N[i][i];
208
Normal (&help);
209
N[i][i] = help.n * N[i + 1][i + 1];
210
Z[i][i] = help.n * Z[i + 1][i + 1] + help.z;
211
Normal2 (&Z[i][i], &N[i][i]);
212
}
213
214
/*}}} */
215
/*{{{ condition, static */
216
static boolean
217
condition (i)
218
int i;
219
220
{
221
rational help;
222
int **Z, **N;
223
boolean cond;
224
225
help = Zero;
226
Z = Mod->array.SZ;
227
N = Mod->array.N;
228
229
help.z = Z[i][i - 1] * Z[i][i - 1];
230
help.n = N[i][i - 1] * N[i][i - 1];
231
help.z = -help.z * c.n + c.z * help.n;
232
help.n *= c.n;
233
help.z *= Z[i - 1][i - 1];
234
help.n *= N[i - 1][i - 1];
235
help.n *= Z[i][i];
236
help.z *= N[i][i];
237
cond = help.n < help.z;
238
return (cond);
239
}
240
241
/*}}} */
242
/*{{{ lll, exported */
243
matrix_TYP *
244
ZZ_lll (Mat, lll_bnd)
245
matrix_TYP *Mat;
246
int lll_bnd;
247
248
{
249
int i = 1, j;
250
251
lll_init (Mat, lll_bnd);
252
if (LLLREDUCED)
253
{
254
if (Mat->cols == 1)
255
return (Trf);
256
do
257
{
258
upd_mod (Mat, i);
259
for (j = i - 1; j >= 0; j--)
260
{
261
if (!reduce (Mat, i, j))
262
{
263
i--;
264
break;
265
}
266
267
if ((j == i - 1) && condition (i))
268
{
269
swap (Mat, --i);
270
}
271
}
272
i++;
273
} while (i < Mat->cols);
274
free_mat (Mod);
275
for (i = 0; i < Mat->rows; i++)
276
for (j = i + 1; j < Mat->cols; j++)
277
Mat->array.SZ[i][j] = Mat->array.SZ[j][i];
278
}
279
Check_mat (Trf);
280
Check_mat (Mat);
281
return (Trf);
282
}
283
/*}}} */
284
285