| Thomas D. Dean on Mon, 17 Sep 2007 19:45:57 +0200 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| Libpari Function Somme |
I have a problem using the libpari function, somme.
Help on sum shows:
The library syntax is somme(entree *ep, GEN a, GEN b, char *expr, GEN
x). This is to be used as follows: ep represents the dummy variable
used in the expression expr
/* compute a^2 + ... + b^2 */
{
/* define the dummy variable "i" */
entree *ep = is_entry("i");
/* sum for a <= i <= b */
return somme(ep, a, b, "i^2", gen_0);
}
However, my code
entree *ep = is_entry("i");
s = somme(ep, gen_1, n, "i^2", gen_0);
produces the fault:
*** segmentation fault: bug in PARI or calling program.
*** Error in the PARI system. End of program.
>From gdb, I see
18 s = somme(ep, gen_1, n, "i^2", gen_0);
(gdb) n
Program received signal SIGSEGV, Segmentation fault.
0x28217194 in new_val_cell () from /usr/X11R6/lib/libpari.so.2
(gdb) bt
#0 0x28217194 in new_val_cell () from /usr/X11R6/lib/libpari.so.2
#1 0x00002028 in ?? ()
#2 0x08151fdc in ?? ()
#3 0x00000000 in ?? ()
#4 0x282cd644 in __JCR_LIST__ () from /usr/X11R6/lib/libpari.so.2
#5 0x08151fdc in ?? ()
#6 0x08152000 in ?? ()
#7 0x08151fe8 in ?? ()
#8 0x2823b50d in somme () from /usr/X11R6/lib/libpari.so.2
#9 0x2804eb64 in elf_hash () from /libexec/ld-elf.so.1
Previous frame inner to this frame (corrupt stack?)
What am I doing wrong?
The code is below.
tomdean
#include <stdio.h>
#include <pari/pari.h>
#define MK_GEN(n) utoi((ulong)(n))
void calc_sum(int i) {
GEN d,s,two,five,z,nr,q;
GEN n;
n = MK_GEN(i);
entree *ep = is_entry("i");
pariprintf("n=%Z\n",n);
s = somme(ep, gen_1, n, "i^2", gen_0);
d = denom(s);
two= gen_0;
while (ggcd(MK_GEN(2),d) != gen_1) {
d = gdiv(d,MK_GEN(2));
two = gadd(two,gen_1);
}
five = gen_0;
while (ggcd(MK_GEN(5),d) != gen_1) {
d = gdiv(d,MK_GEN(5));
five = gadd(five,gen_1);
}
z=znorder(gmodulo(MK_GEN(10),d),gen_0);
nr = gmax(two, five);
q = gfloor(s);
pariprintf("%Z %Z %Z %Z %Z\n",n,q,nr,z);
}
int main(int argc, char **argv) {
int i;
pari_sp av;
pari_init(1*1024*1024,2);
for (i=10; i<20; i++) {
av = avma; // initial pari stack pointer
calc_sum(i);
avma = av; // clear the pari stack
}
return 0;
}