Skip to content

Commit 38f3f26

Browse files
authored
chore: remove decompose function (#92)
1 parent 15df67c commit 38f3f26

File tree

1 file changed

+9
-34
lines changed

1 file changed

+9
-34
lines changed

src/_string_tools/slice_packed_field.nr

Lines changed: 9 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -594,37 +594,11 @@ fn divmod_31(numerator: u16) -> (u16, u16) {
594594
(quotient, remainder)
595595
}
596596

597-
/**
598-
* @brief converts a 16 bit value into 16 fake bools (Field elements that are 0 or 1)
599-
**/
600-
unconstrained fn decompose(val: Field) -> [Field; 16] {
601-
let mut r: [Field; 16] = [0; 16];
602-
603-
let mut it = val as u32;
604-
for i in 0..16 {
605-
r[i] = (it & 1) as Field;
606-
it >>= 1;
607-
}
608-
r
609-
}
610-
611597
// 5 gates?
612-
pub fn get_last_limb_path<let OutputFields: u32>(last_limb_index: Field) -> [Field; OutputFields] {
598+
pub fn get_last_limb_path<let OutputFields: u32>(last_limb_index: Field) -> [u1; OutputFields] {
613599
// TODO we offset by 1 explain why (0 byte length produces 0 - 1 which = invalid array index. we just add 1 and increase array length by 1 to compensate)
614600
let path = LAST_LIMB_PATH[cast_num_to_u32(last_limb_index + 1)]; // 2
615-
// Safety: check the comments below
616-
let path_valid_bits = unsafe { decompose(path) };
617-
let mut path_valid_sum: Field = 0;
618-
let mut path_valid_output: [Field; OutputFields] = [0; OutputFields];
619-
for i in 0..OutputFields {
620-
// we check that the path valid bits are binary
621-
assert(path_valid_bits[i] * path_valid_bits[i] - path_valid_bits[i] == 0);
622-
path_valid_sum += (path_valid_bits[i] * (1 << i as u8) as Field);
623-
path_valid_output[i] = path_valid_bits[i];
624-
}
625-
// we check that the path valid bits sum to the path
626-
assert(path_valid_sum == path);
627-
path_valid_output
601+
path.to_le_bits::<OutputFields>()
628602
}
629603

630604
/**
@@ -728,13 +702,13 @@ pub fn slice_fields<let InputFields: u32, let OutputFields: u32>(
728702
// 1, 70.5
729703
let index_of_output_limb: Field = (num_bytes_div_31 as Field - num_bytes_mod_31_is_0 as Field);
730704
// 5, 75.5
731-
let path_valid_output: [Field; OutputFields] = get_last_limb_path(index_of_output_limb);
705+
let path_valid_output: [u1; OutputFields] = get_last_limb_path(index_of_output_limb);
732706

733707
// 2, 77.5
734708
let tail_shift = BYTE_SHIFT[cast_num_to_u32(num_unused_bytes_in_start_limb)];
735709

736710
// 51, 128.5
737-
let mut result = [0; OutputFields];
711+
let mut result: [Field; OutputFields] = [0; OutputFields];
738712
let mut previous = tail;
739713
for i in 0..(OutputFields - 1) {
740714
// 0
@@ -748,9 +722,9 @@ pub fn slice_fields<let InputFields: u32, let OutputFields: u32>(
748722
// 1, 48
749723
let combined = previous * tail_shift + head;
750724
// 1, 49
751-
result[i] = combined * slice_valid;
725+
result[i] = combined * (slice_valid as Field);
752726
// 2, 51
753-
previous = (tail - previous) * slice_valid + previous;
727+
previous = (tail - previous) * (slice_valid as Field) + previous;
754728
}
755729

756730
// 2, 130.5
@@ -787,9 +761,10 @@ pub fn slice_fields<let InputFields: u32, let OutputFields: u32>(
787761
std::as_witness(last_limb);
788762

789763
let mut path: [Field; OutputFields] = [0; OutputFields];
790-
path[0] = (1 - path_valid_output[0]);
764+
path[0] = (1 - path_valid_output[0] as Field);
791765
for i in 1..OutputFields {
792-
path[i] = path_valid_output[i] * -path_valid_output[i - 1] + path_valid_output[i - 1];
766+
path[i] = path_valid_output[i - 1] as Field
767+
- path_valid_output[i] as Field * path_valid_output[i - 1] as Field;
793768
}
794769

795770
for i in 0..OutputFields {

0 commit comments

Comments
 (0)