[][src]Struct rustnomial::SparsePolynomial

pub struct SparsePolynomial<N> {
    pub terms: BTreeMap<usize, N>,
}

This version of Polynomial is intended for use for polynomials of large degree, but with a very small number of internal terms. However, it is significantly slower than Polynomial in the case where the number of non-zero terms is close to the degree.

Fields

terms: BTreeMap<usize, N>

Implementations

impl SparsePolynomial<f64>[src]

pub fn roots(self) -> Roots<f64>[src]

Return the roots of the SparsePolynomial.

Example

use rustnomial::{SparsePolynomial, Roots, SizedPolynomial};
let zero = SparsePolynomial::<f64>::zero();
assert_eq!(Roots::InfiniteRoots, zero.roots());
let constant = SparsePolynomial::from(vec![1.]);
assert_eq!(Roots::NoRoots, constant.roots());
let monomial = SparsePolynomial::from(vec![1.0, 0.,]);
assert_eq!(Roots::ManyRealRoots(vec![0.]), monomial.roots());
let binomial = SparsePolynomial::from(vec![1.0, 2.0]);
assert_eq!(Roots::ManyRealRoots(vec![-2.0]), binomial.roots());
let trinomial = SparsePolynomial::from(vec![1.0, 4.0, 4.0]);
assert_eq!(Roots::ManyRealRoots(vec![-2.0, -2.0]), trinomial.roots());
let quadnomial = SparsePolynomial::from(vec![1.0, 6.0, 12.0, 8.0]);
assert_eq!(Roots::ManyRealRoots(vec![-2.0, -2.0, -2.0]), quadnomial.roots());

impl<N> SparsePolynomial<N>[src]

pub fn new(terms: BTreeMap<usize, N>) -> SparsePolynomial<N>[src]

impl<N> SparsePolynomial<N> where
    N: Mul<Output = N> + AddAssign + Copy + Zero + One
[src]

pub fn borrow_mul(&self, _rhs: &SparsePolynomial<N>) -> SparsePolynomial<N>[src]

pub fn pow(&self, exp: usize) -> SparsePolynomial<N>[src]

Raises the SparsePolynomial to the power of exp, using exponentiation by squaring.

Example

use rustnomial::SparsePolynomial;
let polynomial = SparsePolynomial::from(vec![1.0, 2.0]);
let polynomial_sqr = polynomial.pow(2);
let polynomial_cub = polynomial.pow(3);
assert_eq!(polynomial.clone() * polynomial.clone(), polynomial_sqr);
assert_eq!(polynomial_sqr.clone() * polynomial.clone(), polynomial_cub);

impl<N> SparsePolynomial<N> where
    N: Copy + Zero + Neg<Output = N> + Sub<Output = N> + SubAssign + Mul<Output = N> + Div<Output = N> + AddAssign
[src]

pub fn div_mod(
    &self,
    _rhs: &SparsePolynomial<N>
) -> (SparsePolynomial<N>, SparsePolynomial<N>)
[src]

Divides self by the given SparsePolynomial, and returns the quotient and remainder.

Example

use rustnomial::SparsePolynomial;
let polynomial = SparsePolynomial::from(vec![1.0, 2.0]);

Trait Implementations

impl<N> Add<SparsePolynomial<N>> for SparsePolynomial<N> where
    N: Copy + AddAssign
[src]

type Output = SparsePolynomial<N>

The resulting type after applying the + operator.

impl<N: Copy + AddAssign> AddAssign<SparsePolynomial<N>> for SparsePolynomial<N>[src]

impl<N: Clone> Clone for SparsePolynomial<N>[src]

impl<N: Debug> Debug for SparsePolynomial<N>[src]

impl<N> Derivable<N> for SparsePolynomial<N> where
    N: Zero + TryFromUsizeExact + Copy + Mul<Output = N>, 
[src]

pub fn derivative(&self) -> SparsePolynomial<N>[src]

Returns the derivative of the SparsePolynomial.

Example

use rustnomial::{SparsePolynomial, Derivable};
let polynomial = SparsePolynomial::from(vec![4, 1, 5]);
assert_eq!(SparsePolynomial::from(vec![8, 1]), polynomial.derivative());

Errors

Will panic if a term has a degree which does not have a lossless representation in N.

impl<N> Display for SparsePolynomial<N> where
    N: Zero + One + IsPositive + PartialEq + Abs + Copy + IsNegativeOne + Display
[src]

impl<N> Div<N> for SparsePolynomial<N> where
    N: Copy + Div<Output = N>, 
[src]

type Output = SparsePolynomial<N>

The resulting type after applying the / operator.

impl<N> DivAssign<N> for SparsePolynomial<N> where
    N: Copy + DivAssign
[src]

impl<N> Evaluable<N> for SparsePolynomial<N> where
    N: Zero + PowUsize + Copy + AddAssign + Mul<Output = N>, 
[src]

impl<N> FreeSizePolynomial<N> for SparsePolynomial<N> where
    N: Zero + Copy + AddAssign
[src]

pub fn from_terms(terms: &[(N, usize)]) -> Self[src]

Returns a SparsePolynomial with the corresponding terms.

Arguments

  • terms - A slice of (coefficient, degree) pairs.

Example

use rustnomial::{SparsePolynomial, FreeSizePolynomial};
// Corresponds to 1.0x^2 + 4.0x + 4.0
let polynomial = SparsePolynomial::from_terms(&[(1.0, 2), (4.0, 1), (4.0, 1)]);

impl From<SparsePolynomial<f32>> for SparsePolynomial<f64>[src]

impl From<SparsePolynomial<i16>> for SparsePolynomial<i32>[src]

impl From<SparsePolynomial<i16>> for SparsePolynomial<i64>[src]

impl From<SparsePolynomial<i16>> for SparsePolynomial<i128>[src]

impl From<SparsePolynomial<i16>> for SparsePolynomial<f32>[src]

impl From<SparsePolynomial<i16>> for SparsePolynomial<f64>[src]

impl From<SparsePolynomial<i32>> for SparsePolynomial<i64>[src]

impl From<SparsePolynomial<i32>> for SparsePolynomial<i128>[src]

impl From<SparsePolynomial<i32>> for SparsePolynomial<f64>[src]

impl From<SparsePolynomial<i64>> for SparsePolynomial<i128>[src]

impl From<SparsePolynomial<i8>> for SparsePolynomial<i16>[src]

impl From<SparsePolynomial<i8>> for SparsePolynomial<i32>[src]

impl From<SparsePolynomial<i8>> for SparsePolynomial<i64>[src]

impl From<SparsePolynomial<i8>> for SparsePolynomial<i128>[src]

impl From<SparsePolynomial<i8>> for SparsePolynomial<f32>[src]

impl From<SparsePolynomial<i8>> for SparsePolynomial<f64>[src]

impl From<SparsePolynomial<u16>> for SparsePolynomial<u32>[src]

impl From<SparsePolynomial<u16>> for SparsePolynomial<u64>[src]

impl From<SparsePolynomial<u16>> for SparsePolynomial<u128>[src]

impl From<SparsePolynomial<u16>> for SparsePolynomial<i32>[src]

impl From<SparsePolynomial<u16>> for SparsePolynomial<i64>[src]

impl From<SparsePolynomial<u16>> for SparsePolynomial<i128>[src]

impl From<SparsePolynomial<u16>> for SparsePolynomial<f32>[src]

impl From<SparsePolynomial<u16>> for SparsePolynomial<f64>[src]

impl From<SparsePolynomial<u32>> for SparsePolynomial<u64>[src]

impl From<SparsePolynomial<u32>> for SparsePolynomial<u128>[src]

impl From<SparsePolynomial<u32>> for SparsePolynomial<i64>[src]

impl From<SparsePolynomial<u32>> for SparsePolynomial<i128>[src]

impl From<SparsePolynomial<u32>> for SparsePolynomial<f64>[src]

impl From<SparsePolynomial<u64>> for SparsePolynomial<u128>[src]

impl From<SparsePolynomial<u64>> for SparsePolynomial<i128>[src]

impl From<SparsePolynomial<u8>> for SparsePolynomial<u16>[src]

impl From<SparsePolynomial<u8>> for SparsePolynomial<u32>[src]

impl From<SparsePolynomial<u8>> for SparsePolynomial<u64>[src]

impl From<SparsePolynomial<u8>> for SparsePolynomial<u128>[src]

impl From<SparsePolynomial<u8>> for SparsePolynomial<i16>[src]

impl From<SparsePolynomial<u8>> for SparsePolynomial<i32>[src]

impl From<SparsePolynomial<u8>> for SparsePolynomial<i64>[src]

impl From<SparsePolynomial<u8>> for SparsePolynomial<i128>[src]

impl From<SparsePolynomial<u8>> for SparsePolynomial<f32>[src]

impl From<SparsePolynomial<u8>> for SparsePolynomial<f64>[src]

impl<N> From<Vec<N, Global>> for SparsePolynomial<N> where
    N: Copy + Zero
[src]

pub fn from(term_vec: Vec<N>) -> Self[src]

Returns a SparsePolynomial with the corresponding terms, in order of ax^n + bx^(n-1) + ... + cx + d

Arguments

  • term_vec - A vector of constants, in decreasing order of degree.

Example

use rustnomial::SparsePolynomial;
// Corresponds to 1.0x^2 + 4.0x + 4.0
let polynomial = SparsePolynomial::from(vec![1.0, 4.0, 4.0]);

impl<N> FromStr for SparsePolynomial<N> where
    N: Zero + One + Copy + SubAssign + AddAssign + FromStr + CanNegate, 
[src]

type Err = PolynomialFromStringError

The associated error which can be returned from parsing.

impl<N> Integrable<N, SparsePolynomial<N>> for Monomial<N> where
    N: Zero + Copy + Mul<Output = N> + AddAssign + PowUsize + Div<Output = N> + TryFromUsizeExact, 
[src]

pub fn integral(&self) -> Integral<N, SparsePolynomial<N>>[src]

Returns the integral of the Monomial.

Example

use rustnomial::{Monomial, SparsePolynomial, Integrable, FreeSizePolynomial};
let monomial = Monomial::new(3.0, 2);
let integral = monomial.integral();
assert_eq!(&SparsePolynomial::from_terms(&[(1.0, 3)]), integral.inner());
assert_eq!(1., integral.eval(0., 1.));

impl<N> Integrable<N, SparsePolynomial<N>> for SparsePolynomial<N> where
    N: PartialEq + Zero + Copy + Div<Output = N> + Mul<Output = N> + PowUsize + AddAssign + TryFromUsizeExact, 
[src]

pub fn integral(&self) -> Integral<N, SparsePolynomial<N>>[src]

Returns the integral of the Polynomial.

Example

use rustnomial::{SparsePolynomial, Integrable};
let polynomial = SparsePolynomial::from(vec![1.0, 2.0, 5.0]);
let integral = polynomial.integral();
assert_eq!(&SparsePolynomial::from(vec![1.0/3.0, 1.0, 5.0, 0.0]), integral.inner());

Errors

Will panic if a term has a degree, which when incremented by one, does not have a lossless representation in N.

impl<N> Mul<&'_ SparsePolynomial<N>> for SparsePolynomial<N> where
    N: Mul<Output = N> + AddAssign + Copy + Zero
[src]

type Output = SparsePolynomial<N>

The resulting type after applying the * operator.

impl<N: Copy + Mul<Output = N>> Mul<N> for SparsePolynomial<N>[src]

type Output = SparsePolynomial<N>

The resulting type after applying the * operator.

impl<N> Mul<SparsePolynomial<N>> for SparsePolynomial<N> where
    N: Mul<Output = N> + AddAssign + Copy + Zero
[src]

type Output = SparsePolynomial<N>

The resulting type after applying the * operator.

impl<N> MulAssign<&'_ SparsePolynomial<N>> for SparsePolynomial<N> where
    N: Mul<Output = N> + AddAssign + Copy + Zero
[src]

impl<N: Copy + MulAssign> MulAssign<N> for SparsePolynomial<N>[src]

impl<N> MulAssign<SparsePolynomial<N>> for SparsePolynomial<N> where
    N: Mul<Output = N> + AddAssign + Copy + Zero
[src]

impl<N> MutablePolynomial<N> for SparsePolynomial<N> where
    N: Zero + Copy + AddAssign + SubAssign + CanNegate, 
[src]

impl<N> Neg for SparsePolynomial<N> where
    N: Zero + Copy + Neg<Output = N>, 
[src]

type Output = SparsePolynomial<N>

The resulting type after applying the - operator.

impl<N> PartialEq<SparsePolynomial<N>> for SparsePolynomial<N> where
    N: Zero + PartialEq + Copy
[src]

pub fn eq(&self, other: &Self) -> bool[src]

Returns true if self has the same terms as other.

Example

use rustnomial::SparsePolynomial;
let a = SparsePolynomial::from(vec![1.0, 2.0]);
let b = SparsePolynomial::from(vec![2.0, 2.0]);
let c = SparsePolynomial::from(vec![1.0, 0.0]);
assert_ne!(a, b);
assert_ne!(a, c);
assert_eq!(a, b - c);

impl<N> Rem<SparsePolynomial<N>> for SparsePolynomial<N> where
    N: Copy + Zero + Neg<Output = N> + Sub<Output = N> + SubAssign + Mul<Output = N> + Div<Output = N> + AddAssign
[src]

type Output = SparsePolynomial<N>

The resulting type after applying the % operator.

pub fn rem(self, _rhs: SparsePolynomial<N>) -> SparsePolynomial<N>[src]

Returns the remainder of dividing self by _rhs.

impl<N> RemAssign<SparsePolynomial<N>> for SparsePolynomial<N> where
    N: Copy + Zero + Neg<Output = N> + Sub<Output = N> + SubAssign + Mul<Output = N> + Div<Output = N> + AddAssign
[src]

pub fn rem_assign(&mut self, _rhs: SparsePolynomial<N>)[src]

Assign the remainder of dividing self by _rhs to self.

impl<N: Copy> Shl<i32> for SparsePolynomial<N>[src]

type Output = SparsePolynomial<N>

The resulting type after applying the << operator.

impl<N: Copy> ShlAssign<i32> for SparsePolynomial<N>[src]

impl<N: Copy> Shr<i32> for SparsePolynomial<N>[src]

type Output = SparsePolynomial<N>

The resulting type after applying the >> operator.

impl<N: Copy> ShrAssign<i32> for SparsePolynomial<N>[src]

impl<N: Zero + Copy> SizedPolynomial<N> for SparsePolynomial<N>[src]

pub fn degree(&self) -> Degree[src]

Returns the degree of the SparsePolynomial it is called on, corresponding to the largest non-zero term.

Example

use rustnomial::{SizedPolynomial, SparsePolynomial, Degree};
let polynomial = SparsePolynomial::from(vec![1.0, 4.0, 4.0]);
assert_eq!(Degree::Num(2), polynomial.degree());

pub fn zero() -> SparsePolynomial<N>[src]

Returns a SparsePolynomial with no terms.

Example

use rustnomial::{SizedPolynomial, SparsePolynomial};
let zero = SparsePolynomial::<i32>::zero();
assert!(zero.is_zero());
assert!(zero.term_iter().next().is_none());
assert!(zero.terms.is_empty());

pub fn set_to_zero(&mut self)[src]

Sets self to zero.

Example

use rustnomial::{SparsePolynomial, SizedPolynomial};
let mut non_zero = SparsePolynomial::from(vec![0, 1]);
assert!(!non_zero.is_zero());
non_zero.set_to_zero();
assert!(non_zero.is_zero());

impl<N> Sub<Polynomial<N>> for SparsePolynomial<N> where
    N: Zero + Copy + Sub<Output = N> + SubAssign + Neg<Output = N>, 
[src]

type Output = SparsePolynomial<N>

The resulting type after applying the - operator.

impl<N> Sub<SparsePolynomial<N>> for SparsePolynomial<N> where
    N: Zero + Copy + Sub<Output = N> + SubAssign + Neg<Output = N>, 
[src]

type Output = SparsePolynomial<N>

The resulting type after applying the - operator.

impl<N> SubAssign<SparsePolynomial<N>> for SparsePolynomial<N> where
    N: Neg<Output = N> + Sub<Output = N> + SubAssign + Copy
[src]

Auto Trait Implementations

impl<N> RefUnwindSafe for SparsePolynomial<N> where
    N: RefUnwindSafe
[src]

impl<N> Send for SparsePolynomial<N> where
    N: Send
[src]

impl<N> Sync for SparsePolynomial<N> where
    N: Sync
[src]

impl<N> Unpin for SparsePolynomial<N>[src]

impl<N> UnwindSafe for SparsePolynomial<N> where
    N: RefUnwindSafe
[src]

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> From<T> for T[src]

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T, Rhs> NumAssignOps<Rhs> for T where
    T: AddAssign<Rhs> + SubAssign<Rhs> + MulAssign<Rhs> + DivAssign<Rhs> + RemAssign<Rhs>, 
[src]

impl<T> ToOwned for T where
    T: Clone
[src]

type Owned = T

The resulting type after obtaining ownership.

impl<T> ToString for T where
    T: Display + ?Sized
[src]

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.