Karim BELABAS on Tue, 4 Jan 2000 17:12:22 +0100 (MET)

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

 Re: bug

```[James G. McLaughlin:]
> I was trying to convert a magma program to gp and got a "segmentation
> fault, bug in gp " message when I tried to run it. Any ideas on how to fix
> it greatly appreciated. (Magma program below, followed by gp version.)

Running your script on GP version 2.0.18, I get (I was trapping all errors):

***   not a set in setintersect.
***   Starting break loop (type 'break' to go back to GP):
***   ...length(setintersect(S,[r])),TT=concat(TT,r),b
^--------------------

This I corrected by replacing all occurences of setintersect as follows:

if(length(setintersect(S,[r])),

becomes

if(setsearch(S,r), \\ = if (r in S)

I then obtained

***   incorrect type in negation.
***   Starting break loop (type 'break' to go back to GP):
***   ...-1,r=S[ii]+se*(S[j]-S[ii]);S=Set(S);if(setsea
^--------------------

I corrected this by replacing the line

S = Set(S)

by

TS = Set(S)

and all occurences of S in "set context" by this TS (actually, I moved the
assignment outside a number of enclosing loops since S was not modified in
there and it is quite costly to turn an object into a set. I did the same for
the other TS = Set(S) which appeared several lines below)

***   array index (7) out of allowed range [1-6]: S=concat(S,[S[jj]+1+a[
***   jj]]););n=length(S);
^--------------------

Then I gave up.

Some observations:

*  you can use v++ instead of v = v+1; ltt-- instead of ltt = ltt-1, etc.

*  break; is equivalent to break(1);

*  if( v - k,,  w= w+1); is the same (but slower and more obfuscated)
as if (v == k, w++);

*  if IsEven(n) then bnn:= Append(bnn,0);
n:= Z!(n/2);
end if;
if IsOdd(n)  then bnn:= Append(bnn,1);
n:= Z!((n-1)/2);
end if;

was translated as:

if(floor(1/gcd(n,2)), bnn=concat(bnn,[1])
, bnn=concat(bnn,[0]));
if(floor(1/gcd(n,2)), n=(n-1)/2, n=n/2);

To check for parity, I'd rather use

IsOdd(n)  = n % 2
IsEven(n) = !IsOdd(n)

and I'd use a right shift to shift the digits. I.e

bnn = concat(bnn, n % 2);
n >>= 1;

In any case, the whole loop looks like what bnn = binary(n) would produce
[ except you get the bits from high to low order. To get them in the same
order as the first magma loop, use bnn = extract(binary(n), "-1..1"). Which
shouldn't be necessary since the next loop was intended to invert the bits
anyway... ]

Good luck,

Karim.
__
Karim Belabas                    email: Karim.Belabas@math.u-psud.fr
Dep. de Mathematiques, Bat. 425
Universite Paris-Sud             Tel: (00 33) 1 69 15 57 48
F-91405 Orsay (France)           Fax: (00 33) 1 69 15 60 19
--