Skip to main content

ps_ecc/polynomial/implementations/
bitxor_assign.rs

1use 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}