binius_math/
test_utils.rs1use std::iter::repeat_with;
4
5use binius_field::{BinaryField128bGhash, Field, PackedBinaryGhash4x128b, PackedField};
6use rand::RngCore;
7
8use crate::FieldBuffer;
9
10pub type B128 = BinaryField128bGhash;
12
13pub type Packed128b = PackedBinaryGhash4x128b;
15
16pub fn random_scalars<F: Field>(mut rng: impl RngCore, n: usize) -> Vec<F> {
27 repeat_with(|| F::random(&mut rng)).take(n).collect()
28}
29
30pub fn random_field_buffer<P: PackedField>(mut rng: impl RngCore, log_n: usize) -> FieldBuffer<P> {
41 FieldBuffer::<P>::new(
42 log_n,
43 repeat_with(|| P::random(&mut rng))
44 .take(1 << log_n.saturating_sub(P::LOG_WIDTH))
45 .collect(),
46 )
47 .expect("correct number of packed elements are generated")
48}
49
50pub fn index_to_hypercube_point<F: Field>(n_vars: usize, index: usize) -> Vec<F> {
75 debug_assert!(
76 index < (1 << n_vars),
77 "Index {index} out of bounds for {n_vars}-variable hypercube"
78 );
79 (0..n_vars)
80 .map(|i| {
81 if (index >> i) & 1 == 1 {
82 F::ONE
83 } else {
84 F::ZERO
85 }
86 })
87 .collect()
88}
89
90#[cfg(test)]
91mod tests {
92 use binius_field::BinaryField128bGhash as B128;
93 use proptest::prelude::*;
94 use rand::{SeedableRng, rngs::StdRng};
95
96 use super::*;
97
98 proptest! {
99 #[test]
100 fn same_seed_produces_identical_results(
101 seed: u64,
102 n in 0..100usize
103 ) {
104 let mut rng1 = StdRng::seed_from_u64(seed);
105 let mut rng2 = StdRng::seed_from_u64(seed);
106
107 let scalars1 = random_scalars::<B128>(&mut rng1, n);
108 let scalars2 = random_scalars::<B128>(&mut rng2, n);
109
110 prop_assert_eq!(scalars1, scalars2);
111 }
112
113 #[test]
114 fn different_seeds_produce_different_results(seed1: u64, seed2: u64) {
115 prop_assume!(seed1 != seed2);
116
117 let n = 10;
119
120 let mut rng1 = StdRng::seed_from_u64(seed1);
121 let mut rng2 = StdRng::seed_from_u64(seed2);
122
123 let scalars1 = random_scalars::<B128>(&mut rng1, n);
124 let scalars2 = random_scalars::<B128>(&mut rng2, n);
125
126 prop_assert_ne!(scalars1, scalars2);
127 }
128 }
129}