# mpolynomials: Simple multivariate polynomials.

This is a package candidate release! Here you can preview how this package release will appear once published to the main package index (which can be accomplished via the 'maintain' link below). Please note that once a package has been published to the main package index it cannot be undone! Please consult the package uploading documentation for more information.

[maintain] [Publish]

Warnings:

• No 'description' field.

## Properties

Versions 0.1.0.0, 0.1.0.0, 0.1.0.1, 0.1.1.0 None available base (>=4.7 && <5), containers (>=0.6.4.1 && <0.7), extra (>=1.7.10 && <1.8), numeric-prelude (>=0.4.4 && <0.5), text (>=1.2.5.0 && <1.3) [details] GPL-3.0-only 2022 Stéphane Laurent Stéphane Laurent laurent_step@outlook.fr Math https://github.com/stla/mpolynomials#readme head: git clone https://github.com/stla/mpolynomials by stla at 2022-07-25T10:01:52Z

## Modules

[Index] [Quick Jump]

#### Maintainer's Corner

Package maintainers

For package maintainers and hackage trustees

[back to package description]

# mpolynomials

import MultiPol
x = lone 1 :: Polynomial Double
y = lone 2 :: Polynomial Double
z = lone 3 :: Polynomial Double
poly = (2 *^ (x^**^3 ^*^ y ^*^ z) ^+^ (x^**^2)) ^*^ (4 *^ x ^*^ y ^*^ z)
poly
-- M (Monomial {coefficient = 4.0, powers = fromList [3,1,1]})
-- :+:
-- M (Monomial {coefficient = 8.0, powers = fromList [4,2,2]})
prettyPol show "x" poly
-- "(4.0) * x^(3, 1, 1) + (8.0) * x^(4, 2, 2)"


More generally, one can use the type Polynomial a as long as the type a has the instances Eq and Algebra.Ring (defined in the numeric-prelude library). For example a = Rational:

import MultiPol
import Data.Ratio
x = lone 1 :: Polynomial Rational
y = lone 2 :: Polynomial Rational
z = lone 3 :: Polynomial Rational
((2%3) *^ (x^**^3 ^*^ y ^*^ z) ^+^ (x^**^2)) ^*^ ((7%4) *^ x ^*^ y ^*^ z)
-- M (Monomial {coefficient = 7 % 4, powers = fromList [3,1,1]})
-- :+:
-- M (Monomial {coefficient = 7 % 6, powers = fromList [4,2,2]})


Or a = Polynomial Double:

import MultiPol
p = lone 1 :: Polynomial Double
x = lone 1 :: Polynomial (Polynomial Double)
y = lone 2 :: Polynomial (Polynomial Double)
poly = (p *^ x) ^+^ (p *^ y)
poly ^**^ 2
-- (M (Monomial {
--   coefficient = M (Monomial {coefficient = 1.0, powers = fromList [0,2]}),
--   powers = fromList [0,2]})
-- :+:
--  M (Monomial {
--    coefficient = M (Monomial {coefficient = 2.0, powers = fromList [1,1]}),
--    powers = fromList [1,1]}))
-- :+:
--  M (Monomial {
--    coefficient = M (Monomial {coefficient = 1.0, powers = fromList [2,0]}),
--    powers = fromList [2,0]})
prettyPol (prettyPol show "a") "X" (poly ^**^ 2)
-- "((1.0) * a^(2)) * X^(0, 2) + ((2.0) * a^(2)) * X^(1, 1) + ((1.0) * a^(2)) * X^(2, 0)"


Compact version:

import MultiPol
import Prelude          hiding ((+), (*), (*>))
import Algebra.Module   as AM
import Algebra.Ring     as AR
p = compact (lone 1) :: CompactPolynomial Double
x = compact (lone 1) :: CompactPolynomial (CompactPolynomial Double)
y = compact (lone 2) :: CompactPolynomial (CompactPolynomial Double)
poly = (p *> x) + (p *> y)
poly           -- ax + ay
-- [([(1.0, [1])], [0, 1]), ([(1.0, [1])], [1, 0])]
poly * poly    -- a²x² + 2a²xy + a²y²
-- [([(1.0, [2])], [0, 2]), ([(2.0, [2])], [1, 1]), ([(1.0, [2])], [2, 0])]


Evaluation:

import MultiPol
x = lone 1 :: Polynomial Double
y = lone 2 :: Polynomial Double
z = lone 3 :: Polynomial Double
poly = 2 *^ x ^*^ y ^*^ z
-- evaluate poly at x=2, y=1, z=2
evalPoly poly [2, 1, 2]
-- 8.0