# Applications and libraries/Mathematics

This page contains a list of libraries and tools in a certain category. For a comprehensive list of such pages, see Applications and libraries.

## 1 Libraries for numerical algorithms and mathematics

### 1.1 Linear algebra

High level functional interface to standard linear algebra computations and other numerical algorithms based on the GNU Scientific Library. Alternative download site.
Wrapper to CLAPACK
Digital Signal Processing
Modules for matrix manipulation, digital signal processing, spectral estimation, and frequency estimation.
Index-aware linear algebra
Frederik Eaton's library for statically checked matrix manipulation in Haskell
Indexless linear algebra
algorithms by Jan Skibinski, see below

### 1.2 Physical units

Dimensionalized numbers
Working with physical units like second, meter and so on in a type-safe manner.
NumericPrelude: Physical units
Numeric values with dynamically checked units.
CalDims
This is not simply a library providing a new type of
Num
class, but stand-alone calculation tool that supports user defined functions and units (basic and derrived), so it can provide dimension-save calculation (not embedded but via shell). Calculations can be modified/saved via shell. It uses rational numbers to avoid rounding errors where possible.

### 1.3 Number representations

Decimal arithmetic library
An implementation of real decimal arithmetic, for cases where the binary floating point is not acceptable (for example, money).

There are several levels of handling real numbers and according libraries.

#### 1.3.1 Arbitrary precision

• Numbers have fixed precision
• Rounding errors accumulate
• Sharing is easy, i.e. in
sqrt pi + sin pi
,
pi
is computed only once
• Fast, because the routines can make use of the fast implementation of
Integer
operations
Fractions.hs
algorithms by Jan Skibinski, see below
FixedPoint.hs
part of NumericPrelude project

#### 1.3.2 Dynamic precision

• You tell the precision, an expression shall be computed to and the computer finds out, how precise to compute the input values.
• Rounding errors do not accumulate
• Sharing of temporary results is difficult, that is in
sqrt pi + sin pi
,
pi
will certainly be computed twice, each time with the required precision.
• Almost as fast as arbitrary precision computation
ERA is an implementation (in Haskell 1.2) by David Lester.
It is quite fast, possibly the fastest Haskell implementation. At 220 lines it is also the shortest. Probably the shortest implementation of exact real arithmetic in any language.
Here is a mirror: http://darcs.augustsson.net/Darcs/CReal/
IC-Reals is an implementation by Abbas Edalat, Marko Krznarć and Peter J. Potts.
This implementation uses linear fractional transformations.
Few Digits by Russell O'Connor.
This is a prototype of the implementation he intendeds to write in Coq. Once the Coq implementation is complete, the Haskell code could be extracted producing an implementation that would be proved correct.
COMP is an implementation by Yann Kieffer.
The work is in beta and relies on new primitive operations on Integers which will be implemented in GHC. The library isn't available yet.

#### 1.3.3 Lazily evaluated

The real numbers are represented by an infinite datastructure, which allows you to increase precision successively by evaluating the data structure successively. All of the implementations below use some kind of digit stream as number representation. Sharing of results is simple. The implementations are either fast on simple expressions, because they use large blocks/bases, or they are fast on complex expressions, because they consume as little as possible input digits in order to emit the required output digits.

BigFloat is an implementation by Martin Guy.
It works with streams of decimal digits (strictly in the range from 0 to 9) and a separate sign. The produced digits are always correct. Output is postponed until the code is certain what the next digit is. This sometimes means that no more data is output.
In "The Most Unreliable Technique in the World to compute pi" Jerzy Karczmarczuk develops some functions for computing pi lazily.
NumericPrelude: positional numbers
Represents a real number as pair
(exponent,[digit])
, where the digits are
Int
s in the open range
(-basis,basis)
. There is no need for an extra sign item in the number data structure. The
basis
can range from
10
to
1000
. (Binary representations can be derived from the hexadecimal representation.) Showing the numbers in traditional format (non-negative digits) fails for fractions ending with a run of zeros. However the internal representation with negative digits can always be shown and is probably more useful for further processing. An interface for the numeric type hierarchy of the NumericPrelude project is provided.
It features
• basis conversion
• basic arithmetic: addition, subtraction, multiplication, division
• algebraic arithmetic: square root, other roots (no general polynomial roots)
• transcendental arithmetic: pi, exponential, logarithm, trigonometric and inverse trigonometric functions

### 1.4 Type class hierarchies

There are several approaches to improve the numeric type class hierarchy.

Dylan Thurston and Henning Thielemann's Numeric Prelude
Experimental revised framework for numeric type classes. Needs hiding of Prelude, overriding hidden functions like fromInteger and multi-parameter type classes. Probably restricted to GHC.
Jerzy Karczmarczuk's approach
Serge D. Mechveliani's Basic Algebra proposal
Andrew Frank's approach
The proposal: ftp://ftp.geoinfo.tuwien.ac.at/frank/numbersPrelude_v1.pdf
Ongoing efforts for the language revision

### 1.5 Discrete mathematics

Number Theory Library
Andrew Bromage's Haskell number theory library, providing operations on primes, fibonacci sequences and combinatorics.
HGAL
An haskell implementation of Brendan McKay's algorithm for graph canonic labeling and automorphism group. (aka Nauty)
Computational Oriented Matroids
is a book by Jürgen G. Bokowski, where he develops Haskell code for Matroid computations.

### 1.6 Computer Algebra

DoCon - Algebraic Domain Constructor
A Computer Algebra System
Papers by Jerzy Karczmarczuk
Some interesting uses of Haskell in mathematics, including functional differentiation, power series, continued fractions.

### 1.7 Collections of various stuff

The HaskellMath library is a sandbox for experimenting with mathematics algorithms. So far I've implemented a few quantitative finance models (Black Scholes, Binomial Trees, etc) and basic linear algebra functions. Next I might work on either computer algebra or linear programming. All comments welcome!
David Amos' collection of math libraries in Haskell - including number theory, commutative algebra, combinatorics, permutation groups and more.
Various math stuff by Henning Thielemann
This is some unsorted mathematical stuff including: GNUPlot wrapper, portable grey map (PGM) image reader and writer, simplest numerical integration, differentiation, zero finding, interpolation, solution of differential equations, combinatorics, some solutions of math riddles, computation of fractal dimensions of iterated function systems (IFS)
Mirror of the following numeric modules by Jan Skibinski

### 1.8 other

Geometric Algorithms
A small Haskell library, containing algorithms for two-dimensional convex hulls, triangulations of polygons, Voronoi-diagrams and Delaunay-triangulations, the QEDS data structure, kd-trees and range-trees.
A ranged set is a list of non-overlapping ranges. The ranges have upper and lower boundaries, and a boundary divides the base type into values above and below. No value can ever sit on a boundary. So you can have the set $(2.0, 3.0] \cup (5.3, 6)$.