primitives::sinsemilla.rs: Optimize and test i2lebsp_k

Co-authored-by: Jack Grigg <jack@electriccoin.co>
This commit is contained in:
therealyingtong 2021-06-09 23:50:59 +08:00
parent 8f8eff23d8
commit 7818291118
1 changed files with 49 additions and 7 deletions

View File

@ -5,7 +5,6 @@ use pasta_curves::pallas;
use subtle::CtOption;
use crate::spec::extract_p_bottom;
use std::convert::TryInto;
mod addition;
use self::addition::IncompletePoint;
@ -26,11 +25,14 @@ fn lebs2ip_k(bits: &[bool]) -> u32 {
pub fn i2lebsp_k(int: usize) -> [bool; K] {
assert!(int < (1 << K));
(0..K)
.map(|mask| ((int & (1 << mask)) >> mask) == 1)
.collect::<Vec<_>>()
.try_into()
.unwrap()
let mut ret = [false; K];
for (bit, val) in ret
.iter_mut()
.zip((0..K).map(|mask| ((int & (1 << mask)) >> mask) == 1))
{
*bit = val;
}
ret
}
/// Pads the given iterator (which MUST have length $\leq K * C$) with zero-bits to a
@ -199,7 +201,8 @@ impl CommitDomain {
#[cfg(test)]
mod tests {
use super::Pad;
use super::{i2lebsp_k, lebs2ip_k, Pad, K};
use rand::{self, rngs::OsRng, Rng};
#[test]
fn pad() {
@ -238,4 +241,43 @@ mod tests {
]
);
}
#[test]
fn lebs2ip_k_round_trip() {
let mut rng = OsRng;
{
let int = rng.gen_range(0..(1 << K));
assert_eq!(lebs2ip_k(&i2lebsp_k(int)) as usize, int);
}
assert_eq!(lebs2ip_k(&i2lebsp_k(0)) as usize, 0);
assert_eq!(lebs2ip_k(&i2lebsp_k((1 << K) - 1)) as usize, (1 << K) - 1);
}
#[test]
fn i2lebsp_k_round_trip() {
{
let bitstring = (0..K).map(|_| rand::random()).collect::<Vec<_>>();
assert_eq!(
i2lebsp_k(lebs2ip_k(&bitstring) as usize).to_vec(),
bitstring
);
}
{
let bitstring = [false; K];
assert_eq!(
i2lebsp_k(lebs2ip_k(&bitstring) as usize).to_vec(),
bitstring
);
}
{
let bitstring = [true; K];
assert_eq!(
i2lebsp_k(lebs2ip_k(&bitstring) as usize).to_vec(),
bitstring
);
}
}
}