<!-- 

  intro.xml            cvec package documentation           Max Neunhoeffer

  Copyright (C) 2007  Max Neunhoeffer, Lehrstuhl D f. Math., RWTH Aachen
  This file is free software, see license information at the end.

This chapter gives a short introduction and explains the philosophy
behind the package.

-->

<Chapter Label="intro">
<Heading>Introduction</Heading>

<Section Label="philosophy">
<Heading>Philosophy</Heading>

This package implements a complete infrastructure for vectors over finite
fields. The basic idea is, that one can store an element of a finite field
using only a few bits rather than a full machine word. Therefore one can
pack more than one finite field element in a machine word. This approach
not only saves memory but also allows fast arithmetic.<P/>

Contrary to other implementations this package uses long word instructions
for arithmetic and other operations rather than table lookups, because 
modern microprocessor designs seem to support faster memory access in this
way and memory access is the main limiting factor for computations over
finite fields. This approach also allows for bigger finite fields with
more than 256 elements. For a more detailed descriptions of this design see
Chapter <Ref Chap="datastrucs"/>.<P/>

The main purpose of this implementation is to use it in
<Package>MeatAxe</Package>-like applications, that is, working with
matrices consisting of compressed vectors over finite fields, doing
linear algebra calculations like nullspaces, spinning of vectors,
multiplying and inverting matrices and the like. Another purpose could
be matrix group calculations. Usually in such computations, the base field
does not change too often and not many different lengths of vectors
occur. This implementation is optimized with these applications in mind
and might not be very efficient for other purposes like using compressed
vectors as coefficient lists of polynomials.<P/>

Another important point is that compressed vectors in this package do
not even try to behave exactly like &GAP; lists. To the contrary, they
disallow many operations that are possible for &GAP; lists for example
changing their length or assigning arbitrary &GAP; objects to positions
in the vector. The reason for this is that the chosen data structure
does not allow to assign anything but elements of the one base field
to positions in the vector and the option to change the representation
<Q>on the fly</Q> is not desirable in most applications. On the other
hand one can be relatively sure not to <Q>lose compression</Q> along 
the way.  <P/>

</Section>

<Section Label="overview">
<Heading>Overview over this manual</Heading>

Chapter <Ref Chap="install"/> describes the installation of this package.
Chapter <Ref Chap="datastrucs"/> describes the basic design and all the
data structures used in this package, including the external representation
of matrices on storage. These descriptions might be very valuable to
understand the behaviour of the implementation and various performance
issues. Those and other performance issues are covered in Chapter <Ref
Chap="performance"/>, where you mainly find hints on how to tune your
own programs that use this package. Chapters <Ref Chap="vectors"/> to
<Ref Chap="matrices"/> describe the available functionality for
vectors and matrices respectively. Chapter <Ref Chap="gaplib"/> describes,
how the functionality in this package is or is not usable in connection
with the &GAP; library. Finally, Chapter <Ref Chap="examples"/>
shows instructive examples for the usage of this package.

</Section>

<Section Label="feedback">
<Heading>Feedback</Heading>

For bug reports, feature requests and suggestions, please use our
<URL Text="issue tracker">https://github.com/neunhoef/cvec/issues</URL>.

</Section>

<!-- ############################################################ -->

</Chapter>

<!--
  This program is free software; you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation; version 2 of the License.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with this program; if not, write to the Free Software
  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-->

