David Wood and Sebastian Egner have reported errors that occur when one
tries to construct ranges with entries larger than 2^28-1 or smaller than
-2^28.
GAP represents integers between -2^28 and 2^28-1 (including) as
*immediate integers*, i.e., they are stored directly, whereas larger
integers are represented by a pointer to a memory location where the
large integer is stored. Thus immediate integers must fit into 4
bytes. Since we need 2 bits to be able to distinguish, one bit for the
sign, and one guard bit (to detect overflow), immediate integers are
restricted to the range -2^28 .. 2^28-1.
The first restriction is that ranges must contain only small integers.
When you try to construct a range containing large integers, you get a
misleading error message. This is the problem reported by David Wood.
The next restriction is that the position in '<list>[<position>]' must be
a small (and of course positive) integer. If it isn't, you also get a
misleading error message
gap> list := [];; gap> list[ 2^28 ]; Error, List Element: <position> must be a positive integer
The final restriction is that *all* lists must have a length < 2^28.
This is of course not a important, given the previous restriction.
While it is possible to contruct some longer ranges, funny things happen
when you do
gap> list := [-10..2^28-1]; [ -10 .. 268435455 ] gap> Length( list ); 268435466 gap> 2^28+10; 268435466 gap> last = last2; false
This is because the length is represented as immediate integer, even
though it is strictly too large for it. But because of the guard bit,
it still *seems* to work.
It gets worse when one constructs the longest possible range.
gap> list := [-2^28..2^28-1];; gap> Length( list ); -536870912
When GAP tries to print this list (of negative length) it dies (this
is the problem reported by Sebastian Egner).
gap> [-2^28..2^28-1]; Segmentation fault
Martin.
-- .- .-. - .. -. .-.. --- ...- . ... .- -. -. .. -.- .- Martin Sch"onert, Martin.Schoenert@Math.RWTH-Aachen.DE, +49 241 804551 Lehrstuhl D f"ur Mathematik, Templergraben 64, RWTH, 52056 Aachen, Germany