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

563595 views
1
#include "typedef.h"
2
#include "gmp.h"
3
#include "longtools.h"
4
#include "matrix.h"
5
#include "tools.h"
6
7
/**************************************************************************\
8
@---------------------------------------------------------------------------
9
@---------------------------------------------------------------------------
10
@ FILE: pair_red_inv.c
11
@---------------------------------------------------------------------------
12
@---------------------------------------------------------------------------
13
@
14
\**************************************************************************/
15
16
17
/**************************************************************************\
18
@---------------------------------------------------------------------------
19
@ matrix_TYP *pair_red_inv(A, T)
20
@ matrix_TYP *A, *T;
21
@
22
@ calculates a matrices B and T such that T A^{-1} T^{tr} = B
23
@ is pair_reduced.
24
@ B is returned with B->kgv = 1 and the transformation is written to T.
25
@ The function used GNU MP to avoid overflow
26
@---------------------------------------------------------------------------
27
@
28
\**************************************************************************/
29
matrix_TYP *pair_red_inv(A, T)
30
matrix_TYP *A, *T;
31
{
32
MP_INT ***E, **MA, **MB, **Trf;
33
MP_INT Ekgv;
34
int Ecols;
35
matrix_TYP *erg;
36
int i,j;
37
38
39
if(A->cols != A->rows)
40
{
41
printf("error: can't invert non-square matrix\n");
42
exit(3);
43
}
44
MA = matrix_to_MP_mat(A);
45
if((MB = (MP_INT **) malloc(A->cols *sizeof(MP_INT *))) == NULL)
46
{
47
printf("malloc of 'MB' in 'pair_red_inv' failed\n");
48
exit(2);
49
}
50
for(i=0;i<A->cols;i++)
51
{
52
if((MB[i] = (MP_INT *) malloc(A->cols *sizeof(MP_INT))) == NULL)
53
{
54
printf("malloc of 'MB[%d]' in 'long_mat_inv' failed\n", i);
55
exit(2);
56
}
57
for(j=0;j<A->cols;j++)
58
mpz_init(&MB[i][j]);
59
mpz_set_si(&MB[i][i], 1);
60
}
61
mpz_init(&Ekgv);
62
E = MP_solve_mat(MA, A->rows, A->cols, MB, A->cols, &Ecols, &Ekgv);
63
for(i=0;i<A->cols;i++)
64
{
65
for(j=0;j<A->cols;j++)
66
{ mpz_clear(&MA[i][j]); mpz_clear(&MB[i][j]);}
67
free(MA[i]);
68
free(MB[i]);
69
}
70
free(MA);
71
free(MB);
72
73
if(E[1] != NULL)
74
{
75
printf("Error: matrix in 'long_mat_inv' is singular\n");
76
exit(3);
77
}
78
if(E[0] == NULL)
79
{
80
printf("Error in 'long_mat_inv'\n");
81
exit(3);
82
}
83
if( (Trf = (MP_INT **)malloc(A->cols *sizeof(MP_INT *))) == NULL)
84
{
85
printf("malloc of 'Trf' in 'pair_red_inv' failed\n");
86
exit(2);
87
}
88
for(i=0;i<A->cols;i++)
89
{
90
if( (Trf[i] = (MP_INT *)malloc(A->cols *sizeof(MP_INT))) == NULL)
91
{
92
printf("malloc of 'Trf[%d]' in 'pair_red_inv' failed\n", i);
93
exit(2);
94
}
95
for(j=0;j<A->cols;j++)
96
mpz_init(&Trf[i][j]);
97
mpz_set_si(&Trf[i][i], 1);
98
}
99
MP_pair_red(E[0], Trf, A->cols);
100
erg = MP_mat_to_matrix(E[0], A->cols, A->cols);
101
write_MP_mat_to_matrix(T, Trf);
102
for(i=0;i<A->cols;i++)
103
{
104
for(j=0;j<A->cols;j++)
105
{
106
mpz_clear(&E[0][i][j]);
107
mpz_clear(&Trf[i][j]);
108
}
109
free(E[0][i]);
110
free(Trf[i]);
111
}
112
free(E[0]);
113
free(E);
114
free(Trf);
115
mpz_clear(&Ekgv);
116
Check_mat(erg);
117
return(erg);
118
}
119
120