feanor_math::ring

Struct RingValue

Source
pub struct RingValue<R: RingBase> { /* private fields */ }
Expand description

The most fundamental crate::ring::RingStore. It is basically a no-op container, i.e. stores a crate::ring::RingBase object by value, and allows accessing it.

§Why is this necessary?

In fact, that we need this trait is just the result of a technical detail. We cannot implement

impl<R: RingBase> RingStore for R {}
impl<'a, R: RingStore> RingStore for &'a R {}

since this might cause conflicting implementations. Instead, we implement

impl<R: RingBase> RingStore for RingValue<R> {}
impl<'a, R: RingStore> RingStore for &'a R {}

This causes some inconvenience, as now we cannot chain crate::ring::RingStore in the case of crate::ring::RingValue. Furthermore, this trait will be necessary everywhere - to define a reference to a ring of type A, we now have to write &RingValue<A>.

To simplify this, we propose to use the following simple pattern: Create your ring type as

struct ABase { ... }
impl RingBase for ABase { ... } 

and then provide a type alias

type A = RingValue<ABase>;

Implementations§

Source§

impl<R: RingBase> RingValue<R>

Source

pub const fn from(value: R) -> Self

Wraps the given RingBase in a RingValue.

This is a dedicated function instead of an implementation of std::convert::From so that we can declare it const.

Source

pub fn from_ref<'a>(value: &'a R) -> &'a Self

Creates a reference to a RingValue from a reference to the RingBase.

Source

pub fn into(self) -> R

Unwraps the RingBase.

The more common case would be to get a reference, which can be done with RingStore::get_ring().

Source§

impl<T: PrimitiveInt> RingValue<StaticRingBase<T>>

Source

pub const RING: StaticRing<T>

The singleton ring instance of StaticRing.

Source§

impl<A: Allocator + Clone> RingValue<RustBigintRingBase<A>>

Source

pub fn new_with(allocator: A) -> RustBigintRing<A>

§Availability

This API is marked as unstable and is only available when the unstable-enable crate feature is enabled. This comes with no stability guarantees, and could be changed or removed at any time.

Source§

impl RingValue<RustBigintRingBase>

Source

pub const RING: RustBigintRing

Default instance of RustBigintRing, the ring of arbitrary-precision integers.

Source§

impl<I: RingStore> RingValue<ZnBase<I>>
where I::Type: IntegerRing,

Source

pub fn new(integer_ring: I, modulus: El<I>) -> Self

Source§

impl RingValue<ZnBase>

Source

pub fn new(modulus: u64) -> Self

Source§

impl RingValue<ZnFastmulBase>

Source

pub fn new(base: Zn) -> Option<Self>

Source§

impl<const N: u64, const IS_FIELD: bool> RingValue<ZnBase<N, IS_FIELD>>

Source

pub const RING: Self

§Availability

This API is marked as unstable and is only available when the unstable-enable crate feature is enabled. This comes with no stability guarantees, and could be changed or removed at any time.

Source§

impl<C: RingStore, J: RingStore> RingValue<ZnBase<C, J>>

Source

pub fn new(summands: Vec<C>, large_integers: J) -> Self

Creates a new ring for Z/nZ with n = m1 ... mr where the mi are the moduli of the given component rings. Furthermore, the corresponding large integer ring must be provided, which has to be able to store values of size at least n^3.

Source§

impl<J: RingStore> RingValue<ZnBase<RingValue<ZnBase>, J>>

Source

pub fn create_from_primes(primes: Vec<i64>, large_integers: J) -> Self

Source§

impl<C: RingStore, J: RingStore, A: Allocator + Clone> RingValue<ZnBase<C, J, A>>

Source

pub fn new_with( summands: Vec<C>, large_integers: J, element_allocator: A, ) -> Self

Creates a new ring for Z/nZ with n = m1 ... mr where the mi are the moduli of the given component rings. Furthermore, the corresponding large integer ring must be provided, which has to be able to store values of size at least n^3.

§Availability

This API is marked as unstable and is only available when the unstable-enable crate feature is enabled. This comes with no stability guarantees, and could be changed or removed at any time.

Source§

impl<C: RingStore, J: RingStore, A: Allocator + Clone> RingValue<ZnBase<C, J, A>>

Source

pub fn from_congruence<I>(&self, el: I) -> ZnEl<C, A>
where I: IntoIterator<Item = El<C>>,

Given values ai for each component ring Z/miZ, computes the unique element in this ring Z/nZ that is congruent to ai modulo mi. The “opposite” function is Zn::get_congruence().

Source

pub fn get_congruence<'a>( &self, el: &'a ZnEl<C, A>, ) -> impl 'a + VectorView<El<C>>

Given a in Z/nZ, returns the vector whose i-th entry is a mod mi, where the mi are the moduli of the component rings of this ring.

Source§

impl<R: RingStore> RingValue<DensePolyRingBase<R>>

Source

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

Source§

impl<R: RingStore, A: Allocator + Clone, C: ConvolutionAlgorithm<R::Type>> RingValue<DensePolyRingBase<R, A, C>>

Source

pub fn new_with( base_ring: R, unknown_name: &'static str, element_allocator: A, convolution_algorithm: C, ) -> Self

§Availability

This API is marked as unstable and is only available when the unstable-enable crate feature is enabled. This comes with no stability guarantees, and could be changed or removed at any time.

Source§

impl<R: RingStore> RingValue<SparsePolyRingBase<R>>

Source

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

Source§

impl RingValue<Complex64Base>

Source

pub const RING: Self

Source

pub const I: Complex64El

Source§

impl RingValue<Complex64Base>

Source

pub fn abs(&self, val: Complex64El) -> f64

Source

pub fn conjugate(&self, val: Complex64El) -> Complex64El

Source

pub fn exp(&self, exp: Complex64El) -> Complex64El

Source

pub fn closest_gaussian_int(&self, val: Complex64El) -> (i64, i64)

Source

pub fn ln_main_branch(&self, val: Complex64El) -> Complex64El

Source

pub fn is_absolute_approx_eq( &self, lhs: Complex64El, rhs: Complex64El, absolute_threshold: f64, ) -> bool

Source

pub fn is_relative_approx_eq( &self, lhs: Complex64El, rhs: Complex64El, relative_limit: f64, ) -> bool

Source

pub fn is_approx_eq( &self, lhs: Complex64El, rhs: Complex64El, precision: u64, ) -> bool

Source

pub fn from_f64(&self, x: f64) -> Complex64El

Source

pub fn root_of_unity(&self, i: i64, n: i64) -> Complex64El

Source

pub fn re(&self, x: Complex64El) -> f64

Source

pub fn im(&self, x: Complex64El) -> f64

Source§

impl RingValue<Real64Base>

Source§

impl<R, V> RingValue<FreeAlgebraImplBase<R, V>>
where R: RingStore, V: VectorView<El<R>>,

Source

pub fn new(base_ring: R, rank: usize, x_pow_rank: V) -> Self

Creates a new FreeAlgebraImpl ring as extension of the given base ring.

The created ring is R[X]/(X^rank - sum_i x_pow_rank[i] X^i).

Source§

impl<R, V, A, C> RingValue<FreeAlgebraImplBase<R, V, A, C>>

Source

pub fn new_with( base_ring: R, rank: usize, x_pow_rank: V, gen_name: &'static str, element_allocator: A, convolution: C, ) -> Self

§Availability

This API is marked as unstable and is only available when the unstable-enable crate feature is enabled. This comes with no stability guarantees, and could be changed or removed at any time.

Source§

impl RingValue<GaloisFieldBase<RingValue<AsFieldBase<RingValue<FreeAlgebraImplBase<RingValue<AsFieldBase<RingValue<ZnBase>>>, SparseMapVector<RingValue<AsFieldBase<RingValue<ZnBase>>>>>>>>>>

Source

pub fn new(p: i64, degree: usize) -> Self

Creates a new instance of the finite/galois field GF(p^degree).

If you need more options for configuration, consider using GaloisField::new_with() or the most general GaloisField::create().

§Example
let F25 = GaloisField::new(5, 2);
let generator = F25.canonical_gen();
let norm = F25.mul_ref_fst(&generator, F25.pow(F25.clone_el(&generator), 5));
let inclusion = F25.inclusion();
// the norm must be an element of the prime field
assert!(F25.base_ring().elements().any(|x| {
    F25.eq_el(&norm, &inclusion.map(x))
}));
Source§

impl<R, A, C> RingValue<GaloisFieldBase<RingValue<AsFieldBase<RingValue<FreeAlgebraImplBase<R, SparseMapVector<R>, A, C>>>>>>

Source

pub fn new_with( base_field: R, degree: usize, allocator: A, convolution_algorithm: C, ) -> Self

Creates a new instance of a finite/galois field, as given-degree extension of the given base ring. The base ring must have prime characteristic.

If you need to specify the minimal polynomial used, see also GaloisField::create().

§Example

Sometimes it is useful to have the base ring also be a field. This can e.g. be achieved by

#![feature(allocator_api)]
let F25 = GaloisField::new_with(Zn::new(5).as_field().ok().unwrap(), 2, Global, STANDARD_CONVOLUTION);
let generator = F25.canonical_gen();
let norm = F25.mul_ref_fst(&generator, F25.pow(F25.clone_el(&generator), 5));
let inclusion = F25.inclusion();
// the norm must be an element of the prime field
assert!(F25.base_ring().elements().any(|x| {
    F25.eq_el(&norm, &inclusion.map(x))
}));
§Availability

This API is marked as unstable and is only available when the unstable-enable crate feature is enabled. This comes with no stability guarantees, and could be changed or removed at any time.

Source§

impl<Impl> RingValue<GaloisFieldBase<Impl>>

Source

pub fn create(base: Impl) -> Self

Most generic function to create a finite/galois field.

It allows specifying all associated data. Note also that the passed implementation must indeed be a field, and this is not checked at runtime. Passing a non-field is impossible, unless AsFieldBase::promise_is_field() is used.

§Availability

This API is marked as unstable and is only available when the unstable-enable crate feature is enabled. This comes with no stability guarantees, and could be changed or removed at any time.

Source§

impl RingValue<NumberFieldBase<RingValue<AsFieldBase<RingValue<FreeAlgebraImplBase<RingValue<RationalFieldBase<RingValue<MPZBase>>>, Vec<<<RingValue<RationalFieldBase<RingValue<MPZBase>>> as RingStore>::Type as RingBase>::Element>>>>>, RingValue<MPZBase>>>

Source

pub fn try_new<P>(poly_ring: P, generating_poly: &El<P>) -> Option<Self>

If the given polynomial is irreducible, returns the number field generated by it (with a root of the polynomial as canonical generator). Otherwise, None is returned.

If the given polynomial is not integral or not monic, consider using NumberField::try_adjoin_root() instead.

§Availability

This API is marked as unstable and is only available when the unstable-enable crate feature is enabled. This comes with no stability guarantees, and could be changed or removed at any time.

Source

pub fn new<P>(poly_ring: P, generating_poly: &El<P>) -> Self

Given a monic, integral and irreducible polynomial, returns the number field generated by it (with a root of the polynomial as canonical generator).

Panics if the polynomial is not irreducible.

If the given polynomial is not integral or not monic, consider using NumberField::adjoin_root() instead.

§Availability

This API is marked as unstable and is only available when the unstable-enable crate feature is enabled. This comes with no stability guarantees, and could be changed or removed at any time.

Source

pub fn try_adjoin_root<P>( poly_ring: P, generating_poly: &El<P>, ) -> Option<(Self, El<Self>)>

If the given polynopmial is irreducible, computes the number field generated by one of its roots, and returns it together with the root (which is not necessarily the canonical generator of the number field). Otherwise, None is returned.

§Availability

This API is marked as unstable and is only available when the unstable-enable crate feature is enabled. This comes with no stability guarantees, and could be changed or removed at any time.

Source

pub fn adjoin_root<P>(poly_ring: P, generating_poly: &El<P>) -> (Self, El<Self>)

§Availability

This API is marked as unstable and is only available when the unstable-enable crate feature is enabled. This comes with no stability guarantees, and could be changed or removed at any time.

Source§

impl<Impl, I> RingValue<NumberFieldBase<Impl, I>>

Source

pub fn create(implementation: Impl) -> Self

Creates a new number field with the given underlying implementation.

Requires that all coefficients of the generating polynomial are integral.

§Availability

This API is marked as unstable and is only available when the unstable-enable crate feature is enabled. This comes with no stability guarantees, and could be changed or removed at any time.

Source§

impl<R> RingValue<MultivariatePolyRingImplBase<R>>
where R: RingStore,

Source

pub fn new(base_ring: R, variable_count: usize) -> Self

Creates a new instance of the ring base_ring[X0, ..., Xn] where n = variable_count - 1.

Source§

impl<R, A> RingValue<MultivariatePolyRingImplBase<R, A>>
where R: RingStore, A: Clone + Allocator + Send,

Source

pub fn new_with( base_ring: R, variable_count: usize, max_supported_deg: u16, max_multiplication_table: (u16, u16), allocator: A, ) -> Self

Creates a new instance of the ring base_ring[X0, ..., Xn] where n = variable_count - 1.

The can represent all monomials up to the given degree, and will panic should an operation produce a monomial that exceeds this degree.

Furthermore, max_multiplication_table = (d1, d2) configures for which monomials a multiplication table is precomputed. In particular, a multiplication table is precomputed for all products where one summand has degree <= d2 and the other summand has degree <= d1. Note that d1 <= d2 is required.

§Availability

This API is marked as unstable and is only available when the unstable-enable crate feature is enabled. This comes with no stability guarantees, and could be changed or removed at any time.

Source§

impl<I> RingValue<RationalFieldBase<I>>
where I: RingStore, I::Type: IntegerRing,

Source

pub const fn new(integers: I) -> Self

Source

pub fn num<'a>(&'a self, el: &'a El<Self>) -> &'a El<I>

Source

pub fn den<'a>(&'a self, el: &'a El<Self>) -> &'a El<I>

Source§

impl RingValue<MPZBase>

Source

pub const RING: MPZ

Available on crate feature mpir only.
Source§

impl<R> RingValue<AsLocalPIRBase<R>>
where R: RingStore, R::Type: ZnRing,

Source

pub fn from_zn(ring: R) -> Option<Self>

§Availability

This API is marked as unstable and is only available when the unstable-enable crate feature is enabled. This comes with no stability guarantees, and could be changed or removed at any time.

Source§

impl<R> RingValue<AsLocalPIRBase<R>>
where R: RingStore, R::Type: Field,

Source

pub fn from_field(ring: R) -> Self

§Availability

This API is marked as unstable and is only available when the unstable-enable crate feature is enabled. This comes with no stability guarantees, and could be changed or removed at any time.

Source§

impl<R> RingValue<AsLocalPIRBase<R>>

Source

pub fn from_localpir(ring: R) -> Self

§Availability

This API is marked as unstable and is only available when the unstable-enable crate feature is enabled. This comes with no stability guarantees, and could be changed or removed at any time.

Source§

impl<R> RingValue<AsLocalPIRBase<R>>

Source

pub fn from_as_field(ring: AsField<R>) -> Self

§Availability

This API is marked as unstable and is only available when the unstable-enable crate feature is enabled. This comes with no stability guarantees, and could be changed or removed at any time.

Trait Implementations§

Source§

impl<R: Clone + RingBase> Clone for RingValue<R>

Source§

fn clone(&self) -> RingValue<R>

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: Debug + RingBase> Debug for RingValue<R>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<R: RingBase + Default> Default for RingValue<R>

Source§

fn default() -> Self

Returns the “default value” for a type. Read more
Source§

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

Source§

type Type = R

The type of the stored ring.
Source§

fn get_ring(&self) -> &R

Returns a reference to the stored ring.
Source§

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

Source§

fn add_assign_ref(&self, lhs: &mut El<Self>, rhs: &El<Self>)

Source§

fn add_assign(&self, lhs: &mut El<Self>, rhs: El<Self>)

Source§

fn sub_assign_ref(&self, lhs: &mut El<Self>, rhs: &El<Self>)

Source§

fn sub_self_assign(&self, lhs: &mut El<Self>, rhs: El<Self>)

Source§

fn sub_self_assign_ref(&self, lhs: &mut El<Self>, rhs: &El<Self>)

Source§

fn negate_inplace(&self, lhs: &mut El<Self>)

Source§

fn mul_assign(&self, lhs: &mut El<Self>, rhs: El<Self>)

Source§

fn mul_assign_ref(&self, lhs: &mut El<Self>, rhs: &El<Self>)

Source§

fn zero(&self) -> El<Self>

Source§

fn one(&self) -> El<Self>

Source§

fn neg_one(&self) -> El<Self>

Source§

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

Source§

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

Source§

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

Source§

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

Source§

fn is_commutative(&self) -> bool

Source§

fn is_noetherian(&self) -> bool

Source§

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

Source§

fn sub_assign(&self, lhs: &mut El<Self>, rhs: El<Self>)

Source§

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

Source§

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

Source§

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

Source§

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

Source§

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

Source§

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

Source§

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

Source§

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

Source§

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

Source§

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

Source§

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

Source§

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

Source§

fn square(&self, value: &mut El<Self>)

Source§

fn coerce<S>(&self, from: &S, el: El<S>) -> El<Self>
where S: RingStore, Self::Type: CanHomFrom<S::Type>,

Tries to map the given element into this ring. Read more
Source§

fn into_identity(self) -> Identity<Self>

Returns the identity map self -> self.
Source§

fn identity<'a>(&'a self) -> Identity<&'a Self>

Returns the identity map self -> self.
Source§

fn into_can_hom<S>(self, from: S) -> Result<CanHom<S, Self>, (S, Self)>
where Self: Sized, S: RingStore, Self::Type: CanHomFrom<S::Type>,

Returns the canonical homomorphism from -> self, if it exists, moving both rings into the CanHom object.
Source§

fn into_can_iso<S>(self, from: S) -> Result<CanIso<S, Self>, (S, Self)>
where Self: Sized, S: RingStore, Self::Type: CanIsoFromTo<S::Type>,

Returns the canonical isomorphism from -> self, if it exists, moving both rings into the CanHom object.
Source§

fn can_hom<'a, S>(&'a self, from: &'a S) -> Option<CanHom<&'a S, &'a Self>>
where S: RingStore, Self::Type: CanHomFrom<S::Type>,

Returns the canonical homomorphism from -> self, if it exists.
Source§

fn can_iso<'a, S>(&'a self, from: &'a S) -> Option<CanIso<&'a S, &'a Self>>
where S: RingStore, Self::Type: CanIsoFromTo<S::Type>,

Returns the canonical isomorphism from -> self, if it exists.
Source§

fn into_int_hom(self) -> IntHom<Self>

Returns the homomorphism Z -> self that exists for any ring.
Source§

fn int_hom<'a>(&'a self) -> IntHom<&'a Self>

Returns the homomorphism Z -> self that exists for any ring.
Source§

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

Computes the sum of all elements returned by the iterator. Read more
Source§

fn try_sum<I, E>(&self, els: I) -> Result<El<Self>, E>
where I: IntoIterator<Item = Result<El<Self>, E>>,

Equivalent of RingStore::sum() if the producer of the ring elements can fail, in which case summation is aborted and the error returned.
Source§

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

Computes the product of all elements returned by the iterator. Read more
Source§

fn pow(&self, x: El<Self>, power: usize) -> El<Self>

Raises the given element to the given power.
Source§

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

Raises the given element to the given power, which should be a positive integer belonging to an arbitrary IntegerRing. Read more
Source§

fn format<'a>( &'a self, value: &'a El<Self>, ) -> RingElementDisplayWrapper<'a, Self>

Returns an object that represents the given ring element and implements std::fmt::Display, to use as formatting parameter. Read more
Source§

fn println(&self, value: &El<Self>)

Prints the given element. Use for quick & dirty debugging.
Source§

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

Source§

impl<R: Copy + RingBase> Copy for RingValue<R>

Auto Trait Implementations§

§

impl<R> Freeze for RingValue<R>
where R: Freeze,

§

impl<R> RefUnwindSafe for RingValue<R>
where R: RefUnwindSafe,

§

impl<R> Send for RingValue<R>
where R: Send,

§

impl<R> Sync for RingValue<R>
where R: Sync,

§

impl<R> Unpin for RingValue<R>
where R: Unpin,

§

impl<R> UnwindSafe for RingValue<R>
where R: UnwindSafe,

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<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dst: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
Source§

impl<R> DivisibilityRingStore for R

Source§

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

Source§

fn divides_left(&self, lhs: &El<Self>, rhs: &El<Self>) -> bool

Source§

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

Source§

fn checked_div(&self, lhs: &El<Self>, rhs: &El<Self>) -> Option<El<Self>>

Source§

fn divides(&self, lhs: &El<Self>, rhs: &El<Self>) -> bool

Source§

fn invert(&self, lhs: &El<Self>) -> Option<El<Self>>

Source§

impl<R> EuclideanRingStore for R

Source§

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

Source§

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

Source§

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

Source§

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

Source§

impl<R> FiniteRingStore for R
where R: RingStore, <R as RingStore>::Type: FiniteRing,

Source§

fn elements<'a>(&'a self) -> <Self::Type as FiniteRing>::ElementsIter<'a>

Source§

fn random_element<G: FnMut() -> u64>(&self, rng: G) -> El<Self>

Source§

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

Source§

impl<R> FreeAlgebraStore for R
where R: RingStore, <R as RingStore>::Type: FreeAlgebra,

Source§

fn canonical_gen(&self) -> El<Self>

Source§

fn rank(&self) -> usize

Source§

fn trace(&self, el: El<Self>) -> El<<Self::Type as RingExtension>::BaseRing>

Source§

fn wrt_canonical_basis<'a>( &'a self, el: &'a El<Self>, ) -> <Self::Type as FreeAlgebra>::VectorRepresentation<'a>

Source§

fn from_canonical_basis<V>(&self, vec: V) -> El<Self>

Source§

fn from_canonical_basis_extended<V>(&self, vec: V) -> El<Self>
where V: IntoIterator<Item = El<<Self::Type as RingExtension>::BaseRing>>,

Source§

fn generating_poly<P, H>(&self, poly_ring: P, hom: H) -> El<P>

Returns the generating polynomial of this ring, i.e. the monic polynomial f(X) such that this ring is isomorphic to R[X]/(f(X)), where R is the base ring.
Source§

fn as_field(self) -> Result<AsField<Self>, Self>

If this ring is a field, returns a wrapper around this ring that implements crate::field::FieldStore. Read more
Source§

fn poly_repr<P, H>(&self, to: P, el: &El<Self>, hom: H) -> El<P>

Returns the polynomial representation of the given element y, i.e. the polynomial f(X) of degree at most FreeAlgebraStore::rank() such that f(x) = y, where y is the canonical generator of this ring, as given by FreeAlgebraStore::canonical_gen().
Source§

fn discriminant(&self) -> El<<Self::Type as RingExtension>::BaseRing>

Computes the discriminant of the canonical basis of this ring extension, which is defined as the determinant of the trace matrix (Tr(a^(i + j))), where a is the canonical generator of this ring extension. Read more
Source§

fn charpoly<P, H>(&self, el: &El<Self>, poly_ring: P, hom: H) -> El<P>

Source§

fn with_wrapped_generator<'a, F, const M: usize>( &'a self, f: F, ) -> [El<Self>; M]
where F: FnOnce(&RingElementWrapper<&'a Self>) -> [RingElementWrapper<&'a Self>; M],

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<R> HashableElRingStore for R

Source§

fn hash<H: Hasher>(&self, el: &El<Self>, h: &mut H)

Source§

fn default_hash(&self, el: &El<Self>) -> u64

Computes a hash of the given element using some default hasher. Read more
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> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<R> LinSolveRingStore for R
where R: RingStore, <R as RingStore>::Type: LinSolveRing,

Source§

fn solve_right<V1, V2, V3>( &self, lhs: SubmatrixMut<'_, V1, El<Self>>, rhs: SubmatrixMut<'_, V2, El<Self>>, out: SubmatrixMut<'_, V3, El<Self>>, ) -> SolveResult
where V1: AsPointerToSlice<El<Self>>, V2: AsPointerToSlice<El<Self>>, V3: AsPointerToSlice<El<Self>>,

Solves a linear system lhs * X = rhs. Read more
Source§

fn solve_right_with<V1, V2, V3, A>( &self, lhs: SubmatrixMut<'_, V1, El<Self>>, rhs: SubmatrixMut<'_, V2, El<Self>>, out: SubmatrixMut<'_, V3, El<Self>>, allocator: A, ) -> SolveResult
where V1: AsPointerToSlice<El<Self>>, V2: AsPointerToSlice<El<Self>>, V3: AsPointerToSlice<El<Self>>, A: Allocator,

Solves a linear system lhs * X = rhs. Read more
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<R> PrincipalIdealRingStore for R

Source§

fn checked_div_min(&self, lhs: &El<Self>, rhs: &El<Self>) -> Option<El<Self>>

Source§

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

Source§

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

Source§

fn annihilator(&self, val: &El<Self>) -> El<Self>

Source§

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

Source§

fn gcd(&self, lhs: &El<Self>, rhs: &El<Self>) -> El<Self>

Source§

impl<R> RingExtensionStore for R

Source§

fn base_ring(&self) -> &<Self::Type as RingExtension>::BaseRing

Source§

fn into_inclusion(self) -> Inclusion<Self>

Returns the inclusion map of the base ring R -> self.
Source§

fn inclusion<'a>(&'a self) -> Inclusion<&'a Self>

Returns the inclusion map of the base ring R -> self.
Source§

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

Source§

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

Source§

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

Source§

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> ZnRingStore for R
where R: RingStore, <R as RingStore>::Type: ZnRing,