@@ -594,37 +594,11 @@ fn divmod_31(numerator: u16) -> (u16, u16) {
594
594
(quotient , remainder )
595
595
}
596
596
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
-
611
597
// 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 ] {
613
599
// 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)
614
600
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 >()
628
602
}
629
603
630
604
/**
@@ -728,13 +702,13 @@ pub fn slice_fields<let InputFields: u32, let OutputFields: u32>(
728
702
// 1, 70.5
729
703
let index_of_output_limb : Field = (num_bytes_div_31 as Field - num_bytes_mod_31_is_0 as Field );
730
704
// 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 );
732
706
733
707
// 2, 77.5
734
708
let tail_shift = BYTE_SHIFT [cast_num_to_u32 (num_unused_bytes_in_start_limb )];
735
709
736
710
// 51, 128.5
737
- let mut result = [0 ; OutputFields ];
711
+ let mut result : [ Field ; OutputFields ] = [0 ; OutputFields ];
738
712
let mut previous = tail ;
739
713
for i in 0 ..(OutputFields - 1 ) {
740
714
// 0
@@ -748,9 +722,9 @@ pub fn slice_fields<let InputFields: u32, let OutputFields: u32>(
748
722
// 1, 48
749
723
let combined = previous * tail_shift + head ;
750
724
// 1, 49
751
- result [i ] = combined * slice_valid ;
725
+ result [i ] = combined * ( slice_valid as Field ) ;
752
726
// 2, 51
753
- previous = (tail - previous ) * slice_valid + previous ;
727
+ previous = (tail - previous ) * ( slice_valid as Field ) + previous ;
754
728
}
755
729
756
730
// 2, 130.5
@@ -787,9 +761,10 @@ pub fn slice_fields<let InputFields: u32, let OutputFields: u32>(
787
761
std:: as_witness (last_limb );
788
762
789
763
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 );
791
765
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 ;
793
768
}
794
769
795
770
for i in 0 ..OutputFields {
0 commit comments