Ilya Zakharevich on Fri, 14 Jul 2000 17:15:41 -0400


[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]

Wrong layout of the return value of gpow()?


Here is the result I get from gpow():

(/opt/SUNWspro/bin/../WS5.0/bin/sparcv9/dbx) p RETVAL
RETVAL = 0x644460
(/opt/SUNWspro/bin/../WS5.0/bin/sparcv9/dbx) x 0x00644450/8
0x00644450:      0x00000004 0x02000003 0x40000003 0x00000001
0x00644460:      0x06000003 0x006e23a0 0x00644454 0x02000003
(/opt/SUNWspro/bin/../WS5.0/bin/sparcv9/dbx) p output(RETVAL)
Mod(1,6703903964971298549787012499102923063739682910296196688861780721860882015036773488400937149083451713845015929093243025426876941405973284973216824503471131)

As you can see, RETVAL[2] is less than RETVAL.  This causes a segfault
in Math::Pari.  Is it a bug?

The possible reason is the following chunk of trans1.c:

  427       case t_INTMOD:
  428         y=cgetg(3,tx); copyifstack(x[1],y[1]);
  429         y[2]=(long)powmodulo((GEN)x[2],n,(GEN)x[1]);
  430         return y;

I think the executed code looks like

  Mod(1,p) ^ (p - 1)

or some such.

Ilya