| Karim Belabas on Sun, 01 Aug 2010 19:47:45 +0200 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| Re: Real zero in libpari |
* Bill Allombert [2010-07-26 15:14]:
> On Mon, Jul 26, 2010 at 02:35:04PM +0200, Jeroen Demeyer wrote:
> > Hello pari-users,
> >
> > I have a technical question about the t_REAL type. The documentation
> > says that real zero is characterized by having the sign equal to zero.
> > My question is: does a real zero NEED to have lg == 2 in order to be a
> > valid GEN?
>
> Currently, yes. This is necessary because z[2] must be normalized, and so
> cannot be 0. Thus the only possibility is that z[2] does not exist i.e. lg=2.
A real 0 is allowed to have an arbitrary length, otherwise functions
like affsr() make no sense -- as currently implemented, documented, and
used (look for affsr(0,.) in the PARI sources.
In fact, it is not documented that z[2] must be normalized (and this is
likely to change as it serves no real benefit and make t_INT and t_REAL
mantissas incompatible). The documentation only says that for z != 0,
the mantissa is stored in z[2]....z[lg(z)-1]
(and that the latter words are ignored if signe(z) = 0).
>> I am asking because the following program gives an error:
>> #include <pari/pari.h>
>> int main()
>> {
>> pari_init(1000000, 500000);
>>
>> GEN x = cgetr(3); /* Normally, lg would be 2 */
>> setsigne(x, 0);
>> setexpo(x, -63);
>> dbgGEN(x, -1);
>>
>> /* The following line gives:
>> *** overflow in expo().
>> *** Error in the PARI system. End of program. */
>> gexp(x, 100);
>> }
>
> It seems that mpexp explicitly make the assumption that lg(x)=2 iff signe(x)=0.
> This assumption is correct at this point.
This is a bug in mpexp(). The assumption is useless (getting rid of it
can be done with no loss of efficiency), and not even correct.
Fixed in svn.
> Another frequent similar assumption is done for polynomials with t_INT
> coefficients: lg(x)=2 iff signe(x)=0. Note that this is not true for
> general polynomials (with inexact 0 as coefficients).
In that case, it is documented that the leading term of a t_POL is not
allowed to be an exact rational 0. Hence lg(x) = 2 iff signe(x) = 0
for a t_POL in Z[X].
Cheers,
K.B.
--
Karim Belabas, IMB (UMR 5251) Tel: (+33) (0)5 40 00 26 17
Universite Bordeaux 1 Fax: (+33) (0)5 40 00 69 50
351, cours de la Liberation http://www.math.u-bordeaux1.fr/~belabas/
F-33405 Talence (France) http://pari.math.u-bordeaux1.fr/ [PARI/GP]
`