> <\body> >|<\doc-subtitle> The quest of modularity and efficiencyfor symbolic and certified numeric computation >> |||<\doc-note> This work has been partly supported by the French ANR-09-JCJC-0098-01 project, and by the 2009-36HD grant of the Région Ile-de-France. |>> <\abstract> We describe the goals and architecture of the software project , the main list of packages it contains, the main characteristics of its programming language, and connections with existing front-ends.\ Symbolic computation is usually associated with computer algebra systems such as , , , etc which provide large communities of users with several high level mathematical functionalities. Although these software are equipped with high level programming languages, their interpreters may suffer from efficiency when it comes to dedicated and optimized low level computations. In addition, commercial software do not allow the user to freely inspect and modify the source code for experimenting new low level algorithms. On the other hand several special purpose C/C++ libraries, such as , , , , , , , , , etc, have been developed, and have now become increasingly powerful for solving the tasks they were designed for. Nevertheless, using several of them together in a single application often requires advanced programming skills. In the recent years, appeared general purpose open source software such as , , , , , etc featuring an easier integration of different specialized packages with a unified open source framework, such as used in . Another approach to tackle the efficiency problem while implementing easily new functionalities, adopted by , is to design a compiler for a language well suited to scientific programming, and which leads to efficient standalone executables. Our goals within the development of are in these two mainstreams, without compromising modularity for efficiency or vise-versa. In particular, we wish: <\itemize-dot> to provide a coherent open source framework for the development and publication of efficient and stand-alone packages; to provide packages, which implement in a very efficient way the elementary operations needed in algebraic and numeric computation; to provide tools for the connection of these packages to other interpreters, in particular to the interpreter; to provide a high-level programming language, adapted to mathematical computation, along with both an interpreter and a compiler for that language; to provide high level user interfaces, based on external tools such as (available from >) for a graphical front-end with high quality typesetting for mathematical formulas and for 3D algebraic modeling (available from >). Mathemagix is freely distributed mainly under the GPL license. It can be downloaded from . Automatic configuration and building is ensured via either the or . At the present time only Mac OS X and Linux platforms are supported. To achieve modularity and scalability, is organized as a collection of packages with dag-like dependencies. Each of them provides a interface for gluing some of its functionalities to the interpreter. It can also provide code written in the language, or gluing code for the interaction with other applications such as .\ To generate automatically the glue for the interpreter, the tool (also written in the language) can be used. It takes the files () as input and produces the corresponding files () for the glue. A glue file contains a dictionary between the functions imported in the interpreter, described by their signatures, and the corresponding functions. Signatures with type parameters (that are templates in ) are allowed. The gluing code of a function is generated if all the types involved in its signature are specialized (using the keyword ). The generated C++ files can then be compiled and assembled into a dynamic library. Most of the packages are written in C++, the remaining code is written in the language. The current list of packages represents about 400,000 effective lines of code. This list of packages is in constant evolution. We list here the main ones: <\description-compact> This package contains the basics, that is data structures for symbols, lists, arrays, hash tables, etc. It also provides a system for generic objects. Parsers and pretty printers, together with a system for keeping track of locations in the source code and generating error messages are also available. Important operators for systematic use throughout the project and the glue facility, both for interpreters and functionality can also be found in this package. It provides a C++ interface for extended arithmetic over integers, over rational numbers based on , and over floating point numbers based on . Complexified version of these types are also provided as well as intervals and balls for certified arithmetic. Modular numbers are also implemented herein. This package aims to provide basic routines on univariate polynomials, series, -adic numbers and matrices with state-of-the-art asymptotic time complexities.\ This package is dedicated to transseries and optimized computation on dense and sparse multivariate polynomials and series. This package contains tools for effective analytic computation, including analytic continuation and manipulation of effective analytic functions. \ This package provides basic linear algebra tools on dense matrices, with any suitable coefficients (, , , extended precision, and modular arithmetic where it makes sense). Its interface is fully compliant with the standard and libraries one, allowing us to transparently use a specialized implementation such as for usual machine type coefficients.\ The main tool provided by this package is a multivariate polynomial system solver, which uses the well known border bases technique for solving polynomial systems. It can compute a representation of the quotient algebra, and when the input system admit only finitely many solution, it can output numerical approximations of the roots, and a certificate for the precision of the root approximations. Subdivision solvers for univariate polynomials using Bernstein or monomial basis representation are implemented here. This package also includes a very efficient univariate solver, which computes the continued fraction expansion of the real roots of a polynomial. Subdivision solvers for multivariate polynomials using Bernstein basis representation, sleeve approximation and preconditioner are also available in this package. In this package, tools for the manipulation of polytopes (represented by inequalities or by generators) and connection with multivariate polynomial supports are available. The polytope manipulations are based on the library. A plugin for is also available.\ This package provides data structures to manipulate algebraic curves and surfaces which are given by equations or by parameterizations. It also contains tools to compute, in a certified way, the topology of algebraic sets, arrangements, (self-)intersection curves of parameterized surfaces, singularities... Other packages are still in development, for finite fields, symbolic expressions, asymptotic analysis, numeric homotopy continuation for polynomial system solving, and polynomial factorization. The aim of the language is to provide a new high level language, with the following characteristics: <\description> It is strongly typed, with support for overloading, implicit conversions, generic objects, compile-time type checking and, possibly, built-in support for expression types which interact with the type system. High level control structures, like coroutines, generators, exceptions, continuations, Besides achieving runtime efficiency of itself, the aim is to achieve runtime efficiency through the extensive reuse of existing dedicated libraries written in other languages. therefore implements transparent mechanisms for reusing external libraries and in particular C++ template libraries.\ Currently, a rather slow interpreter of only a part of the full language, the package, is provided. A compiler and a new faster interpreter, written in the language, are under development in the package. <\description-compact> > provides the user with a usual ASCII shell mode and a convenient advanced programmer interface, based on a dedicated mode. It can be used within GNU as a primary graphical interface. This offers a unified and user friendly framework for editing structured documents with different types of content (text, graphics, mathematics, ), including interactive content such as sessions. The rendering engine uses high-quality typesetting algorithms so as to produce professionally looking documents, which can either be printed out or presented from a laptop. It is also used to write and to generate the top-level documentation of the packages in different format (, ), in combination \ with for the code documentation. The program is connected to the algebraic-geometric modeler |http://axel.inria.fr> as a tool for visualisation and geometric computation. Currently some packages of \ are directly used to build the computational kernel of (, ). Other packages (eg. ) produce independent plugins, which extend the interface and the functionalities of the algebraic-geometric modeler. The connection between the interpreter and is under development, in order to get a bidirectional interoperability of the two applications. front-end> <\session|mathemagix|default> <\input|> use "asymptotix"; <\unfolded-io> <|unfolded-io> x == infinity ('x); 1 / (1 + x + exp x) <|unfolded-io> >->->+|\>+>+>-|\>-|\>->->+O|\>> <\unfolded-io|> product (x + log x, x)>(t+log t)>> for \\>>>> <|unfolded-io> x-x+x|2>-x|2>>+x*\x-x+x|2>-x|2>>|2*x>+x*\x-x+x|2>-x|2>>|2*x>+x-x+x|2>-x|2>>|12*x>+Ox*\x-x+x|2>-x|2>>|x>> <\initial> <\collection> <\references> <\collection> > > > > > > > > > <\auxiliary> <\collection> <\associate|toc> |math-font-series||1.Context and objectives> |.>>>>|> |math-font-series||2.Distribution> |.>>>>|> |math-font-series||3.Packages> |.>>>>|> |math-font-series||4.Towards a new high level language> |.>>>>|> |math-font-series||5.Front-ends> |.>>>>|> |math-font-series||6.Example of asymptotic expansions within T|E>||||0.5fn>|0fn|-0.1fn>>XACS||||0.5fn>|0fn|-0.1fn>> front-end> |.>>>>|>