- major improvements and additions:
- Improved old documentation and added many new descriptions of functions.
- Greatly improved the debugger. In particular, the debugger will put you directly onto the line of the program with an error, and allows the user to execute a given number of steps of the program (see step) and to conveniently display and change values of variables as they evolve.
- Improved the making of packages: made it much easier for a user to create a complete package, including documentation.
- Improved the handling of symmetric algebras and Rees algebras; improved implementation of things like analytic spread.
- Improved handling of finite fields: GF now uses Conway polynomials when possible. Maps between Galois fields made with them are now easy to produce with
`map(E,F)`. (Note: actually, the user must load the package manually.) - The function hilbertFunction is now faster at computing power series expansions.
- Homomorphisms (maps) of modules over different rings with respect to a ring homomorphism between them are now supported. Composition, coimage (replacing pushForward1), and kernel work. An option has been added to basis to ask it to return such a homomorphism. See map(Module,Module,RingMap,Matrix), map(Module,Nothing,RingMap,Matrix), and map(Module,RingMap).
- The total Ext functor now accepts multigraded modules, see Ext(Module,Module).
- Macaulay2 now incorporates pari, a free library for computing in number theory. It is used by factor(ZZ), factor(QQ), isPseudoprime(ZZ), and isPrime(ZZ).
- new packages, included:
- BGG -- Bernstein-Gel'fand-Gel'fand correspondence
- BoijSoederberg -- Betti diagram routines
- Bruns -- produces an ideal with three generators whose 2nd syzygy module is isomorphic to a given module
- ConwayPolynomials -- database of Conway polynomials for use with GF
- EdgeIdeals -- A package for working with the edge ideals of (hyper)graphs
- FourTiTwo -- Interface for 4ti2
- gfanInterface -- a Macaulay2 interface to gfan
- LocalRings -- Localizing polynomial rings at a prime ideal
- Polyhedra -- for computations with convex polyhedra, cones, and fans
- Polymake -- a package for interfacing with polymake
- SimpleDoc -- simpler documentation for functions and methods
- StatePolytope -- computes state polytopes of ideals
- SymmetricPolynomials -- the algebra of symmetric polynomials
- Text -- documentation and hypertext

- downloadable packages:
*Kronecker*, Kronecker normal form of a matrix pencil, by Edward Carter*LDL*, the`LDL'`factorization of a positive semidefinite matrix, by Helfried Peyrl

- improved packages:
- HyperplaneArrangements -- hyperplane arrangements
- ReesAlgebra -- Compute Rees algebras and their invariants
- PieriMaps -- Methods for computing Pieri inclusions
- Schubert2 -- computation in intersection theory
- SchurFunctors -- for computing Schur functors

- new functions:
- groupID -- the process group identifier
- heft -- heft vector of ring, module, graded module, or resolution
- insert -- copy a list, inserting an element
- inversePermutation -- inverse permutation
- isSorted -- whether a list is sorted
- multidegree -- multidegree
- runLengthEncode -- run length encoding
- selectVariables -- make a subring of a polynomial ring generated by selected variables
- step -- step by single lines in the debugger
- switch -- copy a list, switching two elements

- new methods for old functions:
- all(ZZ,Function) -- whether all elements of a list satisfy a specified condition
- any(ZZ,Function) -- whether any elements of a list satisfy a specified condition
- degreesMonoid(List) -- get the monoid of degrees
- degreesRing(GeneralOrderedMonoid) -- the ring of degrees
- degreesRing(List) -- the ring of degrees
- export(String) -- package item: export functions
- findFiles(List) -- find files recursively
- flattenRing(Ideal) -- write a ring as a (quotient) of a polynomial ring over ZZ or a prime field
- gcd(RingElement,ZZ) -- greatest common divisor
- gcd(ZZ,RingElement) -- greatest common divisor
- indices(Matrix) -- indices of variables occurring in a polynomial
- map(Module,Module,RingMap,Matrix) -- homomorphism of modules over different rings
- map(Module,Nothing,RingMap,Matrix) -- homomorphism of modules over different rings
- map(Module,RingMap) -- homomorphism of modules over different rings
- map(Module,ZZ,ZZ) -- construct the map induced by multiplication by a ring element on the generators
- max(GradedModule)
- min(GradedModule)
- part(InfiniteNumber,InfiniteNumber,VisibleList,RingElement) -- select terms of a polynomial by degree or weight
- part(InfiniteNumber,InfiniteNumber,RingElement) -- select terms of a polynomial by degree or weight
- part(InfiniteNumber,ZZ,VisibleList,RingElement) -- select terms of a polynomial by degree or weight
- part(InfiniteNumber,ZZ,RingElement) -- select terms of a polynomial by degree or weight
- part(Nothing,Nothing,VisibleList,RingElement) -- select terms of a polynomial by degree or weight
- part(Nothing,Nothing,RingElement) -- select terms of a polynomial by degree or weight
- part(Nothing,ZZ,VisibleList,RingElement) -- select terms of a polynomial by degree or weight
- part(Nothing,ZZ,RingElement) -- select terms of a polynomial by degree or weight
- part(ZZ,InfiniteNumber,VisibleList,RingElement) -- select terms of a polynomial by degree or weight
- part(ZZ,InfiniteNumber,RingElement) -- select terms of a polynomial by degree or weight
- part(ZZ,VisibleList,RingElement) -- select terms of a polynomial by degree or weight
- part(ZZ,Nothing,VisibleList,RingElement) -- select terms of a polynomial by degree or weight
- part(ZZ,Nothing,RingElement) -- select terms of a polynomial by degree or weight
- part(ZZ,ZZ,VisibleList,RingElement) -- select terms of a polynomial by degree or weight
- part(ZZ,ZZ,RingElement) -- select terms of a polynomial by degree or weight
- quotientRemainder(Number,RingElement) -- quotient and remainder
- quotientRemainder(RingElement,Number) -- quotient and remainder
- quotientRemainder(RingElement,RingElement) -- quotient and remainder
- scanLines(Function,List) -- apply a function to each line of a file
- support(Matrix) -- list of variables occurring in a polynomial or matrix
- Sequence <- Thing -- assignment with left side evaluated
- Number _ Ring -- promote to another ring
- GradedModuleMap | GradedModuleMap -- a binary operator, often used for horizontal concatenation
- symmetricAlgebra(Matrix) -- the symmetric algebra of a module
- symmetricAlgebra(Nothing,Nothing,Matrix) -- the symmetric algebra of a module
- symmetricAlgebra(Nothing,Ring,Matrix) -- the symmetric algebra of a module
- symmetricAlgebra(Ring,Nothing,Matrix) -- the symmetric algebra of a module
- symmetricAlgebra(Ring,Ring,Matrix) -- the symmetric algebra of a module
- RingElement ^ Ring -- lift to another ring
- Number ^ Ring -- lift to another ring
- RingElement ^ RingFamily -- lift to another ring
- Number ^ RingFamily -- lift to another ring
- Constant ^ Ring -- lift to another ring
- Constant ^ RingFamily -- lift to another ring

- new variables:
- currentLayout -- relative locations of Macaulay2 files
- prefixPath -- absolute locations of Macaulay2 files
- lastMatch -- regular expression matching

- new symbols:
- FlatMonoid
- Join -- name for an optional argument
- Reduce -- name for an optional argument
- Result -- name for an optional argument
- RunExamples -- name for an optional argument
- SeparateExec -- name for an optional argument
- SourceRing -- name for an optional argument

- new optional arguments to functions:
- GF(..., SizeLimit => ...) -- make a finite field
- basis(..., SourceRing => ...) -- basis or generating set of all or part of a ring, ideal or module
- check(..., UserMode => ...) -- perform tests of a package
- fillMatrix(..., Height => ...) -- fill a mutable matrix with random numbers
- flattenRing(..., Result => ...) -- write a ring as a (quotient) of a polynomial ring over ZZ or a prime field
- hilbertSeries(..., Reduce => ...) -- reduce the Hilbert series
- installPackage(..., CacheExampleOutput => ...) -- load and install a package and its documentation
- installPackage(..., RunExamples => ...) -- load and install a package and its documentation
- installPackage(..., SeparateExec => ...) -- load and install a package and its documentation
- installPackage(..., UserMode => ...) -- load and install a package and its documentation
- installPackage(..., Verbose => ...) -- load and install a package and its documentation
- lift(..., Verify => ...) -- lift to another ring
- map(..., DegreeLift => ...) -- make a ring map
- monoid(..., DegreeLift => ...) -- make or retrieve a monoid
- monoid(..., Join => ...) -- make or retrieve a monoid
- newPackage(..., CacheExampleOutput => ...) -- package item: start a new package
- newRing(..., DegreeLift => ...) -- make a copy of a ring, with some features changed
- newRing(..., DegreeMap => ...) -- make a copy of a ring, with some features changed
- newRing(..., Join => ...) -- make a copy of a ring, with some features changed
- symmetricAlgebra(..., DegreeLift => ...) -- the symmetric algebra of a module
- symmetricAlgebra(..., DegreeMap => ...) -- the symmetric algebra of a module
- symmetricAlgebra(..., Join => ...) -- the symmetric algebra of a module
- tensor(..., DegreeLift => ...) -- tensor product
- tensor(..., DegreeMap => ...) -- tensor product
- tensor(..., Join => ...) -- tensor product

- functionality removed or changed:
- Comparison of rings and ring maps with == is no longer supported. Old code can be fixed by changing the comparison operator to ===.
- The variable
`randomHeight`has been removed, replaced by fillMatrix(..., Height => ...) and random(..., Height => ...). - The function betti now uses the dot product of the heft vector of the ring with the (multi)degrees of the basis elements in a chain complex in its display. See heft vectors.
- The behavior of return in the debugger has changed: it now stops in the debugger at the next available opportunity.
- The function minors has been altered so the ideal of
`n`by`n`minors that it provides for negative values of`n`is the unit ideal. - The optional argument to monoid and to polynomial ring creation named
`ConstantCoefficients`has been removed. Specifying`ConstantCoefficients=>false`can be accomplished by specifying`Join=>false`. See Join.

- functionality added or improved:
- Filenames starting with
`~/`will have the tilde replaced by the home directory. - The
*D*language, in which the Macaulay2 interpreter is written, is now type-safe - During compilation of Macaulay2, as much of the computation as possible is now done to satisfy the make-target
`all`, with the resulting files placed in a staging area, ready for quickly satisfying the make-target`install`. - During compilation of Macaulay2, it is now possible to keep the architecture independent files in a separate directory tree, saving time if versions for multiple architectures are to be built. Including those files in a source tar file will allow the distribution of a
*fat*source tar file, speeding up compilation. - Pressing the RET key in the Macaulay2 interaction buffer on a line containing a source file name and line number will open up the source file at that position in a new buffer. This allows error messages to be treated with dispatch.
- The behavior of setup has changed, in that the commands that set the paths are now placed in separate files in the home directory of the user, and those files are sourced only if they are present. That enables the user to continue to share the usual init files on multiple machines, even though Macaulay2 may be installed in various different locations.
- A new division algorithm has been implemented in rings with monomials less than 1, e.g., where the monomials can involve negative exponents, and hence do not form a well-ordered set. See division in polynomial rings with monomials less than 1.
- A bug in irreducibleCharacteristicSeries, upon with minimalPrimes depends, was fixed. Now the new ring supporting the characteristic series will have variables with the same names and degrees, but the ordering of the variables and the monomial ordering will be different. This ensures that homogeneity will be preserved. Also, for convenience, the routine now returns a sequence, instead of a list, suitable for immediate parallel assignment.
- The function part has been altered so that for multigraded rings, it does not use the first component of the degree vector. New functionality has been added, and the method for
`part(Sequence,RingElement)`has been removed. - Heft vectors are now automatically computed, see heft vectors. Users who specify the Heft option explicitly may be able to avoid that now.
- The description of a ring provided by describe is now abbreviated by making use of run length encoding.
- Browsers started by viewHelp are now run in a separate process group so they don't die when Macaulay2 terminates.
- The function prune and decompose are no longer exact synonyms of minimalPresentation and minimalPrimes, respectively.
- The function get has been fixed so it returns an error message if the process associated with the pipe has died.
- The function searchPath now does what the documentation said it would do.
- The output operation
`s<<x`, when`s`is a string, has been changed so that if a file with filename`s`is already open, that file will be used instead of opening a new file with the same name, erasing the data already written to the file. - Tensor product of a module with a ring has been modified so it will make a ring map between the two rings that is derived from the names of the variables.
- The degrees in symmetric algebras have been corrected.
- The default for polynomial rings over polynomial rings is now to join the degree vectors of monomials in the base to the degree vectors of the top level monoid, usually resulting in a multigraded ring. For example, QQ[x][y] is now bigraded.
- Inverting a noninvertible matrix results in an error message now.
- The function export, given a string (rather than a symbol) will now make a new symbol with that name, even if a symbol with the same name already exists in another visible package.
- The function basis will now check finite dimensionality in advance, to avoid running out of memory.
- Functions and types associated with hypertext and documentation have been isolated in a new package called Text, which gets loaded automatically by beginDocumentation.
`errorCode`has been renamed to current- The file layout system, as described by Layout, formerly called
`LAYOUT`, now supports separation of architecture independent files from architecture dependent files. - The cross reference hyperlinks in the info form of the documentation have been improved, but we recommend reading it in emacs with
`M-x info`, configuring the emacs variable`Info-hide-note-references`so its value is`hide`. See reading the documentation. - Now the function needs will reload the requested file not only if the file has not been loaded before, but also if it has changed since the previous time.
- It is now possible to represent a series of three or more slashes within a string delimited by /// by typing a longer series.
- The conversion of TEX to html has been improved and documented, see html(TEX).
- Unicode, encoded in
`utf-8`format, is supported in documentation pages, both in html form and in emacs info form: 你好. - When an error occurs within a string being evaluated with value, the appropriates lines of the string will be displayed if the debugger is entered.
- A new method for substring accepts a pair of integers as first argument of the sort returned by regex.
- Regular expression handling, by the functions regex, match, replace, and select, is now much faster because strings are not copied.
- The function regex now has a form that restricts the range of the search.
- Macaulay2 now incorporates frobby, a free library for computing the Alexander dual of a monomial ideal (see dual(MonomialIdeal)).
- The function select will now give an error message if the function provided to it returns something neither true nor false.
- The quotient and remainder for two ring elements can now be obtained simultaneously, saving time. See quotientRemainder(RingElement,RingElement).
- The binary representation of a real number is now available using promote(RR,type of QQ). The code for lift(RR,type of QQ) has been tightened up so a rational number is provided that provides exactly the same real number when promoted.
- The emacs commands
`M-x M2`, bound to`f12`, and`M2-send-to-program`, bound to`f11`, have some new capability. With prefix argument`C-u C-u`to`M-x M2`, the tag from which the buffer name is constructed (by prepending and appending asterisks) can be entered in the minibuffer. With a prefix argument to`M2-send-to-program`, the name of the buffer to which this and future uses of the command (in this buffer) should be sent can be entered, with history. - The function symmetricAlgebra is now functorial.

- Filenames starting with