ps_ecc/polynomial/implementations/
bitxor_assign.rs1use std::ops::BitXorAssign;
2
3use crate::{finite_field::add, Polynomial};
4
5impl BitXorAssign for Polynomial {
6 fn bitxor_assign(&mut self, rhs: Self) {
7 for (idx, &coef) in rhs.coefficients().iter().enumerate() {
8 self.coefficients[idx] = add(self.coefficients[idx], coef);
9 }
10
11 self.degree = self.degree.max(rhs.degree);
12 self.trim_degree();
13 }
14}
15
16impl BitXorAssign<&Self> for Polynomial {
17 fn bitxor_assign(&mut self, rhs: &Self) {
18 BitXorAssign::bitxor_assign(self, *rhs);
19 }
20}
21
22#[cfg(test)]
23#[allow(clippy::expect_used)]
24mod tests {
25 use crate::Polynomial;
26
27 #[test]
28 fn xor_assign_basic() {
29 let mut a = Polynomial::try_from(&[1u8, 2, 3][..]).expect("valid polynomial");
30 let b = Polynomial::try_from(&[4u8, 5, 6][..]).expect("valid polynomial");
31
32 a ^= b;
33
34 assert_eq!(a.coefficients(), &[1 ^ 4, 2 ^ 5, 3 ^ 6]);
35 }
36
37 #[test]
38 fn xor_assign_different_degrees() {
39 let mut a = Polynomial::try_from(&[1u8, 2][..]).expect("valid polynomial");
40 let b = Polynomial::try_from(&[3u8, 4, 5, 6][..]).expect("valid polynomial");
41
42 a ^= b;
43
44 assert_eq!(a.coefficients(), &[1 ^ 3, 2 ^ 4, 5, 6]);
45 }
46
47 #[test]
48 fn xor_assign_cancels_to_zero() {
49 let mut a = Polynomial::try_from(&[1u8, 2, 3][..]).expect("valid polynomial");
50 let b = Polynomial::try_from(&[1u8, 2, 3][..]).expect("valid polynomial");
51
52 a ^= b;
53
54 assert_eq!(a.degree(), 0);
55 assert_eq!(a.coefficients(), &[0]);
56 }
57
58 #[test]
59 fn xor_assign_with_reference() {
60 let mut a = Polynomial::try_from(&[1u8, 2, 3][..]).expect("valid polynomial");
61 let b = Polynomial::try_from(&[4u8, 5, 6][..]).expect("valid polynomial");
62
63 a ^= &b;
64
65 assert_eq!(a.coefficients(), &[1 ^ 4, 2 ^ 5, 3 ^ 6]);
66 }
67
68 #[test]
69 fn xor_assign_multiple() {
70 let mut a = Polynomial::try_from(&[1u8][..]).expect("valid polynomial");
71 let b = Polynomial::try_from(&[2u8][..]).expect("valid polynomial");
72 let c = Polynomial::try_from(&[4u8][..]).expect("valid polynomial");
73
74 a ^= b;
75 a ^= c;
76
77 assert_eq!(a.coefficients(), &[1 ^ 2 ^ 4]);
78 }
79}