| Ramón Casero Cañas on Thu, 16 Jan 2003 09:37:16 +0100 (MET) |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| thank you for the inversion |
Thank you all for the help. At last my function takes a C++ matrix,
inverts it mudulo2, and overwrites the input matrix with the result. The
code is below, just in case you want to have a look at this PARI's
`Hello world'. Of course you're going to say `it's so easy, and
everything that's hard was already done'. Well, it's been very
interesting getting to know PARI/GP, and I hope using it further.
I have also tried to do it the u_FpM_inv() way, but I'm still struggling
trying to get that it compiles. I have some directions from some of you
about this problem, so I'll try to overcome it.
Best,
Ramón.
--------------------------------------------------
bool inverse_mat_mod2(bool **_a, unsigned _size) {
return inverse_mat_mod2(_a, _size, true);
}
bool inverse_mat_mod2(bool **_a, const unsigned _size, const bool _CHECK) {
GEN a; // temp matrix by columns
unsigned i, j; // counter
unsigned sizepari = _size + 1;
GEN z; // auxiliary element of the matrix
GEN v; // auxiliary element of the matrix
long paristacksize = 500000;
long total_size = sizepari * sizepari + _size * _size * 9; // thanks,
Karim
paristacksize = sizeof(long) * total_size * 10; // thanks again
pari_init(paristacksize, 2); // init PARI stack
/* allocate memory for the temp matrix
* note: remember that PARI matrices of mxn need (m+1)x(n+1), and
* that elements go a[1], a[2], ..., while a[0] is for type
* information */
std::cout << "inverse_mat_mod2: size = " << _size << std::endl;
a = cgetg(sizepari, t_MAT); // `a' has _size columns
for (i = 1; i <= _size; ++i) { // allocate `a' columns of _size elements
a[i] = lgetg(sizepari, t_COL);
}
for (i = 1; i <= _size; ++i) { // allocate space for elements
v = (GEN)a[i];
for (j = 1; j <= _size; ++j) {
v[j] = lgetg(3, t_INTMOD);
z = (GEN)v[j];
z[1] = lstoi(2); // modulo 2
if (_a[j-1][i-1]) z[2] = un; else z[2] = zero;//lstoi(0);
}
}
std::cout << "inverse_mat_mod2: assigment done" << std::endl;
/* invert matrix */
GEN ainv;
ainv = ginv(a);
/* check whether the inverse is valid */
if (_CHECK) {
GEN a_ainv;
a_ainv = gmul(a, ainv);
for (i = 1; i <= _size; ++i) {
v = (GEN)a_ainv[i];
for (j = 1; j <= _size; ++j) {
z = (GEN)v[j];
if ((i == j) != itos((GEN)z[2])) return false;
}
}
}
/* for no _CHECK or valid inversion, overwrite input array with
inverse matrix */
for (i = 1; i <= _size; ++i) {
v = (GEN)ainv[i];
for (j = 1; j <= _size; ++j) {
z = (GEN)v[j];
_a[j-1][i-1] = (bool)itos((GEN)z[2]);
}
}
return true;
}
--
+++ GMX - Mail, Messaging & more http://www.gmx.net +++
NEU: Mit GMX ins Internet. Rund um die Uhr für 1 ct/ Min. surfen!