GAP | |
---|---|
![]() | |
Developer(s) | |
Initial release | 1988 |
Stable release | |
Repository | |
Written in | C |
Operating system | Cross-platform |
Type | Computer algebra system |
License | GNU General Public License |
Website | www |
GAP (Groups,Algorithms andProgramming) is anopen sourcecomputer algebra system for computationaldiscrete algebra with particular emphasis oncomputational group theory.
GAP was developed at Lehrstuhl D für Mathematik (LDFM),Rheinisch-Westfälische Technische Hochschule Aachen,Germany from1986 to1997. After the retirement ofJoachim Neubüser from the chair of LDFM, the development and maintenance of GAP was coordinated by the School of Mathematical and Computational Sciences at theUniversity of St Andrews,Scotland.[2] In the summer of 2005 coordination was transferred to an equal partnership of four 'GAP Centres', located at the University of St Andrews, RWTH Aachen,Technische Universität Braunschweig, andColorado State University atFort Collins; in April 2020, a fifth GAP Centre located at theTU Kaiserslautern was added.[3]
GAP contains aprocedural programming language and a large collection of functions to create and manipulate various mathematical objects. It supports integers and rational numbers of arbitrary size, memory permitting.Finite groups can be defined asgroups of permutations and it is also possible to definefinitely presented groups by specifying generators and relations. Several databases of important finite groups are included. GAP also allows to work withmatrices and withfinite fields (which are represented usingConway polynomials).Rings,modules andLie algebras are also supported.
GAP and its sources, including packages (sets of user contributed programs), data library (including alist of small groups) and the manual, are distributed freely, subject to "copyleft" conditions. GAP runs on anyUnix system, underWindows, and onMac systems. The standard distribution requires about 300 MB (about 400 MB if all the packages are loaded).
The user contributed packages are an important feature of the system, adding a great deal of functionality. GAP offers package authors the opportunity to submit these packages for a process ofpeer review, hopefully improving the quality of the final packages, and providing recognition akin to an academic publication for their authors. As of March 2021[update], there are 151 packages distributed with GAP, of which approximately 71 have been through this process.
An interface is available for using theSINGULAR computer algebra system from within GAP. GAP is also included in the mathematical software systemSageMath.
gap>G:=SmallGroup(8,1);# Set G to be the 1st group (in GAP catalogue) of order 8.<pc group of size 8 with 3 generators>gap>i:=IsomorphismPermGroup(G);# Find an isomorphism from G to a group of permutations.<action isomorphism>gap>Image(i,G);# Generators for the image of G under i - written as products of disjoint cyclic permutations.Group([ (1,5,3,7,2,6,4,8), (1,3,2,4)(5,7,6,8), (1,2)(3,4)(5,6)(7,8) ])gap>Elements(Image(i,G));# All the elements of im G.[ (), (1,2)(3,4)(5,6)(7,8), (1,3,2,4)(5,7,6,8), (1,4,2,3)(5,8,6,7), (1,5,3,7,2,6,4,8), (1,6,3,8,2,5,4,7), (1,7,4,5,2,8,3,6), (1,8,4,6,2,7,3,5) ]
gap># test consistency of EuclideanDegree, EuclideanQuotient, EuclideanRemainder,gap># and QuotientRemainder for some ring and elements of itgap>checkEuclideanRing:=>function(R,colls...)>localcoll1,coll2,a,b,deg_b,deg_r,q,r,qr;>ifLength(colls)>=1thencoll1:=colls[1];>elifSize(R)<=100thencoll1:=R;>elsecoll1:=List([1..100],i->Random(R));>fi;>ifLength(colls)>=2thencoll2:=colls[2];>elifSize(R)<=100thencoll2:=R;>elsecoll2:=List([1..100],i->Random(R));>fi;>forbincoll1do>ifIsZero(b)thencontinue;fi;>deg_b:=EuclideanDegree(R,b);>foraincoll2do>q:=EuclideanQuotient(R,a,b);Assert(0,qinR);>r:=EuclideanRemainder(R,a,b);Assert(0,rinR);>ifa<>q*b+rthenError("a <> q*b + r for ",[R,a,b]);fi;>deg_r:=EuclideanDegree(R,r);>ifnotIsZero(r)anddeg_r>=deg_bthenError("Euclidean degree did not decrease for ",[R,a,b]);fi;>qr:=QuotientRemainder(R,a,b);>ifqr<>[q,r]thenError("QuotientRemainder inconsistent for ",[R,a,b]);fi;>od;>od;>returntrue;>end;;gap># rings in characteristic 0gap>checkEuclideanRing(Integers,[-100..100],[-100..100]);truegap>checkEuclideanRing(Rationals);truegap>checkEuclideanRing(GaussianIntegers);truegap>checkEuclideanRing(GaussianRationals);truegap># finite fieldsgap>ForAll(Filtered([2..50],IsPrimePowerInt),q->checkEuclideanRing(GF(q)));truegap># ZmodnZgap>ForAll([1..50],m->checkEuclideanRing(Integersmodm));truegap>checkEuclideanRing(Integersmod((2*3*5)^2));truegap>checkEuclideanRing(Integersmod((2*3*5)^3));truegap>checkEuclideanRing(Integersmod((2*3*5*7)^2));truegap>checkEuclideanRing(Integersmod((2*3*5*7)^3));true