@@ -374,12 +374,18 @@ global LAST_LIMB_PATH: [Field; 36] = [
374
374
0x3ffffffff ,
375
375
];
376
376
377
- global INTEGER_UP_TO_62_IS_GREATER_THAN_31 : [Field ; 63 ] = [
378
- 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
379
- 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ,
377
+ global INTEGER_UP_TO_62_IS_GREATER_THAN_31 : [bool ; 63 ] = [
378
+ false , false , false , false , false , false , false , false , false , false , false , false , false ,
379
+ false , false , false , false , false , false , false , false , false , false , false , false , false ,
380
+ false , false , false , false , false , false , true , true , true , true , true , true , true , true , true ,
381
+ true , true , true , true , true , true , true , true , true , true , true , true , true , true , true , true ,
382
+ true , true , true , true , true , true ,
383
+ ];
384
+ global NUM_BYTES_MOD_31_IS_ZERO : [bool ; 31 ] = [
385
+ true , false , false , false , false , false , false , false , false , false , false , false , false , false ,
386
+ false , false , false , false , false , false , false , false , false , false , false , false , false ,
387
+ false , false , false , false ,
380
388
];
381
- global NUM_BYTES_MOD_31_IS_ZERO : [Field ; 31 ] =
382
- [1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ];
383
389
global BYTE_SHIFT : [Field ; 32 ] = [
384
390
1 ,
385
391
0x1000000000000000000000000000000000000000000000000000000000000 ,
@@ -692,17 +698,19 @@ pub fn slice_fields<let InputFields: u32, let OutputFields: u32>(
692
698
let num_bytes_div_31_is_0 = NUM_BYTES_MOD_31_IS_ZERO [num_bytes_div_31 as u32 ];
693
699
694
700
// 1, 12
695
- let lookup = (- num_bytes_div_31_is_0 * num_bytes ) - start_mod_31 as Field + 62 ;
701
+ let lookup = 62 - num_bytes_div_31_is_0 as Field * num_bytes - start_mod_31 as Field ;
696
702
std:: as_witness (lookup );
697
703
// 3, 15
698
704
let bytes_fit_into_limb =
699
- INTEGER_UP_TO_62_IS_GREATER_THAN_31 [cast_num_to_u32 (lookup )] * num_bytes_div_31_is_0 ;
700
- std:: as_witness (bytes_fit_into_limb );
705
+ INTEGER_UP_TO_62_IS_GREATER_THAN_31 [cast_num_to_u32 (lookup )] & num_bytes_div_31_is_0 ;
706
+ std:: as_witness (bytes_fit_into_limb as Field );
701
707
702
708
// 2, 17
703
- let num_unused_bytes_in_start_limb = (num_bytes + start_mod_31 as Field - 31 )
704
- * bytes_fit_into_limb
705
- + (31 - start_mod_31 as Field );
709
+ let num_unused_bytes_in_start_limb = if bytes_fit_into_limb {
710
+ num_bytes
711
+ } else {
712
+ (31 - start_mod_31 as Field )
713
+ };
706
714
std:: as_witness (num_unused_bytes_in_start_limb );
707
715
let num_remaining_bytes = num_bytes - num_unused_bytes_in_start_limb ;
708
716
@@ -712,25 +720,22 @@ pub fn slice_fields<let InputFields: u32, let OutputFields: u32>(
712
720
// 44, 65.5
713
721
let (_ , tail ) = slice_field (data [start_index as u32 ], num_underflow_bytes as u32 );
714
722
715
- let mut previous = tail ;
716
-
717
- let mut result = [0 ; OutputFields ];
718
-
719
723
// 4, 69.5
720
- let extra_head_section = INTEGER_UP_TO_62_IS_GREATER_THAN_31 [(
721
- 31 + num_overflow_bytes - start_mod_31
722
- ) as u32 ]
723
- * (1 - bytes_fit_into_limb );
724
+ let int_greater_than_61 =
725
+ INTEGER_UP_TO_62_IS_GREATER_THAN_31 [(31 + num_overflow_bytes - start_mod_31 ) as u32 ];
726
+ let extra_head_section = int_greater_than_61 & !bytes_fit_into_limb ;
724
727
725
728
// 1, 70.5
726
- let index_of_output_limb : Field = (num_bytes_div_31 as Field - num_bytes_mod_31_is_0 );
729
+ let index_of_output_limb : Field = (num_bytes_div_31 as Field - num_bytes_mod_31_is_0 as Field );
727
730
// 5, 75.5
728
731
let path_valid_output : [Field ; OutputFields ] = get_last_limb_path (index_of_output_limb );
729
732
730
733
// 2, 77.5
731
734
let tail_shift = BYTE_SHIFT [cast_num_to_u32 (num_unused_bytes_in_start_limb )];
732
735
733
736
// 51, 128.5
737
+ let mut result = [0 ; OutputFields ];
738
+ let mut previous = tail ;
734
739
for i in 0 ..(OutputFields - 1 ) {
735
740
// 0
736
741
let slice_valid = path_valid_output [i ];
@@ -749,11 +754,12 @@ pub fn slice_fields<let InputFields: u32, let OutputFields: u32>(
749
754
}
750
755
751
756
// 2, 130.5
752
- let slice_size =
753
- ( num_bytes + start_mod_31 as Field ) * bytes_fit_into_limb + num_overflow_bytes as Field ;
757
+ let slice_size = ( bytes_fit_into_limb as Field ) * ( num_bytes + start_mod_31 as Field )
758
+ + num_overflow_bytes as Field ;
754
759
755
760
// 1, 131.5
756
- let use_previous_for_last_limb : Field = extra_head_section + bytes_fit_into_limb ;
761
+ let use_previous_for_last_limb : Field =
762
+ extra_head_section as Field + bytes_fit_into_limb as Field ;
757
763
758
764
// 1, 132.5
759
765
let index_of_overflow_limb = start_index + num_whole_limbs + 1 ;
@@ -781,21 +787,14 @@ pub fn slice_fields<let InputFields: u32, let OutputFields: u32>(
781
787
std:: as_witness (last_limb );
782
788
783
789
let mut path : [Field ; OutputFields ] = [0 ; OutputFields ];
784
- // 2, 190.5
790
+ path [ 0 ] = ( 1 - path_valid_output [ 0 ]);
785
791
for i in 1 ..OutputFields {
786
792
path [i ] = path_valid_output [i ] * -path_valid_output [i - 1 ] + path_valid_output [i - 1 ];
787
793
}
788
- // 1, 191.5
789
- path [0 ] = (1 - path_valid_output [0 ]);
790
794
791
- // 4, 195.5
792
- // actual valud = 182, missing gates?
793
795
for i in 0 ..OutputFields {
794
- // 2
795
796
result [i ] = (last_limb - result [i ]) * path [i ] + result [i ];
796
- // std::as_witness(result[i]);
797
797
}
798
- // actual value = 182?
799
798
result
800
799
}
801
800
0 commit comments