polynomial_over_finite_prime_field/
ops.rs1use 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}
17impl<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}