hop_core/modules/
stream.rs1use 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
12pub struct StreamGenerator {
14 pub c: CompanionMatrix,
15 pub t: Mat, 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 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 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 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}