from zkpyc.types import Array, field from typing import Union, Any, List from math import floor, log2
def int_to_bits(n: int) -> Array[bool, Any]:
bits = [bool(int(digit)) for digit in bin(n)[2:]]
length = len(bits)
if length < 32:
return [False]*(32 - length) + bits elif length == 32:
return bits else:
return bits[-32:]
def int_from_bits(bits: Array[bool, Any]) -> int:
result = 0
for bit in bits: result = (result << 1) | bit
return result
def unpack(i: field, N: int) -> Array[bool, Any]:
num = field.modulus + int(i) if int(i) < 0 else int(i) bits = [bool(int(digit)) for digit in bin(num)[2:]]
length = len(bits)
if length < N:
return [False for _ in range(N - length)] + bits elif length == N:
return bits else:
return bits[-N:]
def pack(i) -> field:
field_size = get_field_size()
if len(i) > field_size:
raise ValueError("Input length must be less than field modulus size")
padded_i = [False] * (field_size - len(i)) + i
num = int("".join(map(str, map(int, padded_i))), 2)
original_value = num - field.modulus if num >= field.modulus else num
return field(original_value)
def get_field_size() -> int:
return floor(log2(field.modulus)) + 1
sum_ = sum def sum(x: Array[Union[int, field], Any]) -> Union[int, field]:
return sum_(x)