## From the Preface of GAP 4.1

GAP stands for **Groups, Algorithms and Programming**. The name was chosen to reflect the aim of the system, which is introduced in this tutorial manual. Since that choice, the system has become somewhat broader, and you will also find information about algorithms and programming for other algebraic structures, such as semigroups and algebras.

There are three further manuals in addition to this one: the "Reference Manual" containing detailed documentation of the mathematical functionality of GAP; "Extending GAP" containing some tutorial material on various aspects of GAP programming; and "Programming in GAP 4" containing detailed documentation of various aspects of the system of interest mainly to programmers.

GAP is a **free**, **open** and **extensible** software package for computation in discrete abstract algebra. The terms "free" and "open" describe the conditions under which the system is distributed -- in brief, it is **free of charge** (except possibly for the immediate costs of delivering it to you), you are **free to pass it on** within certain limits, and all of the workings of the system are **open for you to examine and change**. Details of these conditions can be found in the reference manual in chapter "Copyright Notice". The system is "extensible" in that you can write your own programs in the GAP language, and use them in just the same way as the programs which form part of the system (the "library"). Indeed, we actively support the contribution, refereeing and distribution of extensions to the system, in the form of "share packages". Further details of this can be found in chapter "Share Packages" in the reference manual, and on our World Wide Web site.

Development of GAP began at Lehrstuhl D für Mathematik, RWTH-Aachen, under the leadership of Prof. Joachim Neubüser in 1985. Version 2.4 was released in 1988 and version 3.1 in 1992. The final full release of GAP 3, version 3.4, was made in 1994. A more detailed account of the motivation and development of these versions of GAP is contained in section "From the Preface for GAP 3.4, June 1994", below.

Since then, there have been two dramatic transitions in the GAP project. Firstly, in 1997, Prof. Neubüser retired, and overall coordination of GAP development, now very much an international effort, was transferred to St Andrews. Secondly a complete internal redesign and almost complete rewrite of the system, which was already in progress in Aachen, has been completed. Following five, increasingly usable, beta-test releases, version 4.1 is the first version of the rewritten system to be released without qualification for general use.

For those readers who have used an earlier version of GAP, an overview of the changes from the beta-test releases and from GAP 3 is given in section "Changes from Earlier Versions" below.

The system that you are getting now consists of four parts.

- A
**kernel**, written in C, which provides the user with- automatic dynamic storage management, which the user needn't bother about in his programming;
- a set of time-critical basic functions, e.g. "arithmetic", operations for integers, finite field elements, permutations and words, as well as natural operations for lists and records;
- an interpreter for the GAP language, an untyped imperative programming language with functions as first class objects and some extra built-in data types such as permutations and finite field elements.
- support for the time critical parts of the new GAP4 method selection system.
- a small set of system functions allowing the GAP programmer to handle files and execute external programs in a uniform way, regardless of the particular operating system in use.
- a set of programming tools for testing, debugging, and timing algorithms.

- A much larger
**library of GAP functions**that implement algebraic and other algorithms. Since this is written entirely in the GAP language, the GAP language is both the main implementation language and the user language of the system. Therefore the user can as easily as the original programmers investigate and vary algorithms of the library and add new ones to it, first for own use and eventually for the benefit of all GAP users.

- A
**library of group theoretical data**which already contains various libraries of groups, large libraries of ordinary and Brauer character tables, including all of the Cambridge**Atlas of Finite Groups**and**Atlas of Brauer Characters**, a**library of tables of marks**, a**library of small groups**(containing all groups of order at most 1000, except those of order 512) and others.

- The
**documentation**. This is available as files that can either be used for on-line help or processed for printing with \TeX\ or into HTML for viewing with a browser such as 'netscape'.

Together with the system we distribute **GAP share packages**, which are separate packages which have been written by various groups of people and remain under their responsibility. Some of these packages are written completely in the GAP language, others totally or in part in C (or even other languages). However the functions in these packages can be called directly from GAP and results are returned to GAP.

We operate a refereeing system for such packages, both to ensure the quality of the software we distribute, and to provide recognition for the authors. A number of GAP 4 share packages have already been accepted. Some others that have been submitted for review are available as "preprints". More information can be found on our World Wide Web site, see section "Further Information about GAP".

** . . .** [*We omit a copy of the acknowledgements from the preface of GAP 4.B.1.*]

Before going on to mention more recent contributions, I must express my heartfelt thanks, and I am sure, that of the wider community of GAP developers and users for the immense work that Joachim Neubüser himself has put into GAP over many years. The system would never have existed, let alone grown and prospered as it has, without his clear vision of what he wanted it to become, his ceaseless vigilance for opportunities for development, his championing of the cause of computation in group theory, his high standards which would not admit "merely adequate" solutions and his constant encouragement of everyone working on and with the system. We are all the richer for his efforts.

Many people have contributed to GAP development over the last two years. Alexander Hulpke has been a tower of strength, coordinating the work on the library, finding subtle bugs in code whose authors were no longer contactable, supporting the beta testers and, most recently coordinating the process of stabilization and debugging leading up to this release. Thomas Breuer in Aachen has remained our "conscience", pointing out to us when we were misusing GAP 4 concepts and so storing up trouble for later. He has also done an enormous amount of work on the support for representation theory in GAP. Others I would like to point out here include Bettina Eick, Volkmar Felsch, Willem de Graaf, Werner Nickel and Andrew Solomon. I should like to thank all of these people, and all the other contributors whom I have not mentioned explicitly for their efforts, their cheerfulness and their perseverance. I should also like to thank all the GAP4 beta-testers, package developers, manual proof readers and others who have given us extremely valuable and positive feedback.

GAP development in St Andrews has been financially supported by the Engineering and Physical Sciences Research Council, the Leverhulme Trust, the European Commission (ESPRIT programme), the Royal Society of Edinburgh and the British Council, to all of whom we are very grateful. Development also takes place at other centres with support from other funding bodies.

It finally remains for me to wish you all pleasure and success in using GAP, and to invite your constructive comment and criticism.

St Andrews 26 July 1999\hfill Steve Linton

### Changes from Earlier Versions

The main changes from the final beta-test release GAP 4 beta 5 are in the documentation and in performance, both of which are much improved and in the fixing of many bugs. The installation process has also been improved a little, and there are some new algorithms, especially in the areas of semigroups and finitely-presented groups. As far as we know any programs that worked with 4 beta 5 should still work in GAP 4.1.

The changes since the final release of GAP 3 (version 3.4.4) are much more wide-ranging. The general philosophy of the changes is two-fold. Firstly, many assumptions in the design of GAP 3 revealed its authors' primary interest in group theory, and indeed in finite group theory. Although much of the GAP 4 library is concerned with groups, the basic design now allows extension to other algebraic structures, as witnessed by the inclusion of substantial bodies of algorithms for computation with semigroups and Lie algebras. Secondly, as the scale of the system, and the number of people using and contributing to it has grown, some aspects of the underlying system have proved to be restricting, and these have been improved as part of comprehensive re-engineering of the system. This has included the new method selection system, which underpins the library, and a new, much more flexible, share package interface.

Details of these changes can be found in chapter "Migrating to GAP 4" of this manual. It is perhaps worth mentioning a few points here.

Firstly, much remains unchanged, from the perspective of the mathematical user:

- The syntax of that part of the GAP language that most users need for investigating mathematical problems.
- The great majority of function names.
- Data libraries and the access to them.

A number of visible aspects have changed:

- Some function names that need finer specifications now that there are more structures available in GAP.
- The access to information already obtained about a mathematical structure. In GAP 3 such information about a group could be looked up by directly inspecting the group record, whereas in GAP 4 functions must be used to access such information.

Behind the scenes, much has changed:

- A new kernel, with improvements in memory management and in the language interpreter, as well as new features such as saving of workspaces and the possibility of compilation of GAP code into C.
- A new structure to the library, based upon a new type and method selection system, which is able to support a broader range of algebraic computation and to make the structure of the library simpler and more modular.
- New and faster algorithms in many mathematical areas.
- Data structures and algorithms for new mathematical objects, such as algebras and semigroups.
- A new and more flexible structure for the GAP installation and documentation, which means, for example, that a share package and its documentation can be installed and be fully usable without any changes to the GAP system.

A very few features of GAP 3 are not yet available in GAP 4.

- Only a few of the GAP 3 share packages have yet been converted for use with GAP 4 (although several new packages are available only in GAP 4).
- The Galois group determination algorithms which were implemented in the GAP 3 library are not present in GAP 4.
- The algorithms for the factorization of polynomials over algebraic number fields which were implemented in the GAP 3 library are not present in GAP 4.
- The library of crystallographic groups which was present in GAP 3 is now part of a share package 'crystcat', which has been submitted for refereeing and is distributed with this release as a "preprint".
- The library of irreducible maximal finite integral matrix groups is not yet available.
- The p-quotient and soluble quotient algorithms are implemented in the GAP 4 library, but those implementations are not yet described in the documentation. If you have a pressing need to use them, please contact 'gap-trouble'.

** . . .** [*We omit a copy of a part of the preface of GAP 3.4.4.*]