pub struct Polynomial<T> { /* private fields */ }
Expand description
Polynomial ring $R[x]
$
use num::Rational64;
use polynomial_ring::Polynomial;
let f = Polynomial::new(vec![3, 1, 4, 1, 5].into_iter().map(|x| Rational64::from_integer(x)).collect());
let g = Polynomial::new(vec![2, 7, 1].into_iter().map(|x| Rational64::from_integer(x)).collect());
let mut r = f.clone();
let q = r.division(&g);
assert_eq!(f, q * g + r);
Implementations§
Source§impl<T: Sized> Polynomial<T>
impl<T: Sized> Polynomial<T>
Sourcepub fn deg(&self) -> Option<usize>
pub fn deg(&self) -> Option<usize>
The degree of the polynomial. This is the highest power, or None for the zero polynomial.
use polynomial_ring::Polynomial;
let p = Polynomial::new(vec![3, 2, 1]); // 3+2x+x^2
assert_eq!(p.deg(), Some(2));
let q = Polynomial::new(vec![0]); // 0
assert_eq!(q.deg(), None);
Sourcepub fn lc(&self) -> Option<&T>
pub fn lc(&self) -> Option<&T>
The leading coefficent. This is the coeffient of the highest power, or None for the zero polynomial.
use polynomial_ring::Polynomial;
let p = Polynomial::new(vec![3, 2, 1]); // 3+2x+x^2
assert_eq!(p.lc(), Some(&1));
let q = Polynomial::new(vec![0]); // 0
assert_eq!(q.lc(), None);
Source§impl<M: Sized + Zero> Polynomial<M>
impl<M: Sized + Zero> Polynomial<M>
Sourcepub fn new(coeff: Vec<M>) -> Self
pub fn new(coeff: Vec<M>) -> Self
Construct a polynomial from a Vec of coefficients.
use polynomial_ring::Polynomial;
let p = Polynomial::new(vec![3, 2, 1]);
assert_eq!(p.to_string(), "x^2+2*x+3");
Sourcepub fn from_monomial(coefficent: M, degree: usize) -> Self
pub fn from_monomial(coefficent: M, degree: usize) -> Self
Construct a monomial $cx^d
$ from a coefficient and a degree ($c
$=coefficent, $d
$=degree).
use polynomial_ring::Polynomial;
let p = Polynomial::from_monomial(3, 2);
let q = Polynomial::new(vec![0, 0, 3]);
assert_eq!(p, q);
Source§impl<R: Sized> Polynomial<R>
impl<R: Sized> Polynomial<R>
Sourcepub fn eval<'a>(&self, x: &'a R) -> R
pub fn eval<'a>(&self, x: &'a R) -> R
Evaluate a polynomial at some point, using Horner’s method.
use polynomial_ring::Polynomial;
let p = Polynomial::new(vec![3, 2, 1]); // 3+2x+x^2
assert_eq!(p.eval(&1), 6);
assert_eq!(p.eval(&2), 11);
Sourcepub fn derivative(&self) -> Self
pub fn derivative(&self) -> Self
Calculate the derivative.
use polynomial_ring::{Polynomial, polynomial};
let p = polynomial![1i32, 2, 3, 2, 1]; // 1+2x+3x^2+2x^3+x^4
assert_eq!(p.derivative(), polynomial![2, 6, 6, 4]); // 2+6x+6x^2+4x^3
Sourcepub fn pseudo_division(&mut self, other: &Self) -> (R, Self)
pub fn pseudo_division(&mut self, other: &Self) -> (R, Self)
Pseudo division.
Let $R
$ be an integral domain.
Let $f, g \in R[x]
$, where $g \neq 0
$.
This function calculates $s \in R
$, $q, r \in R[x]
$ s.t. $sf=qg+r
$,
where $r=0
$ or $\deg(r)<\deg(g)
$.
use polynomial_ring::{polynomial, Polynomial};
let f = polynomial![1i32, 3, 1]; // 1+3x+x^2 ∈ Z[x]
let g = polynomial![5, 2]; // 5+2x ∈ Z[x]
let mut r = f.clone();
let (s, q) = r.pseudo_division(&g);
assert_eq!(f * s, q * g + r);
Sourcepub fn resultant(self, other: Self) -> R
pub fn resultant(self, other: Self) -> R
Calculate the resultant
use polynomial_ring::{polynomial, Polynomial};
let f = polynomial![0i32, 2, 0, 1]; // 2x+x^3 ∈ Z[x]
let g = polynomial![2, 3, 5]; // 2+3x+5x^2 ∈ Z[x]
let r = f.resultant(g);
assert_eq!(r, 164);
Sourcepub fn primitive_part_mut(&mut self)
pub fn primitive_part_mut(&mut self)
Calculate the primitive part of the input polynomial, that is divide the polynomial by the GCD of its coefficents.
use polynomial_ring::{polynomial, Polynomial};
use num_traits::{One, Zero};
let mut f = polynomial![2i32, 4, -2, 6]; // 2+4x+2x^2+6x^3 ∈ Z[x]
f.primitive_part_mut();
assert_eq!(f, polynomial![1, 2, -1, 3]);// 1+2x+x^2+3x^3 ∈ Z[x]
let mut g = polynomial![polynomial![1i32, 1], polynomial![1, 2, 1], polynomial![3, 4, 1], polynomial![-1, -1]]; // (1+x)+(1+2x+x^2)y+(3+4x+x^2)y^2+(-1-x)y^3 ∈ Z[x][y]
g.primitive_part_mut();
assert_eq!(g, polynomial![polynomial![1], polynomial![1, 1], polynomial![3, 1], polynomial![-1]]); // 1+(1+x)y+(3+x)y^2-y^3 ∈ Z[x][y]
Source§impl<K: Sized> Polynomial<K>
impl<K: Sized> Polynomial<K>
Sourcepub fn monic(&mut self)
pub fn monic(&mut self)
Make the polynomial monic, that is divide it by its leading coefficient.
use num::Rational64;
use polynomial_ring::Polynomial;
let mut p = Polynomial::new(vec![1, 2, 3].into_iter().map(|x| Rational64::from_integer(x)).collect());
p.monic();
let q = Polynomial::new(vec![(1, 3), (2, 3), (1, 1)].into_iter().map(|(n, d)| Rational64::new(n, d)).collect());
assert_eq!(p, q);
Sourcepub fn division(&mut self, other: &Self) -> Self
pub fn division(&mut self, other: &Self) -> Self
Polynomial division.
use num::Rational64;
use polynomial_ring::Polynomial;
let f = Polynomial::new(vec![3, 1, 4, 1, 5].into_iter().map(|x| Rational64::from_integer(x)).collect());
let g = Polynomial::new(vec![2, 7, 1].into_iter().map(|x| Rational64::from_integer(x)).collect());
let mut r = f.clone();
let q = r.division(&g);
assert_eq!(f, q * g + r);
Sourcepub fn square_free(&self) -> Self
pub fn square_free(&self) -> Self
Calculate the square-free decomposition.
use polynomial_ring::{Polynomial, polynomial};
use num::Rational64;
let f = polynomial![Rational64::from(1), Rational64::from(1)];
let g = polynomial![Rational64::from(1), Rational64::from(1), Rational64::from(1)];
let p = &f * &f * &f * &g * &g; // (x+1)^3(x^2+x+1)^2
assert_eq!(p.square_free(), &f * &g); // (x+1)(x^2+x+1)
Trait Implementations§
Source§impl<M> Add<&Polynomial<M>> for &Polynomial<M>
impl<M> Add<&Polynomial<M>> for &Polynomial<M>
Source§type Output = Polynomial<M>
type Output = Polynomial<M>
+
operator.Source§impl<M> Add<&Polynomial<M>> for Polynomial<M>
impl<M> Add<&Polynomial<M>> for Polynomial<M>
Source§type Output = Polynomial<M>
type Output = Polynomial<M>
+
operator.Source§impl<M> Add<Polynomial<M>> for &Polynomial<M>
impl<M> Add<Polynomial<M>> for &Polynomial<M>
Source§type Output = Polynomial<M>
type Output = Polynomial<M>
+
operator.Source§impl<M> Add for Polynomial<M>
impl<M> Add for Polynomial<M>
Source§type Output = Polynomial<M>
type Output = Polynomial<M>
+
operator.Source§impl<M> AddAssign<&Polynomial<M>> for Polynomial<M>
impl<M> AddAssign<&Polynomial<M>> for Polynomial<M>
Source§fn add_assign(&mut self, other: &Self)
fn add_assign(&mut self, other: &Self)
+=
operation. Read moreSource§impl<M> AddAssign for Polynomial<M>
impl<M> AddAssign for Polynomial<M>
Source§fn add_assign(&mut self, rhs: Polynomial<M>)
fn add_assign(&mut self, rhs: Polynomial<M>)
+=
operation. Read moreSource§impl<T: Clone> Clone for Polynomial<T>
impl<T: Clone> Clone for Polynomial<T>
Source§fn clone(&self) -> Polynomial<T>
fn clone(&self) -> Polynomial<T>
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moreSource§impl<T: Debug> Debug for Polynomial<T>
impl<T: Debug> Debug for Polynomial<T>
Source§impl<T: Default> Default for Polynomial<T>
impl<T: Default> Default for Polynomial<T>
Source§fn default() -> Polynomial<T>
fn default() -> Polynomial<T>
Source§impl<R> Display for Polynomial<R>
impl<R> Display for Polynomial<R>
Source§impl<K> Div<&Polynomial<K>> for Polynomial<K>
impl<K> Div<&Polynomial<K>> for Polynomial<K>
Source§type Output = Polynomial<K>
type Output = Polynomial<K>
/
operator.Source§impl<R> Div<&R> for &Polynomial<R>
impl<R> Div<&R> for &Polynomial<R>
Source§impl<R> Div<&R> for Polynomial<R>
impl<R> Div<&R> for Polynomial<R>
Source§impl<K> Div<Polynomial<K>> for &Polynomial<K>
impl<K> Div<Polynomial<K>> for &Polynomial<K>
Source§type Output = Polynomial<K>
type Output = Polynomial<K>
/
operator.Source§impl<R> Div<R> for &Polynomial<R>
impl<R> Div<R> for &Polynomial<R>
Source§impl<R> Div<R> for Polynomial<R>
impl<R> Div<R> for Polynomial<R>
Source§impl<K> Div for &Polynomial<K>
impl<K> Div for &Polynomial<K>
Source§impl<K> Div for Polynomial<K>
impl<K> Div for Polynomial<K>
Source§type Output = Polynomial<K>
type Output = Polynomial<K>
/
operator.Source§impl<K> DivAssign<&Polynomial<K>> for Polynomial<K>
impl<K> DivAssign<&Polynomial<K>> for Polynomial<K>
Source§fn div_assign(&mut self, rhs: &Polynomial<K>)
fn div_assign(&mut self, rhs: &Polynomial<K>)
/=
operation. Read moreSource§impl<R> DivAssign<&R> for Polynomial<R>
impl<R> DivAssign<&R> for Polynomial<R>
Source§fn div_assign(&mut self, alpha: &R)
fn div_assign(&mut self, alpha: &R)
/=
operation. Read moreSource§impl<R> DivAssign<R> for Polynomial<R>
impl<R> DivAssign<R> for Polynomial<R>
Source§fn div_assign(&mut self, rhs: R)
fn div_assign(&mut self, rhs: R)
/=
operation. Read moreSource§impl<K> DivAssign for Polynomial<K>
impl<K> DivAssign for Polynomial<K>
Source§fn div_assign(&mut self, rhs: Polynomial<K>)
fn div_assign(&mut self, rhs: Polynomial<K>)
/=
operation. Read moreSource§impl<R> Mul<&Polynomial<R>> for Polynomial<R>
impl<R> Mul<&Polynomial<R>> for Polynomial<R>
Source§type Output = Polynomial<R>
type Output = Polynomial<R>
*
operator.Source§impl<R> Mul<&R> for &Polynomial<R>
impl<R> Mul<&R> for &Polynomial<R>
Source§impl<R> Mul<&R> for Polynomial<R>
impl<R> Mul<&R> for Polynomial<R>
Source§impl<R> Mul<Polynomial<R>> for &Polynomial<R>
impl<R> Mul<Polynomial<R>> for &Polynomial<R>
Source§type Output = Polynomial<R>
type Output = Polynomial<R>
*
operator.Source§impl<R> Mul<R> for &Polynomial<R>
impl<R> Mul<R> for &Polynomial<R>
Source§impl<R> Mul<R> for Polynomial<R>
impl<R> Mul<R> for Polynomial<R>
Source§impl<R> Mul for &Polynomial<R>
impl<R> Mul for &Polynomial<R>
Source§impl<R> Mul for Polynomial<R>
impl<R> Mul for Polynomial<R>
Source§type Output = Polynomial<R>
type Output = Polynomial<R>
*
operator.Source§impl<R> MulAssign<&Polynomial<R>> for Polynomial<R>
impl<R> MulAssign<&Polynomial<R>> for Polynomial<R>
Source§fn mul_assign(&mut self, rhs: &Polynomial<R>)
fn mul_assign(&mut self, rhs: &Polynomial<R>)
*=
operation. Read moreSource§impl<R> MulAssign<&R> for Polynomial<R>
impl<R> MulAssign<&R> for Polynomial<R>
Source§fn mul_assign(&mut self, alpha: &R)
fn mul_assign(&mut self, alpha: &R)
*=
operation. Read moreSource§impl<R> MulAssign<R> for Polynomial<R>
impl<R> MulAssign<R> for Polynomial<R>
Source§fn mul_assign(&mut self, rhs: R)
fn mul_assign(&mut self, rhs: R)
*=
operation. Read moreSource§impl<R> MulAssign for Polynomial<R>
impl<R> MulAssign for Polynomial<R>
Source§fn mul_assign(&mut self, rhs: Polynomial<R>)
fn mul_assign(&mut self, rhs: Polynomial<R>)
*=
operation. Read moreSource§impl<G> Neg for &Polynomial<G>
impl<G> Neg for &Polynomial<G>
Source§impl<G> Neg for Polynomial<G>
impl<G> Neg for Polynomial<G>
Source§impl<R> One for Polynomial<R>
impl<R> One for Polynomial<R>
Source§impl<T: PartialEq> PartialEq for Polynomial<T>
impl<T: PartialEq> PartialEq for Polynomial<T>
Source§impl<R> Product for Polynomial<R>
impl<R> Product for Polynomial<R>
Source§impl<K> Rem<&Polynomial<K>> for &Polynomial<K>
impl<K> Rem<&Polynomial<K>> for &Polynomial<K>
Source§type Output = Polynomial<K>
type Output = Polynomial<K>
%
operator.Source§impl<K> Rem<&Polynomial<K>> for Polynomial<K>
impl<K> Rem<&Polynomial<K>> for Polynomial<K>
Source§type Output = Polynomial<K>
type Output = Polynomial<K>
%
operator.Source§impl<K> Rem<Polynomial<K>> for &Polynomial<K>
impl<K> Rem<Polynomial<K>> for &Polynomial<K>
Source§type Output = Polynomial<K>
type Output = Polynomial<K>
%
operator.Source§impl<K> Rem for Polynomial<K>
impl<K> Rem for Polynomial<K>
Source§type Output = Polynomial<K>
type Output = Polynomial<K>
%
operator.Source§impl<K> RemAssign<&Polynomial<K>> for Polynomial<K>
impl<K> RemAssign<&Polynomial<K>> for Polynomial<K>
Source§fn rem_assign(&mut self, other: &Self)
fn rem_assign(&mut self, other: &Self)
%=
operation. Read moreSource§impl<K> RemAssign for Polynomial<K>
impl<K> RemAssign for Polynomial<K>
Source§fn rem_assign(&mut self, rhs: Polynomial<K>)
fn rem_assign(&mut self, rhs: Polynomial<K>)
%=
operation. Read moreSource§impl<K> RingNormalize for Polynomial<K>
impl<K> RingNormalize for Polynomial<K>
fn leading_unit(&self) -> Self
fn normalize_mut(&mut self)
fn into_normalize(self) -> Selfwhere
Self: Sized,
fn normalize(&self) -> Selfwhere
Self: Clone,
fn is_similar(&self, other: &Self) -> bool
Source§impl<G> Sub<&Polynomial<G>> for &Polynomial<G>
impl<G> Sub<&Polynomial<G>> for &Polynomial<G>
Source§type Output = Polynomial<G>
type Output = Polynomial<G>
-
operator.Source§impl<G> Sub<&Polynomial<G>> for Polynomial<G>
impl<G> Sub<&Polynomial<G>> for Polynomial<G>
Source§type Output = Polynomial<G>
type Output = Polynomial<G>
-
operator.Source§impl<G> Sub<Polynomial<G>> for &Polynomial<G>
impl<G> Sub<Polynomial<G>> for &Polynomial<G>
Source§type Output = Polynomial<G>
type Output = Polynomial<G>
-
operator.Source§impl<G> Sub for Polynomial<G>
impl<G> Sub for Polynomial<G>
Source§type Output = Polynomial<G>
type Output = Polynomial<G>
-
operator.Source§impl<G> SubAssign<&Polynomial<G>> for Polynomial<G>
impl<G> SubAssign<&Polynomial<G>> for Polynomial<G>
Source§fn sub_assign(&mut self, other: &Self)
fn sub_assign(&mut self, other: &Self)
-=
operation. Read moreSource§impl<G> SubAssign for Polynomial<G>
impl<G> SubAssign for Polynomial<G>
Source§fn sub_assign(&mut self, rhs: Polynomial<G>)
fn sub_assign(&mut self, rhs: Polynomial<G>)
-=
operation. Read more