| 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)
Then I had
*** 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
--
PARI/GP Home Page: http://hasse.mathematik.tu-muenchen.de/ntsw/pari/