remainder/utils/
arithmetic.rs

1use funty::Unsigned;
2use num::Zero;
3use shared_types::Field;
4
5/// Helper function for conversion to field elements, handling negative values.
6pub fn i64_to_field<F: Field>(value: i64) -> F {
7    if value >= 0 {
8        F::from(value as u64)
9    } else {
10        F::from(value.unsigned_abs()).neg()
11    }
12}
13
14/// Take the ceil(log2(value)) for a u64 value.
15pub fn log2_ceil<T: Unsigned + Zero>(value: T) -> u32 {
16    if value == T::zero() {
17        0
18    } else if value.is_power_of_two() {
19        1u64.leading_zeros() - value.leading_zeros()
20    } else {
21        0u64.leading_zeros() - value.leading_zeros()
22    }
23}