polynomial_over_finite_prime_field/
ops.rs

1use crate::{PolynomialOverP, Sized};
2use num_traits::{One, Zero};
3use ring_algorithm::RingNormalize;
4use std::ops::{
5    Add, AddAssign, Div, DivAssign, Mul, MulAssign, Neg, Rem, RemAssign, Sub, SubAssign,
6};
7#[auto_impl_ops::auto_ops]
8impl<T> AddAssign<&PolynomialOverP<T>> for PolynomialOverP<T>
9where
10    T: Sized + Clone + Ord + Zero + for<'x> AddAssign<&'x T> + for<'x> SubAssign<&'x T>,
11    for<'x> &'x T: Add<Output = T> + Sub<Output = T> + Neg<Output = T> + Rem<Output = T>,
12{
13    fn add_assign(&mut self, other: &Self) {
14        self.add_assign_ref(other);
15    }
16}
17// Neg
18impl<T> Neg for PolynomialOverP<T>
19where
20    T: Sized + Clone + Neg<Output = T>,
21{
22    type Output = Self;
23    fn neg(self) -> Self::Output {
24        self.neg_impl()
25    }
26}
27impl<T> Neg for &PolynomialOverP<T>
28where
29    T: Sized + Clone,
30    for<'x> &'x T: Neg<Output = T>,
31{
32    type Output = PolynomialOverP<T>;
33    fn neg(self) -> Self::Output {
34        self.neg_ref()
35    }
36}
37
38#[auto_impl_ops::auto_ops]
39impl<T> SubAssign<&PolynomialOverP<T>> for PolynomialOverP<T>
40where
41    T: Sized + Clone + Ord + Zero + for<'x> AddAssign<&'x T> + for<'x> SubAssign<&'x T>,
42    for<'x> &'x T: Add<Output = T> + Sub<Output = T> + Neg<Output = T> + Rem<Output = T>,
43{
44    fn sub_assign(&mut self, other: &Self) {
45        self.sub_assign_ref(other)
46    }
47}
48
49#[auto_impl_ops::auto_ops]
50impl<T> Mul for &PolynomialOverP<T>
51where
52    T: Sized + Clone + Ord + Zero + for<'x> AddAssign<&'x T> + for<'x> SubAssign<&'x T>,
53    for<'x> &'x T:
54        Add<Output = T> + Sub<Output = T> + Neg<Output = T> + Mul<Output = T> + Rem<Output = T>,
55{
56    type Output = PolynomialOverP<T>;
57    fn mul(self, other: Self) -> Self::Output {
58        self.mul_impl(other)
59    }
60}
61
62#[auto_impl_ops::auto_ops]
63impl<T> Div for &PolynomialOverP<T>
64where
65    T: Sized
66        + Clone
67        + Ord
68        + Eq
69        + Zero
70        + One
71        + for<'x> AddAssign<&'x T>
72        + for<'x> SubAssign<&'x T>
73        + RingNormalize,
74    for<'x> &'x T:
75        Add<Output = T> + Sub<Output = T> + Mul<Output = T> + Div<Output = T> + Rem<Output = T>,
76{
77    type Output = PolynomialOverP<T>;
78    fn div(self, other: Self) -> Self::Output {
79        let mut f = self.clone();
80        f.division(other)
81    }
82}
83
84#[auto_impl_ops::auto_ops]
85impl<T> RemAssign<&PolynomialOverP<T>> for PolynomialOverP<T>
86where
87    T: Sized
88        + Clone
89        + Ord
90        + Eq
91        + Zero
92        + One
93        + for<'x> AddAssign<&'x T>
94        + for<'x> SubAssign<&'x T>
95        + RingNormalize,
96    for<'x> &'x T:
97        Add<Output = T> + Sub<Output = T> + Mul<Output = T> + Div<Output = T> + Rem<Output = T>,
98{
99    fn rem_assign(&mut self, other: &Self) {
100        self.division(other);
101    }
102}