tgfsr 0.0.1

TGFSR is a random number generator based on the TGFSR algorithm.
Documentation
const N: usize = 25;
const M: usize = 7;
const S: usize = 7;
const T: usize = 15;
const A: u32 = 0x8ebfd028;
const B: u32 = 0x2b5b2500;
const C: u32 = 0xdb8b0000;

pub struct State {
    x: [u32; N],
    k: usize,
    initialized: bool,
}

impl State {
    pub fn new() -> Self {
        State {
            x: [0; N],
            k: 0,
            initialized: false,
        }
    }

    pub fn initialize_seed(&mut self, seed: u32) {
        let mut seed = seed;
        for i in 0..N {
            self.x[i] = seed & 0xffffffff; // Mask to 32 bits
            seed = (seed.wrapping_mul(1313).wrapping_add(88897)) & 0xffffffff; // Update seed
        }
        self.k = N - 1; // Force immediate iteration
        self.initialized = true;
    }

    fn iterate_tgfsr(&mut self) {
        for i in 0..N - M {
            self.x[i] = self.x[i + M] ^ (self.x[i] >> 1) ^ if self.x[i] & 1 != 0 { A } else { 0 };
        }
        for i in N - M..N {
            self.x[i] =
                self.x[i + M - N] ^ (self.x[i] >> 1) ^ if self.x[i] & 1 != 0 { A } else { 0 };
        }
    }

    pub fn next(&mut self) -> u32 {
        if !self.initialized {
            self.initialize_seed(1); // Initialize if not initialized
        }
        self.k += 1;
        if self.k == N {
            self.iterate_tgfsr();
            self.k = 0;
        }
        let mut y = self.x[self.k] ^ ((self.x[self.k] << S) & B);
        y ^= (y << T) & C;
        y & 0xffffffff // Mask to 32 bits
    }

    pub fn random(&mut self) -> i32 {
        (self.next() & 0x7fffffff) as i32 // Return int in [0, 2^31-1]
    }
}