| Mark Dickinson on Tue, 17 Apr 2001 13:04:44 -0400 (EDT) |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| greal() bug for type t_RFRAC? |
Hi,
I encountered the following behaviour:
GP/PARI CALCULATOR Version 2.1.0 (released)
UltraSparc (MicroSparc kernel) 32-bit version
[snipped]
? w=quadgen(-3)
%1 = w
? real(1/(a+b*w))
%2 = a/(a^2 + b^2)
Unless I've misunderstood something, this doesn't seem like a useful
answer; I was expecting (a+b)/(a^2+a*b+b^2). The problem seems to lie in
the treatment of type t_RFRAC in the function op_ReIm(GEN f(GEN), GEN x)
in basemath/gen3.c, where the formulas for real and imaginary parts appear
to assume a complex type. The following patch (against the source for
version 2.1.0) fixes the problem for me:
*** pari-2.1.0/src/basemath/gen3.c Fri Nov 3 16:00:22 2000
--- pari-2.1.0/src/basemath/gen3fix.c Tue Apr 17 12:53:44 2001
***************
*** 2335,2347 ****
case t_RFRAC: case t_RFRACN:
{
av=avma; r2=greal((GEN)x[2]); i2=gimag((GEN)x[2]);
! if (f==greal)
! p1 = gadd(gmul(greal((GEN)x[1]),r2),
! gmul(gimag((GEN)x[1]),i2));
! else
! p1 = gsub(gmul(gimag((GEN)x[1]),r2),
! gmul(greal((GEN)x[1]),i2));
! p2=gadd(gsqr(r2), gsqr(i2));
tetpil=avma; return gerepile(av,tetpil,gdiv(p1,p2));
}
--- 2335,2342 ----
case t_RFRAC: case t_RFRACN:
{
av=avma; r2=greal((GEN)x[2]); i2=gimag((GEN)x[2]);
! p1 = f(gmul((GEN)x[1],gconj((GEN)x[2])));
! p2 = gnorm((GEN)x[2]);
tetpil=avma; return gerepile(av,tetpil,gdiv(p1,p2));
}
However, this is the first time I've delved into the PARI source, so I'm
not guaranteeing either that this patch is sensible or that it doesn't
break something else :)
Thanks,
Mark Dickinson