use std::fmt::{Display, Formatter};
use std::ops::Add;
-use nimber::FiniteNimber;
+use nimber::{FiniteNimber, Word};
fn lowest_set_bit(n: &FiniteNimber) -> Option<usize> {
let words: &[nimber::Word] = n.borrow();
impl Display for Polynomial {
fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), core::fmt::Error> {
- write!(f, "*0x")?;
+ write!(f, "0x")?;
let mut started = false;
for v in self.0.iter().rev() {
if started {
let mut map = HashMap::new();
let mut exp = 0;
- let mut val = FiniteNimber::from(1);
+ let mut power = FiniteNimber::from(1);
loop {
let mut comb = Polynomial::monomial(exp);
+ let mut val = power.clone();
loop {
let bit = match lowest_set_bit(&val) {
Some(bit) => bit,
}
}
}
- val = val * n;
+ power = power * n;
exp += 1;
}
}
+fn largest_nimber_in_subfield(level: usize) -> FiniteNimber {
+ match level.checked_sub(6) {
+ None => FiniteNimber::from((1 << (1 << level)) - 1),
+ Some(wordlevel) => {
+ let words = 1 << wordlevel;
+ let v: Vec<Word> =
+ std::iter::repeat(0xffffffffffffffff).take(words).collect();
+ FiniteNimber::from(v)
+ }
+ }
+}
+
fn main() {
- let n = FiniteNimber::from(0xff);
- println!("{} -> {}", &n, minimal_polynomial(&n));
+ for level in 0..12 {
+ let n = largest_nimber_in_subfield(level);
+ println!("{} -> {} -> {}", level, &n, minimal_polynomial(&n));
+ }
}