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 "gmp.h"
3
/* #include "gmp-impl.h" */
4
/**************************************************************************\
5
@---------------------------------------------------------------------------
6
@---------------------------------------------------------------------------
7
@ FILE: MP_pair_red.c
8
@---------------------------------------------------------------------------
9
@---------------------------------------------------------------------------
10
@
11
\**************************************************************************/
12
13
14
15
static void MP_two_reduce(G, T, i, j, n)
16
MP_INT **G, **T;
17
int i, j, n;
18
{
19
int k;
20
MP_INT f, f1, f2;
21
MP_INT zwei;
22
23
mpz_init(&f);
24
mpz_init(&f1);
25
mpz_init(&f2);
26
mpz_init_set_si(&zwei, 2);
27
mpz_div(&f1, &G[i][i], &zwei);
28
if(mpz_cmp_si(&G[i][j], 0) > 0)
29
{
30
mpz_add(&f2, &G[i][j], &f1);
31
}
32
else
33
{
34
mpz_sub(&f2, &G[i][j], &f1);
35
}
36
mpz_div(&f, &f2, &G[i][i]);
37
38
for(k=0;k<n;k++)
39
{
40
mpz_mul(&f1, &f, &G[i][k]);
41
mpz_sub(&G[j][k], &G[j][k], &f1);
42
}
43
mpz_mul(&f1, &f, &G[j][i]);
44
mpz_sub(&G[j][j], &G[j][j], &f1);
45
for(k=0;k<n;k++)
46
{
47
if(k != j)
48
{
49
mpz_set(&G[k][j], &G[j][k]);
50
}
51
}
52
for(k=0;k<n;k++)
53
{
54
mpz_mul(&f1, &f, &T[i][k]);
55
mpz_sub(&T[j][k], &T[j][k], &f1);
56
}
57
mpz_clear(&f);
58
mpz_clear(&f1);
59
mpz_clear(&f2);
60
mpz_clear(&zwei);
61
}
62
63
64
/**************************************************************************\
65
@---------------------------------------------------------------------------
66
@ void MP_pair_red(G, T, n)
67
@ MP_INT **G, **T;
68
@ int n;
69
@
70
@ Applies a pair reduction to the positive definite n x n - matrix G
71
@ and does the row operations simultaneous on T, i.e.
72
@ G is changed to T * G * T^{tr}
73
@ T must be initialized before calling the function.
74
@ It is possible to call the function with T = NULL.
75
@---------------------------------------------------------------------------
76
@
77
\**************************************************************************/
78
void MP_pair_red(G, T, n)
79
MP_INT **G, **T;
80
int n;
81
{
82
int i,j,k, p1, p2;
83
int reduced, red2;
84
MP_INT merk, s, a, zwei;
85
86
mpz_init(&merk);
87
mpz_init(&s);
88
mpz_init(&a);
89
mpz_init_set_si(&zwei, 2);
90
reduced = FALSE;
91
MP_reduction_sort(G,T,n);
92
while(reduced == FALSE)
93
{
94
reduced = TRUE;
95
for(i=0;i<n;i++)
96
for(j=0;j<i;j++)
97
{
98
red2 = FALSE;
99
while(red2 == FALSE && (mpz_cmp_si(&G[i][i], 0) != 0 || mpz_cmp_si(&G[j][j], 0) != 0))
100
{
101
if(mpz_cmp_si(&G[i][i], 0) > 0 && mpz_cmp(&G[i][i], &G[j][j])<= 0)
102
{
103
mpz_mul(&a, &zwei, &G[i][j]);
104
mpz_abs(&merk, &a);
105
if(mpz_cmp(&merk, &G[i][i]) > 0)
106
{
107
MP_two_reduce(G, T, i, j, n);
108
reduced = FALSE;
109
}
110
else
111
red2 = TRUE;
112
}
113
if(mpz_cmp_si(&G[j][j], 0) > 0 && mpz_cmp(&G[j][j], &G[i][i])<=0)
114
{
115
mpz_mul(&a, &zwei, &G[i][j]);
116
mpz_abs(&merk, &a);
117
if(mpz_cmp(&merk, &G[j][j]) > 0)
118
{
119
MP_two_reduce(G, T, j, i, n);
120
reduced = FALSE;
121
}
122
else
123
red2 = TRUE;
124
}
125
if(mpz_cmp_si(&G[i][i], 0) < 0 || mpz_cmp_si(&G[j][j], 0) < 0)
126
{
127
mpz_clear(&merk);
128
mpz_clear(&s);
129
mpz_clear(&a);
130
mpz_clear(&zwei);
131
return;
132
}
133
}
134
}
135
MP_reduction_sort(G, T, n);
136
for(i=0;i<n;i++)
137
for(j=i+1;j<n;j++)
138
{
139
if(mpz_cmp(&G[i][i], &G[j][j])<=0)
140
{ p1 = i; p2 = j;}
141
else
142
{ p1 = j; p2 = i;}
143
mpz_abs(&merk, &G[p1][p2]);
144
if(mpz_cmp_si(&merk, 0) != 0)
145
mpz_div(&s, &G[p1][p2], &merk);
146
else
147
mpz_set_si(&s, 0);
148
mpz_mul(&merk, &merk, &zwei);
149
if(mpz_cmp(&merk, &G[p1][p1]) == 0)
150
{
151
for(k=0; k<n;k++)
152
{
153
if(k != p2)
154
{
155
mpz_mul(&merk, &s, &G[p1][k]);
156
mpz_sub(&G[p2][k], &G[p2][k], &merk);
157
}
158
mpz_mul(&merk, &s, &T[p1][k]);
159
mpz_sub(&T[p2][k], &T[p2][k], &merk);
160
}
161
for(k=0;k<n;k++)
162
mpz_set(&G[k][p2], &G[p2][k]);
163
for(k=0;k<n;k++)
164
{
165
if(k != p1 && k != p2)
166
{
167
red2 = FALSE;
168
while(red2 == FALSE && mpz_cmp_si(&G[k][k], 0) > 0 && mpz_cmp_si(&G[p2][p2], 0) > 0)
169
{
170
mpz_abs(&a, &G[k][p2]);
171
mpz_mul(&a, &a, &zwei);
172
if(mpz_cmp(&a, &G[k][k])>0 || mpz_cmp(&a, &G[p2][p2])>0)
173
{
174
if(mpz_cmp(&a, &G[k][k])>0 && mpz_cmp(&G[k][k], &G[p2][p2])<0)
175
MP_two_reduce(G, T, k, p2, n);
176
else
177
MP_two_reduce(G, T, p2, k, n);
178
reduced = FALSE;
179
}
180
else
181
red2 = TRUE;
182
}
183
if(mpz_cmp_si(&G[k][k], 0) < 0 || mpz_cmp_si(&G[p2][p2], 0) < 0)
184
{
185
mpz_clear(&merk);
186
mpz_clear(&s);
187
mpz_clear(&a);
188
mpz_clear(&zwei);
189
return;
190
}
191
}
192
}
193
}
194
if(mpz_cmp_si(&G[i][i], 0) < 0 || mpz_cmp_si(&G[j][j], 0) < 0)
195
{
196
mpz_clear(&merk);
197
mpz_clear(&s);
198
mpz_clear(&a);
199
mpz_clear(&zwei);
200
return;
201
}
202
}
203
}
204
205
/* inserted 06/05/97 tilman */
206
mpz_clear(&s);
207
mpz_clear(&a);
208
mpz_clear(&merk);
209
mpz_clear(&zwei);
210
211
return;
212
213
}
214
215