halo2derive/
utils.rs
1use core::ops::Shl;
2use num_bigint::BigUint;
3use num_traits::{One, ToPrimitive};
4
5fn decompose(e: &BigUint, number_of_limbs: usize, limb_size: usize) -> Vec<BigUint> {
6 let mask = &(BigUint::one().shl(limb_size) - 1usize);
7 (0usize..)
8 .step_by(limb_size)
9 .take(number_of_limbs)
10 .map(|shift| ((e >> shift) & mask))
11 .collect::<Vec<_>>()
12}
13
14pub(crate) fn big_to_limbs(e: &BigUint, number_of_limbs: usize) -> Vec<u64> {
15 decompose(e, number_of_limbs, 64)
16 .iter()
17 .map(|x| x.to_u64().unwrap())
18 .collect()
19}
20
21pub(crate) fn big_to_limbs_32(e: &BigUint, number_of_limbs: usize) -> Vec<u32> {
22 decompose(e, number_of_limbs, 32)
23 .iter()
24 .map(|x| x.to_u32().unwrap())
25 .collect()
26}
27
28pub(crate) fn big_to_token(e: &BigUint, number_of_limbs: usize) -> proc_macro2::TokenStream {
29 let limbs = big_to_limbs(e, number_of_limbs);
30 quote::quote! {[#(#limbs,)*]}
31}
32
33pub(crate) fn mod_inv(e: &BigUint, modulus: &BigUint) -> BigUint {
34 e.modpow(&(modulus - BigUint::from(2u64)), modulus)
35}