From: Simon Tatham Date: Sat, 12 Apr 2025 09:11:18 +0000 (+0100) Subject: Small answers right, but large ones off by one level! X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ian/git?a=commitdiff_plain;h=52a3d1f5a7078b7f31d73f5569929a8738ae5537;p=nimber.git Small answers right, but large ones off by one level! --- diff --git a/examples/a382121.rs b/examples/a382121.rs index da22eb1..cad2a15 100644 --- a/examples/a382121.rs +++ b/examples/a382121.rs @@ -5,7 +5,7 @@ use std::collections::HashMap; use std::fmt::{Display, Formatter}; use std::ops::Add; -use nimber::FiniteNimber; +use nimber::{FiniteNimber, Word}; fn lowest_set_bit(n: &FiniteNimber) -> Option { let words: &[nimber::Word] = n.borrow(); @@ -52,7 +52,7 @@ impl Add<&Polynomial> for Polynomial { 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 { @@ -74,10 +74,11 @@ fn minimal_polynomial(n: &FiniteNimber) -> Polynomial { 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, @@ -95,12 +96,26 @@ fn minimal_polynomial(n: &FiniteNimber) -> Polynomial { } } } - 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 = + 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)); + } }