factory-0.3.0.0: Rational arithmetic in an irrational world.

Factory.Data.Polynomial

Description

Synopsis

Types

Data-types

data Polynomial coefficient exponent Source #

• The type of an arbitrary univariate polynomial; actually it's more general, since it permits negative powers (https://en.wikipedia.org/wiki/Laurent_polynomials). It can't describe multivariate polynomials, which would require a list of exponents. Rather than requiring the exponent to implement the type-class Integral, this is implemented at the function-level, as required.
• The structure permits gaps between exponents, in which coefficients are inferred to be zero, thus enabling efficient representation of sparse polynomials.
• CAVEAT: the MonomialList is required to; be ordered by descending exponent (ie. reverse https://en.wikipedia.org/wiki/Monomial_order); have had zero coefficients removed; and to have had like terms merged; so the raw data-constructor isn't exported.

Instances

 (Eq exponent, Eq coefficient) => Eq (Polynomial coefficient exponent) Source # Methods(==) :: Polynomial coefficient exponent -> Polynomial coefficient exponent -> Bool #(/=) :: Polynomial coefficient exponent -> Polynomial coefficient exponent -> Bool # (Show exponent, Show coefficient) => Show (Polynomial coefficient exponent) Source # MethodsshowsPrec :: Int -> Polynomial coefficient exponent -> ShowS #show :: Polynomial coefficient exponent -> String #showList :: [Polynomial coefficient exponent] -> ShowS # (Eq c, Num c, Num e, Ord e) => Ring (Polynomial c e) Source # Makes Polynomial a Ring, over the field composed from all possible coefficients; https://en.wikipedia.org/wiki/Polynomial_ring. Methods(=+=) :: Polynomial c e -> Polynomial c e -> Polynomial c e Source #(=*=) :: Polynomial c e -> Polynomial c e -> Polynomial c e Source #additiveInverse :: Polynomial c e -> Polynomial c e Source #(=-=) :: Polynomial c e -> Polynomial c e -> Polynomial c e Source #square :: Polynomial c e -> Polynomial c e Source # (Eq c, Fractional c, Num e, Ord e) => QuotientRing (Polynomial c e) Source # Defines the ability to divide polynomials. MethodsquotRem' :: Polynomial c e -> Polynomial c e -> (Polynomial c e, Polynomial c e) Source #

Constants

Constructs a polynomial with zero terms.

one :: (Eq c, Num c, Num e) => Polynomial c e Source #

Constructs a constant monomial, independent of the indeterminate.

Functions

Arguments

 :: (Num n, Integral e, Show e) => n The indeterminate. -> Polynomial n e -> n The Result.
• Evaluate the polynomial at a specific indeterminate.
• CAVEAT: requires positive exponents; but it wouldn't really be a polynomial otherwise.
• If the polynomial is very sparse, this may be inefficient, since it memoizes the complete sequence of powers up to the polynomial's degree.

getLeadingTerm :: Polynomial c e -> Monomial c e Source #

Return the highest-degree monomial.

lift :: (MonomialList c1 e1 -> MonomialList c2 e2) -> Polynomial c1 e1 -> Polynomial c2 e2 Source #

• Transforms the data behind the constructor.
• CAVEAT: similar to fmap, but Polynomial isn't an instance of Functor since we may want to operate on both type-parameters.
• CAVEAT: the caller is required to re-normalise the resulting polynomial depending on the nature of the transformation of the data.

Arguments

 :: Integral c => Polynomial c e -> c Modulus. -> Polynomial c e

Reduces all the coefficients using modular arithmetic.

normalise :: (Eq c, Num c, Ord e) => Polynomial c e -> Polynomial c e Source #

Sorts into descending order of exponents, groups like exponents, and calls pruneCoefficients.

Arguments

 :: (Integral c, Integral power, Num e, Ord e, Show power) => Polynomial c e The base. -> power The exponent to which the base should be raised. -> c The modulus. -> Polynomial c e The result.
• Raise a polynomial to the specified positive integral power, but using modulo-arithmetic.
• Whilst one could naively implement this as (x Data.Ring.=^ n) mod m, this will result in arithmetic operatons on unnecessarily big integers.

realCoefficientsToFrac :: (Real r, Fractional f) => Polynomial r e -> Polynomial f e Source #

Convert the type of the coefficients.

terms :: Polynomial c e -> Int Source #

Returns the number of non-zero terms in the polynomial.

Constructors

mkConstant :: (Eq c, Num c, Num e) => c -> Polynomial c e Source #

Constructs an arbitrary zeroeth-degree polynomial, ie. independent of the indeterminate.

Arguments

 :: (Eq c, Num c, Num e) => c Gradient. -> c Constant. -> Polynomial c e

Constructs an arbitrary first-degree polynomial.

mkPolynomial :: (Eq c, Num c, Ord e) => MonomialList c e -> Polynomial c e Source #

Smart constructor. Constructs an arbitrary polynomial.

Operators

(*=) :: (Eq c, Num c, Num e) => Polynomial c e -> Monomial c e -> Polynomial c e infixl 7 Source #

Predicates

Arguments

 :: (Integral c, Num e, Ord e) => Polynomial c e LHS. -> Polynomial c e RHS. -> c Modulus. -> Bool

inAscendingOrder :: Ord e => Polynomial c e -> Bool Source #

True if the exponents of successive terms are in ascending order.

inDescendingOrder :: Ord e => Polynomial c e -> Bool Source #

True if the exponents of successive terms are in descending order.

isMonomial :: Polynomial c e -> Bool Source #

True if there's exactly one term.

isNormalised :: (Eq c, Num c, Ord e) => Polynomial c e -> Bool Source #

True if no term has a coefficient of zero and the exponents of successive terms are in descending order.

isPolynomial :: Integral e => Polynomial c e -> Bool Source #

True if all exponents are positive integers as required.

isZero :: Polynomial c e -> Bool Source #

True if there are zero terms.