Struct feanor_math::rings::poly::sparse_poly::SparsePolyRingBase

source ·
pub struct SparsePolyRingBase<R: RingStore> { /* private fields */ }
Expand description

The univariate polynomial ring R[X]. Polynomials are stored as sparse vectors of coefficients, thus giving improved performance in the case that most coefficients are zero.

§Example

 
let ZZ = StaticRing::<i32>::RING;
let P = SparsePolyRing::new(ZZ, "X");
let x10_plus_1 = P.add(P.pow(P.indeterminate(), 10), P.int_hom().map(1));
let power = P.pow(x10_plus_1, 10);
assert_eq!(0, *P.coefficient_at(&power, 1));

This ring has a CanIsoFromTo to dense_poly::DensePolyRingBase.

 
let ZZ = StaticRing::<i32>::RING;
let P = SparsePolyRing::new(ZZ, "X");
let P2 = DensePolyRing::new(ZZ, "X");
let high_power_of_x = P.pow(P.indeterminate(), 10);
assert_el_eq!(&P2, &P2.pow(P2.indeterminate(), 10), &P.can_iso(&P2).unwrap().map(high_power_of_x));

Implementations§

source§

impl<R: RingStore> SparsePolyRingBase<R>

source

pub fn new(base_ring: R, unknown_name: &'static str) -> Self

Trait Implementations§

source§

impl<R, P> CanHomFrom<P> for SparsePolyRingBase<R>

§

type Homomorphism = <<<SparsePolyRingBase<R> as RingExtension>::BaseRing as RingStore>::Type as CanHomFrom<<<P as RingExtension>::BaseRing as RingStore>::Type>>::Homomorphism

source§

fn has_canonical_hom(&self, from: &P) -> Option<Self::Homomorphism>

source§

fn map_in( &self, from: &P, el: P::Element, hom: &Self::Homomorphism, ) -> Self::Element

source§

fn map_in_ref( &self, from: &S, el: &S::Element, hom: &Self::Homomorphism, ) -> Self::Element

source§

fn mul_assign_map_in( &self, from: &S, lhs: &mut Self::Element, rhs: S::Element, hom: &Self::Homomorphism, )

source§

fn mul_assign_map_in_ref( &self, from: &S, lhs: &mut Self::Element, rhs: &S::Element, hom: &Self::Homomorphism, )

source§

impl<R1, R2> CanHomFrom<SparsePolyRingBase<R1>> for SparsePolyRingBase<R2>
where R1: RingStore, R2: RingStore, R2::Type: CanHomFrom<R1::Type>,

§

type Homomorphism = <<R2 as RingStore>::Type as CanHomFrom<<R1 as RingStore>::Type>>::Homomorphism

source§

fn has_canonical_hom( &self, from: &SparsePolyRingBase<R1>, ) -> Option<Self::Homomorphism>

source§

fn map_in_ref( &self, from: &SparsePolyRingBase<R1>, el: &SparseVectorMut<Rc<R1>>, hom: &Self::Homomorphism, ) -> Self::Element

source§

fn map_in( &self, from: &SparsePolyRingBase<R1>, el: <SparsePolyRingBase<R1> as RingBase>::Element, hom: &Self::Homomorphism, ) -> Self::Element

source§

fn mul_assign_map_in( &self, from: &S, lhs: &mut Self::Element, rhs: S::Element, hom: &Self::Homomorphism, )

source§

fn mul_assign_map_in_ref( &self, from: &S, lhs: &mut Self::Element, rhs: &S::Element, hom: &Self::Homomorphism, )

source§

impl<R, P> CanIsoFromTo<P> for SparsePolyRingBase<R>

source§

impl<R1, R2> CanIsoFromTo<SparsePolyRingBase<R1>> for SparsePolyRingBase<R2>
where R1: RingStore, R2: RingStore, R2::Type: CanIsoFromTo<R1::Type>,

§

type Isomorphism = <<R2 as RingStore>::Type as CanIsoFromTo<<R1 as RingStore>::Type>>::Isomorphism

source§

fn has_canonical_iso( &self, from: &SparsePolyRingBase<R1>, ) -> Option<Self::Isomorphism>

source§

fn map_out( &self, from: &SparsePolyRingBase<R1>, el: Self::Element, iso: &Self::Isomorphism, ) -> SparseVectorMut<Rc<R1>>

source§

impl<R: RingStore + Clone> Clone for SparsePolyRingBase<R>

source§

fn clone(&self) -> Self

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<R> DivisibilityRing for SparsePolyRingBase<R>

source§

fn checked_left_div( &self, lhs: &Self::Element, rhs: &Self::Element, ) -> Option<Self::Element>

Checks whether there is an element x such that rhs * x = lhs, and returns it if it exists. Note that this does not have to be unique, if rhs is a left zero-divisor. In particular, this function will return any element in the ring if lhs = rhs = 0.
source§

fn is_unit(&self, x: &Self::Element) -> bool

source§

impl<R> EuclideanRing for SparsePolyRingBase<R>
where R: RingStore, R::Type: Field,

source§

fn euclidean_div_rem( &self, lhs: Self::Element, rhs: &Self::Element, ) -> (Self::Element, Self::Element)

source§

fn euclidean_deg(&self, val: &Self::Element) -> Option<usize>

source§

fn euclidean_div( &self, lhs: Self::Element, rhs: &Self::Element, ) -> Self::Element

source§

fn euclidean_rem( &self, lhs: Self::Element, rhs: &Self::Element, ) -> Self::Element

source§

impl<R> PartialEq for SparsePolyRingBase<R>
where R: RingStore,

source§

fn eq(&self, other: &Self) -> bool

This method tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
source§

impl<R> PolyRing for SparsePolyRingBase<R>
where R: RingStore,

§

type TermsIterator<'a> = TermIterator<'a, R> where Self: 'a

source§

fn indeterminate(&self) -> Self::Element

source§

fn terms<'a>(&'a self, f: &'a Self::Element) -> TermIterator<'a, R>

source§

fn add_assign_from_terms<I>(&self, lhs: &mut Self::Element, rhs: I)
where I: Iterator<Item = (El<Self::BaseRing>, usize)>,

source§

fn coefficient_at<'a>( &'a self, f: &'a Self::Element, i: usize, ) -> &'a El<Self::BaseRing>

source§

fn degree(&self, f: &Self::Element) -> Option<usize>

source§

fn div_rem_monic( &self, lhs: Self::Element, rhs: &Self::Element, ) -> (Self::Element, Self::Element)

source§

fn mul_assign_monomial(&self, lhs: &mut Self::Element, rhs_power: usize)

source§

fn map_terms<P, H>(&self, from: &P, el: &P::Element, hom: &H) -> Self::Element
where P: ?Sized + PolyRing, H: Homomorphism<<P::BaseRing as RingStore>::Type, <Self::BaseRing as RingStore>::Type>,

source§

fn evaluate<R, H>( &self, f: &Self::Element, value: &R::Element, hom: &H, ) -> R::Element
where R: ?Sized + RingBase, H: Homomorphism<<Self::BaseRing as RingStore>::Type, R>,

source§

impl<R> PrincipalIdealRing for SparsePolyRingBase<R>
where R: RingStore, R::Type: Field,

source§

fn extended_ideal_gen( &self, lhs: &Self::Element, rhs: &Self::Element, ) -> (Self::Element, Self::Element, Self::Element)

Computes a Bezout identity for the generator g of the ideal (lhs, rhs) as g = s * lhs + t * rhs. Read more
source§

fn ideal_gen(&self, lhs: &Self::Element, rhs: &Self::Element) -> Self::Element

Computes a generator g of the ideal (lhs, rhs) = (g), also known as greatest common divisor. Read more
source§

fn lcm(&self, lhs: &Self::Element, rhs: &Self::Element) -> Self::Element

Computes a generator of the ideal (lhs) ∩ (rhs), also known as least common multiple. Read more
source§

impl<R: RingStore> RingBase for SparsePolyRingBase<R>

§

type Element = SparseVectorMut<Rc<R>>

source§

fn clone_el(&self, val: &Self::Element) -> Self::Element

source§

fn add_assign_ref(&self, lhs: &mut Self::Element, rhs: &Self::Element)

source§

fn add_assign(&self, lhs: &mut Self::Element, rhs: Self::Element)

source§

fn sub_assign_ref(&self, lhs: &mut Self::Element, rhs: &Self::Element)

source§

fn negate_inplace(&self, lhs: &mut Self::Element)

source§

fn mul_assign(&self, lhs: &mut Self::Element, rhs: Self::Element)

source§

fn mul_assign_ref(&self, lhs: &mut Self::Element, rhs: &Self::Element)

source§

fn zero(&self) -> Self::Element

source§

fn from_int(&self, value: i32) -> Self::Element

source§

fn eq_el(&self, lhs: &Self::Element, rhs: &Self::Element) -> bool

source§

fn is_commutative(&self) -> bool

source§

fn is_noetherian(&self) -> bool

source§

fn dbg<'a>(&self, value: &Self::Element, out: &mut Formatter<'a>) -> Result

source§

fn square(&self, value: &mut Self::Element)

source§

fn mul_ref(&self, lhs: &Self::Element, rhs: &Self::Element) -> Self::Element

source§

fn mul_assign_int(&self, lhs: &mut Self::Element, rhs: i32)

source§

fn characteristic<I: IntegerRingStore>(&self, ZZ: &I) -> Option<El<I>>
where I::Type: IntegerRing,

Returns the characteristic of this ring as an element of the given implementation of ZZ. Read more
source§

fn one(&self) -> Self::Element

source§

fn neg_one(&self) -> Self::Element

source§

fn is_zero(&self, value: &Self::Element) -> bool

source§

fn is_one(&self, value: &Self::Element) -> bool

source§

fn is_neg_one(&self, value: &Self::Element) -> bool

source§

fn is_approximate(&self) -> bool

Returns whether this ring computes with approximations to elements. This would usually be the case for rings that are based on f32 or f64, to represent real or complex numbers. Read more
source§

fn negate(&self, value: Self::Element) -> Self::Element

source§

fn sub_assign(&self, lhs: &mut Self::Element, rhs: Self::Element)

source§

fn mul_int(&self, lhs: Self::Element, rhs: i32) -> Self::Element

source§

fn mul_int_ref(&self, lhs: &Self::Element, rhs: i32) -> Self::Element

source§

fn sub_self_assign(&self, lhs: &mut Self::Element, rhs: Self::Element)

Computes lhs := rhs - lhs.
source§

fn sub_self_assign_ref(&self, lhs: &mut Self::Element, rhs: &Self::Element)

Computes lhs := rhs - lhs.
source§

fn add_ref(&self, lhs: &Self::Element, rhs: &Self::Element) -> Self::Element

source§

fn add_ref_fst(&self, lhs: &Self::Element, rhs: Self::Element) -> Self::Element

source§

fn add_ref_snd(&self, lhs: Self::Element, rhs: &Self::Element) -> Self::Element

source§

fn add(&self, lhs: Self::Element, rhs: Self::Element) -> Self::Element

source§

fn sub_ref(&self, lhs: &Self::Element, rhs: &Self::Element) -> Self::Element

source§

fn sub_ref_fst(&self, lhs: &Self::Element, rhs: Self::Element) -> Self::Element

source§

fn sub_ref_snd(&self, lhs: Self::Element, rhs: &Self::Element) -> Self::Element

source§

fn sub(&self, lhs: Self::Element, rhs: Self::Element) -> Self::Element

source§

fn mul_ref_fst(&self, lhs: &Self::Element, rhs: Self::Element) -> Self::Element

source§

fn mul_ref_snd(&self, lhs: Self::Element, rhs: &Self::Element) -> Self::Element

source§

fn mul(&self, lhs: Self::Element, rhs: Self::Element) -> Self::Element

source§

fn pow_gen<R: IntegerRingStore>( &self, x: Self::Element, power: &El<R>, integers: R, ) -> Self::Element
where R::Type: IntegerRing,

Raises x to the power of an arbitrary, nonnegative integer given by a custom integer ring implementation. Read more
source§

fn sum<I>(&self, els: I) -> Self::Element
where I: Iterator<Item = Self::Element>,

source§

fn prod<I>(&self, els: I) -> Self::Element
where I: Iterator<Item = Self::Element>,

source§

impl<R: RingStore> RingExtension for SparsePolyRingBase<R>

§

type BaseRing = R

source§

fn base_ring<'a>(&'a self) -> &'a Self::BaseRing

source§

fn from(&self, x: El<Self::BaseRing>) -> Self::Element

source§

fn from_ref(&self, x: &El<Self::BaseRing>) -> Self::Element

source§

fn mul_assign_base(&self, lhs: &mut Self::Element, rhs: &El<Self::BaseRing>)

Computes lhs := lhs * rhs, where rhs is mapped into this ring via RingExtension::from_ref(). Note that this may be faster than self.mul_assign(lhs, self.from_ref(rhs)).
source§

impl<R> Domain for SparsePolyRingBase<R>
where R: RingStore, R::Type: Domain,

source§

impl<R> ImplGenericCanIsoFromToMarker for SparsePolyRingBase<R>
where R: RingStore,

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<R> ConvMulComputation for R
where R: RingBase + ?Sized,

source§

default fn karatsuba_threshold(&self) -> usize

Define a threshold from which on the default implementation of ConvMulComputation::add_assign_conv_mul() will use the Karatsuba algorithm. Read more
source§

fn add_assign_conv_mul<M>( &self, dst: &mut [<R as RingBase>::Element], lhs: &[<R as RingBase>::Element], rhs: &[<R as RingBase>::Element], memory_provider: &M, )
where M: MemoryProvider<<R as RingBase>::Element>,

Computes the convolution of lhs and rhs, and adds the result to dst. Read more
source§

impl<R, S> CooleyTuckeyButterfly<S> for R
where S: RingBase + ?Sized, R: RingBase + ?Sized,

source§

default fn butterfly<V, H>( &self, hom: &H, values: &mut V, twiddle: &<S as RingBase>::Element, i1: usize, i2: usize, )
where V: VectorViewMut<<R as RingBase>::Element>, H: Homomorphism<S, R>,

Should compute (values[i1], values[i2]) := (values[i1] + twiddle * values[i2], values[i1] - twiddle * values[i2])
source§

default fn inv_butterfly<V, H>( &self, hom: &H, values: &mut V, twiddle: &<S as RingBase>::Element, i1: usize, i2: usize, )
where V: VectorViewMut<<R as RingBase>::Element>, H: Homomorphism<S, R>,

Should compute (values[i1], values[i2]) := (values[i1] + values[i2], (values[i1] - values[i2]) * twiddle)
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<R> InnerProductComputation for R
where R: RingBase + ?Sized,

source§

default fn inner_product_ref_fst<'a, I>( &self, els: I, ) -> <R as RingBase>::Element
where I: Iterator<Item = (&'a <R as RingBase>::Element, <R as RingBase>::Element)>, <R as RingBase>::Element: 'a,

Computes the inner product sum_i lhs[i] * rhs[i].
source§

default fn inner_product_ref<'a, I>(&self, els: I) -> <R as RingBase>::Element
where I: Iterator<Item = (&'a <R as RingBase>::Element, &'a <R as RingBase>::Element)>, <R as RingBase>::Element: 'a,

Computes the inner product sum_i lhs[i] * rhs[i].
source§

default fn inner_product<I>(&self, els: I) -> <R as RingBase>::Element
where I: Iterator<Item = (<R as RingBase>::Element, <R as RingBase>::Element)>,

Computes the inner product sum_i lhs[i] * rhs[i].
source§

impl<T, U> Into<U> for T
where U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T> ToOwned for T
where T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

§

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

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
source§

impl<R> SelfIso for R
where R: CanIsoFromTo<R> + ?Sized,