Next: Voordelen Up: Computeralgebra:wiskunde klaar om ingezet Previous: Visualisatie

Computeralgebra-systemen

De eerste systemen die werden ontwikkeld in de zestiger jaren waren met name gericht op het uitvoeren van zeer grote berekeningen, die voortkwamen uit specifieke terreinen van de natuurkunde. Vanwege die specifieke gerichtheid noemen we dit soort systemen ``special purpose systems''. Voorbeelden hiervan zijn CAMAL (hemelmechanica), SHEEP (relativiteitstheorie) en Schoonschip (hoge energie fysica). Ook de eerste versie van REDUCE is in die tijd ontwikkeld door A. Hearn als ``special purpose system'' voor berekeningen aan Feynman-diagrammen, een onderwerp uit de hoge energie fysica.

De ontwikkeling van special purpose systemen heeft sindsdien niet meer stilgestaan. Voorbeelden van na 1985 zijn GAP en Cayley (groepentheorie), PARI, SIMATH, KASH en LiDIA (getaltheorie), Macaulay en Singular (algebraische meetkunde), CoCoA (commutative algebra), LiE (Lietheorie), en nog veel meer.

Met een vereenvoudiging van de historie kunnen we drie golven van computeralgebra-systemen onderkennen. Na de eerste golf van special purpose systemen, en met de mogelijkheden als hierboven geschetst, komt er een golf van ``general purpose systemen''. Deze systemen voorzien hun gebruikers van een rijk arsenaal aan datastructuren en wiskundige functies, daarmee proberend zoveel mogelijk verschillende computationele gebieden te bestrijken. Een general purpose systeem wordt daarom wel eens vergeleken met Zwitsers zakmes: voor elke klus wordt gereedschap geboden. En mocht dit nog niet toereikend zijn, dan kan een gebruiker een general purpose systeem in bijna alle gevallen als programmeertaal gebruiken om gewenste algoritmen in te implementeren.

We geven een lijstje met namen en een korte beschrijving van de belangrijkste general purpose systemen in volgorde van beschikbaarstelling (waarbij gezegd dat alle genoemde systemen nog verder ontwikkeld worden en regelmatig in nieuwe versies uitkomen). Voor een uitgebreid overzicht van computeralgebra-systemen, zie [1], of raadpleeg het electronische informatiesysteem CAIN (www.can.nl).

REDUCE
is van origine bestemd voor hoge energie fysica. Echter bleek het al snel ook daarbuiten bruikbaar te zijn. Het biedt een programmeertaal met twee modi: ``algebraic mode'' en ``LISP mode''. Met name de tweede maakt dat REDUCE een zeer open systeem is en dat zeer efficiënt en flexibel aan de wensen van een gebruiker aan te passen is. Het heeft een uitgebreide bibliotheek van programma's en functies, waaronder faciliteiten voor het genereren van Fortran en C-code. De gebruikersinterface doet wat ouderwets aan, mede door het ontbreken van grafische mogelijkheden.

Macsyma
verscheen in 1971. Het is gebaseerd op LISP en ontwikkeld op M.I.T. Het heeft een uitgebreide bibliotheek van functies, en algoritmen. Macsyma kan de gebruiker vragen stellen als het meer gegevens nodig heeft voor het bepalen van een antwoord (zie het voorbeeld verderop). In 1992 is het na jaren van stilte een tweede leven begonnen: een versie voor MS-Windows is gelanceerd door een nieuw bedrijf, Macsyma Inc.

Maple
is ontstaan uit het ``Maple Project'' uit de beginjaren '80 met o.a. G. Gonnet en K. Geddes aan de Universiteit van Waterloo (Canada). In 1992 is er een bedrijf, Waterloo Maple Software, voor de commercialisatie opgericht. Maple is ontworpen met een kleine kern geschreven in C, die de basale operaties uitvoert. De meeste wiskundige functies zijn geschreven in de taal Maple, en deze Maple-code is toegankelijk voor de gebruiker.

Mathematica
is het tweede systeem dat door S. Wolfram is ontworpen. Het eerste, SMP, heeft veel overeenkomsten met het symbolische deel van Mathematica, maar is nooit echt aangeslagen. Van Mathematica kan dit niet gezegd worden: het zonder twijfel het meest gebruikte computeralgebra-systeem, waarover de meeste boeken en artikelen verschenen zijn, en waarvoor door gebruikers de meeste code aangeleverd wordt op de Web-site http://www.mathsource.com. Voor dit succes zijn diverse redenen aan te voeren. Bij de introductie in 1988 van Mathematica stonden twee zaken voorop: een goede integratie van symbolische, numerieke en grafische mogelijkheden, en een goede marketing. Met Mathematica kunnen ``notebook''-documenten gemaakt worden, waarin op natuurlijke wijze tekst, grafieken, invoer en uitvoer gentegreerd zijn. Deze aanpak was nieuw in de wereld van computeralgebraci en zette de deur voor gebruik van computeralgebra door niet-ingewijden wijd open.

Derive
is ontwikkeld door D. Stoutemyer en A. Rich, en in 1988 als opvolger van MuMath (uit 1980) op de markt gebracht. Opmerkelijk in vergelijking met de andere systemen is de beperkte omvang van het pakket, en het gemak waarmee een gebruiker via menu's aan de slag kan. Derive is op dit moment alleen voor het MS-DOS platform beschikbaar, een Windows versie is in de maak. De programmeertaal van Derive biedt evenwel een bescheiden functionaliteit.

FORM
is een pakket dat speciaal ontworpen is om met gigantisch grote formules efficiënt te kunnen manipuleren. Denk hierbij aan formules die niet niet in hun geheel in het werkgeheugen van de computer passen. Dit beperkt de mogelijke wiskundige instructies aanzienlijk; verwacht geen factorisaties van veeltermen en dergelijke. Toch is FORM niet alleen in het vakgebied waarvoor het primair ontwikkeld is, nl. hoge energie fysica, de kraker van grote formules.

MuPAD
is een pakket dat qua werking op Maple lijkt maar minder wiskunde ingebouwd heeft. Daar staat tegenover dat het ontworpen is voor parallel rekenen, dat je algoritmen voor algemene rekendomeinen (bv. ringen) kunt definiëren, en dat het voor niet-commercieel gebruik gratis beschikbaar gesteld wordt.

Magma
is de opvolger van Cayley, maar is qua functionaliteit uitgegroeid tot een general purpose programma rondom de algebraische begrippen van structuren (groepen, ringen, modulen, designs, codes, grafen, etc.) en morfismen. Het doel van de makers aan de Universiteit van Sidney is om berekeningen in algebra, getaltheorie, meetkunde, algebraische combinatoriek, groepentheorie, e.d. te ondersteunen.

Axiom
is de naam die NAG in 1992 gegeven heeft aan het pakket dat onder de naam Scratchpad door een onderzoeksteam bij IBM Yorktown Heights is ontwikkeld. In tegenstelling tot de andere pakketten werkt de object-georiënteerde programmeertaal met ``typen'', zoals Integer en UnivariatePolynomial. Hiermee is het mogelijk om goed met mathematisch structureren te werken, en biedt dit systeem veel mogelijkheden voor werkelijke computeralgebra en niet alleen symbolisch manipuleren met bits-and-bytes. Er zijn voortreffelijke grafische faciliteiten in Axiom, een Hypercard-gebaseerd hulpsysteem en men vindt er de beste implementaties van het Gröbner algoritme en het Risch algoritme. Ten nadele van Axiom spreekt de omvang van het pakket en de overhead die het type-systeem met zich meebrengt.

Al deze systemen bieden behalve wiskundige functies, ook een programmeertaal. Zo'n taal kunnen we zien als een high level mathematics programming language. Programmeren in een dergelijke taal is vaak relatief eenvoudig, veel programma's bestaan slechts uit één regel. Bijvoorbeeld, in Mathematica kunnen op de volgende manier honderd random floating-point getallen uniform gedistribueerd in het interval gemaakt worden en beginned bij 0 cumulatief opgeteld worden:


In[1]:= FoldList[Plus, 0, Table[Random[Real,{-1,1}],{100}]];
Het resultaat kan gemakkelijk in een grafiek (zie Figuur 3) weergegeven worden:

In[2]:= ListPlot[%, PlotJoined->True];

Echter kan efficiëntie wel eens tegen vallen, als het vergeleken wordt met een taal op een lager niveau, zoals C of FORTRAN. Voordeel van pakketen zoals Axiom, Maple en Mathematica is wel dat allerlei programmeerstijlen (procedureel, functioneel, regelgebaseeerd, object-georiënteerd) binnen één omgeving aanwezig zijn. Je kunt dus veelal dié stijl kiezen die het best past bij het wiskundig probleem of waarin je het beste thuis bent.

Ter illustratie van verschillende programmeerstijlen in één computeralgebra-systeem laten we verschillende Mathematica manieren zien om gegeven een lijst en gegeven een element alle plekken waar dit element in de lijst voor komt te verwijderen.

regelgebaseerd (iteratief)

In[3]:= removeAll1[list_, elt_] := 
           list //. removeRule[elt]
In[4]:= removeRule[elt_] := {b___, elt, e___} -> {b, e}
In[5]:= removeAll1[{x, a, b, x, c}, x]

Out[5]= {a, b, c}

regelgebaseerd (recursief)

In[6]:= removeAll2[{}, elt_] := {}
In[7]:= removeAll2[{elt_, rest___}, elt_] :=
            removeAll2[{rest}, elt]
In[8]:= removeAll2[{other_, rest___}, elt_]:=
            Prepend[
                    removeAll2[{rest}, elt],
                    other
            ]
In[9]:= removeAll2[{x, a, b, x, c}, x]

Out[9]= {a, b, c}

functioneel

In[10]:= removeAll3[list_, elt_] :=
            Select[list, Function[x,x=!=elt]]
In[11]:= removeAll3[{x, a, b, x, c}, x]

Out[11]= {a, b, c}

procedureel

In[12]:= removeAll4[list_, elt_] :=
         (templist = {};
          Do[
            If[
                   list[[i]]=!=elt,
                   AppendTo[templist, list[[i]]]
            ],
            {i, 1, Length[list]}
          ];
          templist
          )
In[13]:= removeAll4[{x, a, b, x, c}, x]

Out[13]= {a, b, c}

Ingebouwde routines

In[14]:= Flatten[{x, a, b, x, c} /. x->{}]

Out[14]= {a, b, c}

Geen wonder dat computeralgebra-systemen ook veel ingezet worden voor het snel maken van prototypes van computercode en voor het snel uittesten van nieuwe algoritmen.




Next: Voordelen Up: Computeralgebra:wiskunde klaar om ingezet Previous: Visualisatie