| Daniel Berger on Tue, 06 Jun 2023 19:57:07 +0200 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| Different behavior in library mode (PARI) vs. in GP (when using Z_issmooth) |
Hello,
a simplified version of what I am doing is the following code using PARI:
```C
#include <pari/pari.h>
GEN
function(ulong B, GEN d, ulong m)
{
GEN I, e, e_, ret = NULL;
ulong i;
pari_sp ltop = avma;
I = const_vecsmall(m+1,1);
e = quadunit0(d,-1);
if (gsigne(gnorm(e)) == -1) e = gsqr(e);
e_ = e
for (i = 1; i < lg(I); i++)
{
if(!gel(I,i)) continue;
if(Z_issmooth(gel(e,3),B))
{
if (ret == NULL) ret =
mkvec(diviiexact(subii(gel(e,2),gen_1),gen_2));
else ret =
vec_append(ret,diviiexact(subii(gel(e,2),gen_1),gen_2));
} else for (j = i; j < lg(I); j += i= gel(I,j) = 0; e = gmul(e,e_); } //copy ret to a clean place in memory return gerepileupto(ltop,ret); } ```Now when i run this code as part of compiled C code, it works fine and does what it's supposed to do. For example `function(10, 2, 3)` returns `[1, 8, 49]`
If I however compile this as part of a shared library and install it for use in gp, it doesn't. It appears to me that `Z_issmooth` always returns 1, for example `function(10, 2, 3)` now returns `[1, 8, 49, 288]`. I tried testing `Z_issmooth` separately in gp by installing it with `install(Z_issmooth,"GU",smoothtest,"libpari.so")` and for example `smoothtest(408,10)` (should return 0) but it breaks with a segmentation fault.
Any insights as to what I might be doing wrong are appreciated. Kind Regards, Daniel