hop_core/modules/
stream.rs

1// Copyright (c) 2025 Lex Luger. All Rights Reserved.
2// This software (HOP-CORE) is proprietary and confidential.
3// Unauthorized copying, distribution, or use is strictly prohibited
4// without explicit written permission from the author.
5// Commercial licenses are available. Contact: lexluger.dev@proton.me
6use crate::modules::companion::CompanionMatrix;
7use crate::modules::poly_eval::poly_matrix_eval;
8use crate::modules::field::Field;
9use crate::modules::companion::Mat;
10use std::ops::{Add, Mul};
11
12/// Stream generator: state evolves v_{n+1} = C * v_n. Output is (T * v_n)[0]
13pub struct StreamGenerator {
14    pub c: CompanionMatrix,
15    pub t: Mat, // k×k matrix (element of centralizer)
16    pub state: Vec<Field>,
17    pub k: usize,
18}
19
20impl StreamGenerator {
21    pub fn new(c: CompanionMatrix, t: Mat, state: Vec<Field>) -> Self {
22        let k = c.k;
23        assert_eq!(state.len(), k);
24        assert_eq!(t.len(), k);
25        assert!(t.iter().all(|row| row.len() == k), "T matrix must be k×k");
26        StreamGenerator { c, t, state, k }
27    }
28
29    /// step: output current element (t * state)[0], then advance state by C
30    pub fn step(&mut self) -> Field {
31        let mut out = Field::zero();
32        for j in 0..self.k {
33            out = out.add(self.t[0][j].mul(self.state[j]));
34        }
35        self.state = self.c.mat_vec_mul(&self.state);
36        out
37    }
38
39    /// generate N outputs
40    pub fn generate(&mut self, n: usize) -> Vec<Field> {
41        let mut v = Vec::with_capacity(n);
42        for _ in 0..n {
43            v.push(self.step());
44        }
45        v
46    }
47
48    /// convenience: build T = poly(C) from g_coeffs
49    pub fn build_t_from_poly(cm: &CompanionMatrix, g_coeffs: &[u64]) -> Mat {
50        poly_matrix_eval(g_coeffs, &cm.mat)
51    }
52    
53  }
54
55impl Iterator for StreamGenerator {
56    type Item = Field;
57
58    fn next(&mut self) -> Option<Self::Item> {
59        Some(self.step())
60    }
61}