chiark / gitweb /
Small answers right, but large ones off by one level!
authorSimon Tatham <anakin@pobox.com>
Sat, 12 Apr 2025 09:11:18 +0000 (10:11 +0100)
committerSimon Tatham <anakin@pobox.com>
Sat, 12 Apr 2025 09:11:18 +0000 (10:11 +0100)
examples/a382121.rs

index da22eb158e0f435916c144479a12c288bcd0c42d..cad2a15a1e8949f20cdb0f30dd67e37e4ac5ff2a 100644 (file)
@@ -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<usize> {
     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<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));
+    }
 }