pub struct MultivariatePolyRingImplBase<R, O, M, const N: usize>{ /* private fields */ }
Expand description

Represents the multivariate polynomial ring R[X1, ..., XN] in N unknowns. Polynomials are stored as lists of their terms, ordered by the given monomial ordering.

Note that the specific ordering does not matter in principle, but when frequently accessing the leading monomial (as e.g. done by Groebner basis algorithms, see crate::algorithms::f4::f4()), choosing the ordering to match the ordering used for the GB algorithm can significantly improve performance.

Note that there is currently no implementation of multivariate polynomial rings with a number of unknowns chosen at runtime.

Trait Implementations§

source§

impl<R1, O1, M1, R2, O2, M2, const N1: usize, const N2: usize> CanHomFrom<MultivariatePolyRingImplBase<R2, O2, M2, N2>> for MultivariatePolyRingImplBase<R1, O1, M1, N1>

§

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

source§

fn has_canonical_hom( &self, from: &MultivariatePolyRingImplBase<R2, O2, M2, N2>, ) -> Option<Self::Homomorphism>

source§

fn map_in_ref( &self, from: &MultivariatePolyRingImplBase<R2, O2, M2, N2>, el: &<MultivariatePolyRingImplBase<R2, O2, M2, N2> as RingBase>::Element, hom: &Self::Homomorphism, ) -> Self::Element

source§

fn map_in( &self, from: &MultivariatePolyRingImplBase<R2, O2, M2, N2>, el: <MultivariatePolyRingImplBase<R2, O2, M2, N2> 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<R1, O1, M1, R2, O2, M2, const N1: usize, const N2: usize> CanIsoFromTo<MultivariatePolyRingImplBase<R2, O2, M2, N2>> for MultivariatePolyRingImplBase<R1, O1, M1, N1>

§

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

source§

fn has_canonical_iso( &self, from: &MultivariatePolyRingImplBase<R2, O2, M2, N2>, ) -> Option<Self::Isomorphism>

source§

fn map_out( &self, from: &MultivariatePolyRingImplBase<R2, O2, M2, N2>, el: Self::Element, iso: &Self::Isomorphism, ) -> <MultivariatePolyRingImplBase<R2, O2, M2, N2> as RingBase>::Element

source§

impl<R, O, M, const N: usize> Clone for MultivariatePolyRingImplBase<R, O, M, N>

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, O, M, const N: usize> MultivariatePolyRing for MultivariatePolyRingImplBase<R, O, M, N>

§

type MonomialVector = [u16; N]

§

type TermsIterator<'a> = MultivariatePolyRingBaseTermsIter<'a, R, O, M, N> where Self: 'a

source§

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

Returns all terms of the given polynomial. A term is a product c * m with a nonzero coefficient c (i.e. element of the base ring) and a monomial m.
source§

fn coefficient_at<'a>( &'a self, f: &'a Self::Element, m: &Monomial<Self::MonomialVector>, ) -> &'a El<Self::BaseRing>

Returns the coefficient of the polynomial of the given monomial. If the monomial does not appear in the polynomial, this returns zero.
source§

fn indeterminate_len(&self) -> usize

Returns the number of indeterminates, i.e. the transcendence degree of this ring over its base ring.
source§

fn indeterminate(&self, i: usize) -> Self::Element

Returns the i-th indeterminate/variable/unknown as a ring element
source§

fn mul_monomial( &self, el: &mut Self::Element, m: &Monomial<Self::MonomialVector>, )

Multiplies the given polynomial with a monomial.
source§

fn lm<'a, O2>( &'a self, f: &'a Self::Element, order: O2, ) -> Option<&'a Monomial<Self::MonomialVector>>
where O2: MonomialOrder,

Returns the leading monomial of the given polynomial. Read more
source§

fn create_monomial<I: ExactSizeIterator<Item = u16>>( &self, exponents: I, ) -> Monomial<Self::MonomialVector>

source§

fn evaluate<S, V, H>(&self, f: &Self::Element, values: V, hom: &H) -> S::Element
where S: ?Sized + RingBase, H: Homomorphism<R::Type, S>, V: VectorView<S::Element>,

source§

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

Add-assigns to the given polynomial the polynomial implicitly given by the iterator over terms.
source§

fn monomial(&self, m: &Monomial<Self::MonomialVector>) -> Self::Element

Returns the given monomial as a ring element
source§

fn lt<'a, O>( &'a self, f: &'a Self::Element, order: O, ) -> Option<(&'a El<Self::BaseRing>, &'a Monomial<Self::MonomialVector>)>
where O: MonomialOrder,

source§

fn specialize( &self, f: &Self::Element, var: usize, val: &Self::Element, ) -> Self::Element

Replaces the given indeterminate in the given polynomial by the value val. The implementation is optimized using the facts that only one indeterminate is replaced, and the new value is in the same ring (it can be a polynomial however).
source§

fn appearing_variables(&self, f: &Self::Element) -> BTreeMap<usize, u16>

Returns all variables appearing in the given polynomial, together with their respective degrees. Read more
source§

fn map_terms<P, H>(&self, from: &P, el: &P::Element, hom: &H) -> Self::Element

Computes the polynomial that results from applying hom to each coefficient of the input polynomial. This is used to implement MultivariatePolyRingStore::lifted_hom().
source§

impl<R, O, M, const N: usize> PartialEq for MultivariatePolyRingImplBase<R, O, M, N>

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, O, M, const N: usize> RingBase for MultivariatePolyRingImplBase<R, O, M, N>

§

type Element = <M as MemoryProvider<(<<R as RingStore>::Type as RingBase>::Element, Monomial<[u16; N]>)>>::Object

source§

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

source§

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

source§

fn mul_ref(&self, lhs: &Self::Element, rhs: &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 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 from_int(&self, value: i32) -> Self::Element

source§

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

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_commutative(&self) -> bool

source§

fn is_noetherian(&self) -> bool

source§

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

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 sub_assign_ref(&self, lhs: &mut Self::Element, rhs: &Self::Element)

source§

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

source§

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

source§

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

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 square(&self, value: &mut Self::Element)

source§

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

source§

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

source§

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

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_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, O, M, const N: usize> RingExtension for MultivariatePolyRingImplBase<R, O, M, N>

§

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 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§

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

Auto Trait Implementations§

§

impl<R, O, M, const N: usize> Freeze for MultivariatePolyRingImplBase<R, O, M, N>
where R: Freeze, M: Freeze, O: Freeze, <<R as RingStore>::Type as RingBase>::Element: Freeze,

§

impl<R, O, M, const N: usize> RefUnwindSafe for MultivariatePolyRingImplBase<R, O, M, N>

§

impl<R, O, M, const N: usize> Send for MultivariatePolyRingImplBase<R, O, M, N>
where R: Send, M: Send, O: Send, <<R as RingStore>::Type as RingBase>::Element: Send,

§

impl<R, O, M, const N: usize> Sync for MultivariatePolyRingImplBase<R, O, M, N>
where R: Sync, M: Sync, O: Sync, <<R as RingStore>::Type as RingBase>::Element: Sync,

§

impl<R, O, M, const N: usize> Unpin for MultivariatePolyRingImplBase<R, O, M, N>
where R: Unpin, M: Unpin, O: Unpin, <<R as RingStore>::Type as RingBase>::Element: Unpin,

§

impl<R, O, M, const N: usize> UnwindSafe for MultivariatePolyRingImplBase<R, O, M, N>

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,