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}