In the first section of this chapter we defined a vector as a list without holes whose elements all come from a common field. This representation is quite nice to use. However, suppose that GAP would have to check that a list is a vector every time this vector appears as operand in a addition or multiplication. This would be quite wasteful.
To avoid this a list that is a vector may, but need not, have an internal flag set that tells the operations that this list is indeed a vector. Then this operations do not have to check this operand and can perform the operation right away. This section tells you when a vector obtains this flag, so you can write your functions in such a way that you make best use of this feature.
The results of vector operations, i.e., binary operations that involve vectors, are known by construction to be vectors, and thus have the flag set upon creation.
If the operand of one of the binary operation is a list that does not yet have the flag set, those operations will check that this operand is indeed a vector and set the flag if it is. If it is not a vector and not a matrix an error is signalled.
If the argument to IsVector
is a list that does not yet have this flag
set, IsVector
will test if all elements come from a common field. If
they do, IsVector
will set the flag. Thus on the one hand IsVector
is a test whether the argument is a vector. On the other hand IsVector
can be used as a hint to GAP that a certain list is indeed a vector.
If you change a vector, that does have this flag set, by assignment,
Add
, or Append
, the vectors will loose its flag, even if the change
is such that the resulting list is still a vector. However if the vector
is a vector over a finite field and you assign an element from the same
finite field the vector will keep its flag. Note that changing a list
that is not a vector will never set the flag, even if the resulting list
is a vector. Such a vector will obtain the flag only if it appears as
operand in a binary operation, or is passed to IsVector
.
Vectors over finite fields have one additional feature. If they are known to be vectors, not only do they have the flag set, but also are they represented differently. This representation is much more compact. Instead of storing every element separately and storing for every element separately in which field it lies, the field is only stored once. This representation takes up to 10 times less memory.
GAP 3.4.4