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}