+use core::borrow::Borrow;
use core::cmp::max;
use core::fmt::{Debug, Display, Formatter};
use core::ops::{Add, Mul, Sub};
+use itertools::Itertools;
-type Word = u64; // element type of the vectors we use
+pub type Word = u64; // element type of the vectors we use
const WORDLEVELS: usize = 6; // 2^{2^6} = 64 = size of Word
#[derive(Clone, PartialEq, Eq, Hash)]
}
}
+impl Borrow<[Word]> for FiniteNimber {
+ fn borrow(&self) -> &[Word] {
+ &self.0
+ }
+}
+
impl<'a> FiniteNimberRef<'a> {
fn zero() -> Self {
OneWord(0)
FiniteNimber(
self.as_slice()
.iter()
- .zip(other.as_slice().iter())
- .map(|(a, b)| a ^ b)
+ .cloned()
+ .zip_longest(other.as_slice().iter().cloned())
+ .map(|pair| pair.reduce(|a, b| a ^ b))
.collect(),
)
}
assert_eq!(FiniteNimber::from(vec![0xffff]).to_ref().level(), 4);
assert_eq!(FiniteNimber::from(vec![0x00010000]).to_ref().level(), 5);
assert_eq!(FiniteNimber::from(vec![0xffffffff]).to_ref().level(), 5);
- assert_eq!(FiniteNimber::from(vec![0x0000000100000000]).to_ref().level(), 6);
- assert_eq!(FiniteNimber::from(vec![0xffffffffffffffff]).to_ref().level(), 6);
+ assert_eq!(
+ FiniteNimber::from(vec![0x0000000100000000])
+ .to_ref()
+ .level(),
+ 6
+ );
+ assert_eq!(
+ FiniteNimber::from(vec![0xffffffffffffffff])
+ .to_ref()
+ .level(),
+ 6
+ );
- assert_eq!(FiniteNimber::from(vec![0x55, 0, 0, 0]).to_ref().level(), 3);
- assert_eq!(FiniteNimber::from(vec![0x55, 1, 0, 0]).to_ref().level(), 7);
- assert_eq!(FiniteNimber::from(vec![0x55, 1, 1, 0]).to_ref().level(), 8);
- assert_eq!(FiniteNimber::from(vec![0x55, 1, 1, 1]).to_ref().level(), 8);
+ assert_eq!(
+ FiniteNimber::from(vec![0x55, 0, 0, 0]).to_ref().level(),
+ 3
+ );
+ assert_eq!(
+ FiniteNimber::from(vec![0x55, 1, 0, 0]).to_ref().level(),
+ 7
+ );
+ assert_eq!(
+ FiniteNimber::from(vec![0x55, 1, 1, 0]).to_ref().level(),
+ 8
+ );
+ assert_eq!(
+ FiniteNimber::from(vec![0x55, 1, 1, 1]).to_ref().level(),
+ 8
+ );
}
#[test]
let a = FiniteNimber::from(vec![1, 1, 0, 0]);
let b = FiniteNimber::from(vec![1, 0, 1, 0]);
assert_eq!(a + b, FiniteNimber::from(vec![0, 1, 1, 0]));
+
+ let a = FiniteNimber::from(vec![1, 1, 1, 1]);
+ let b = FiniteNimber::from(2);
+ assert_eq!(a + b, FiniteNimber::from(vec![3, 1, 1, 1]));
}
#[test]