| Karim BELABAS on Mon, 13 Jan 2003 14:37:29 +0100 (MET) |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| Re: is this the right list for this question? |
On Mon, 13 Jan 2003, Ramón Casero Cañas wrote:
> I do not know whether this is the right list for a question regarding some
> C++ code I'm writting based on PARI functions (maybe I should write to the
> users list). It's basic code, actually; at present, just input a (bool **) and
> copy it to a PARI matrix. I get a segmentation fault at the outbeaut()
> function:
>
> ----------------------------------------------------------------
>
> inverse_mat_mod2: size = 32
> Matrix? a = 1078694052
>
> [ *** segmentation fault: bug in PARI or calling program.
> *** Error in the PARI system. End of program.
>
> ----------------------------------------------------------------
>
> bool inverse_mat_mod2(bool **_a, unsigned _size, bool _CHECK) {
> long paristacksize = 500000;
> GEN a; // temp matrix by columns
> unsigned i, j; // counter
> unsigned sizepari = _size + 1;
> GEN v; // auxiliay pointer for columns
> GEN z; // auxiliary element of the matrix
>
> if (sizeof(long) * _size * _size > (unsigned)paristacksize) {
> paristacksize = sizeof(long) * _size * _size * 2; // this's a guess of
> mine w/o any base
> }
The space needed to _hold_ a square matrix of dimension n with elements in
F_2 (as t_INTMOD) is (at most)
SIZE := (n + 1)^2 + n^2 * [ 3 + 2 * 3 ]
long integers [ using t_VECSMALL and 'long' entries reduce the bracketed
quantity from 9 to 1 ].
You need some more space to actually _operate_ on a. Multiplying SIZE by 10
should be enough. [ with t_VECSMALL, most things are done in place, and you
need about 3 * SIZE ]
> 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], ..., as a[0] is for type
> * information */
> std::cout << "inverse_mat_mod2: size = " << _size << std::endl;
> a = cgetg(sizepari, t_MAT); // `a' has _size columns
> if (!a) err(talker, "inverse_mat_mod2: memory!\n");
cgetg always return a non-NULL result. In case of problems, it raises a
"stack overflow" exception which terminates the program. Your test
is a no-op.
> for (i = 1; i < sizepari; ++i) { // alloc `a' columns
> a[i] = lgetg(sizepari, t_COL);
> if (!a[i]) err(talker, "inverse_mat_mod2: memory!\n");
Same here.
> }
> for (i = 1; i < sizepari; ++i) { // alloc space for elements
> for (j = 1; j < sizepari; ++j) {
>
> z = gcoeff(a, i, j);
> z = cgetg(3, t_INTMOD);
> z[1] = (long)2;
> z[2] = (long)1;
Rather
z[1] = lstoi(2);
z[2] = lstoi(1);
The components of an INTMOD are GENs, not longs !
> }
> }
>
> std::cout << "Matrix? a = " << (int)a << std::endl;
> outbeaut(a);
> return true;
> }
Maybe outbeaut( ginv(a) ) ?
Cheers,
Karim.
--
Karim Belabas Tel: (+33) (0)1 69 15 57 48
Dép. de Mathématiques, Bât. 425 Fax: (+33) (0)1 69 15 60 19
Université Paris-Sud Email: Karim.Belabas@math.u-psud.fr
F-91405 Orsay (France) http://www.math.u-psud.fr/~belabas/
--
PARI/GP Home Page: http://www.parigp-home.de/