@@ -8,7 +8,7 @@ use std::convert::fe;
8
8
use std ::prelude::set_hint ;
9
9
use std ::prelude::Query ;
10
10
use std ::prover::eval ;
11
- use std ::prover::provide_value ;
11
+ use std ::prover::compute_from ;
12
12
use std ::machines::large_field::memory::Memory ;
13
13
14
14
machine Keccakf32Memory(mem: Memory) with
@@ -592,10 +592,10 @@ machine Keccakf32Memory(mem: Memory) with
592
592
// }
593
593
// }
594
594
595
- let query_c: int , int , int - > int = query |x , limb , bit_in_limb|
595
+ let query_c: int , int , int , fe [] - > int = query |x , limb , bit_in_limb , a |
596
596
utils::fold(
597
597
5 ,
598
- |y| ( int (eval( a [ y * 10 + x * 2 + limb ] ) ) >> bit_in_limb) & 0x1 ,
598
+ |y| ( int (a [ y * 10 + x * 2 + limb ] ) >> bit_in_limb) & 0x1 ,
599
599
0 ,
600
600
|acc , e| acc ^ e
601
601
) ;
@@ -607,7 +607,7 @@ machine Keccakf32Memory(mem: Memory) with
607
607
let limb = z / 32 ;
608
608
let bit_in_limb = z % 32 ;
609
609
610
- provide_value (c_i , row , fe(query_c(x , limb , bit_in_limb))) ;
610
+ compute_from (c_i , row , a , |a| fe(query_c(x, limb , bit_in_limb , a )))
611
611
}) ;
612
612
} ;
613
613
@@ -622,17 +622,17 @@ machine Keccakf32Memory(mem: Memory) with
622
622
// }
623
623
// }
624
624
625
- let query_c_prime: int , int - > int = query |x , z|
626
- int (eval( c [ x * 64 + z ] ) ) ^
627
- int (eval( c [ ((x + 4 ) % 5 ) * 64 + z ] ) ) ^
628
- int (eval( c [ ((x + 1 ) % 5 ) * 64 + (z + 63 ) % 64 ] ) );
625
+ let query_c_prime: int , int , fe [] - > int = query |x , z , c |
626
+ int (c [ x * 64 + z ] ) ^
627
+ int (c [ ((x + 4 ) % 5 ) * 64 + z ] ) ^
628
+ int (c [ ((x + 1 ) % 5 ) * 64 + (z + 63 ) % 64 ] ) ;
629
629
630
630
query |row| {
631
631
let _ = array::map_enumerated(c_prime , |i , c_i| {
632
632
let x = i / 64 ;
633
633
let z = i % 64 ;
634
634
635
- provide_value (c_i , row , fe(query_c_prime(x , z))) ;
635
+ compute_from (c_i , row , c , |c| fe(query_c_prime(x, z , c )));
636
636
}) ;
637
637
} ;
638
638
@@ -652,10 +652,6 @@ machine Keccakf32Memory(mem: Memory) with
652
652
// }
653
653
// }
654
654
655
- let query_a_prime: int , int , int , int , int - > int = query |x , y , z , limb , bit_in_limb|
656
- (( int (eval(a [ y * 10 + x * 2 + limb ] )) >> bit_in_limb) & 0x1 ) ^
657
- int (eval(c [ x * 64 + z ] )) ^
658
- int (eval(c_prime [ x * 64 + z ] )) ;
659
655
660
656
query |row| {
661
657
let _ = array::map_enumerated(a_prime , |i , a_i| {
@@ -665,7 +661,14 @@ machine Keccakf32Memory(mem: Memory) with
665
661
let limb = z / 32 ;
666
662
let bit_in_limb = z % 32 ;
667
663
668
- provide_value(a_i , row , fe(query_a_prime(x , y , z , limb , bit_in_limb))) ;
664
+ let a_elem = a [ y * 10 + x * 2 + limb ] ;
665
+ let c_elem = c [ x * 64 + z ] ;
666
+ let c_prime_elem = c_prime [ x * 64 + z ] ;
667
+
668
+ compute_from(
669
+ a_i , row , [ a_elem , c_elem , c_prime_elem ],
670
+ |inputs| fe((( int (inputs [ 0 ] ) >> bit_in_limb) & 0x1 ) ^ int (inputs [ 1 ] ) ^ int (inputs [ 2 ] ))
671
+ ) ;
669
672
}) ;
670
673
} ;
671
674
@@ -687,13 +690,23 @@ machine Keccakf32Memory(mem: Memory) with
687
690
// }
688
691
// }
689
692
690
- let query_a_prime_prime: int , int , int - > int = query |x , y , limb|
693
+
694
+ let b_index: int , int , int - > int = |x , y , z| {
695
+ let a: int = (x + 3 * y) % 5 ;
696
+ let rot: int = R [ a * 5 + x ] ; // b = x
697
+ x * 320 + a * 64 + (z + 64 - rot) % 64
698
+ } ;
699
+ let andn_int: int , int - > int = |a , b| ( 1 - a) * b ;
700
+
701
+ let query_a_prime_prime: int , int , int , fe [] - > int = query |x , y , limb , a_prime|
691
702
utils::fold(
692
703
32 ,
693
- |z|
694
- int (eval(b(x , y , (limb + 1 ) * 32 - 1 - z))) ^
695
- int (eval( andn (b((x + 1 ) % 5 , y , (limb + 1 ) * 32 - 1 - z) ,
696
- b((x + 2 ) % 5 , y , (limb + 1 ) * 32 - 1 - z)))) ,
704
+ |z|
705
+ int (a_prime [ b_index(x , y , (limb + 1 ) * 32 - 1 - z) ] ) ^
706
+ int (andn_int(
707
+ int (a_prime [ b_index((x + 1 ) % 5 , y , (limb + 1 ) * 32 - 1 - z) ] ) ,
708
+ int (a_prime [ b_index((x + 2 ) % 5 , y , (limb + 1 ) * 32 - 1 - z) ] )
709
+ )) ,
697
710
0 ,
698
711
|acc , e| acc * 2 + e
699
712
) ;
@@ -704,7 +717,7 @@ machine Keccakf32Memory(mem: Memory) with
704
717
let x = (i / 2 ) % 5 ;
705
718
let limb = i % 2 ;
706
719
707
- provide_value (a_i , row , fe(query_a_prime_prime(x , y , limb))) ;
720
+ compute_from (a_i , row , a_prime , |a_prime| fe(query_a_prime_prime(x, y , limb , a_prime )));
708
721
}) ;
709
722
} ;
710
723
@@ -730,10 +743,11 @@ machine Keccakf32Memory(mem: Memory) with
730
743
let limb = i / 32 ;
731
744
let bit_in_limb = i % 32 ;
732
745
733
- provide_value (
746
+ compute_from (
734
747
a_i ,
735
- row ,
736
- fe(( int (eval(a_prime_prime [ limb ] )) >> bit_in_limb) & 0x1 )
748
+ row ,
749
+ a_prime_prime ,
750
+ |a_prime_prime| fe(( int (a_prime_prime [ limb ] ) >> bit_in_limb) & 0x1 )
737
751
) ;
738
752
}) ;
739
753
} ;
@@ -745,16 +759,17 @@ machine Keccakf32Memory(mem: Memory) with
745
759
// F::from_canonical_u16(row.a_prime_prime [ 0 ][ 0 ][ limb ] .as_canonical_u64() as u16 ^ rc_lo) ;
746
760
// }
747
761
748
- let query_a_prime_prime_prime_0_0_limbs: int , int - > int = query |round , limb|
749
- int (eval( a_prime_prime [ limb ] ) ) ^
762
+ let query_a_prime_prime_prime_0_0_limbs: int , int , fe [] - > int = query |round , limb , a_prime_prime |
763
+ int (a_prime_prime [ limb ] ) ^
750
764
((RC [ round ] >> (limb * 32 )) & 0xffffffff ) ;
751
765
752
766
query |row| {
753
767
let _ = array::new( 2 , |limb| {
754
- provide_value (
768
+ compute_from (
755
769
a_prime_prime_prime_0_0_limbs [ limb ],
756
- row ,
757
- fe(query_a_prime_prime_prime_0_0_limbs(row % NUM_ROUNDS , limb)
770
+ row ,
771
+ a_prime_prime ,
772
+ |a_prime_prime| fe(query_a_prime_prime_prime_0_0_limbs(row % NUM_ROUNDS , limb , a_prime_prime)
758
773
)) ;
759
774
}) ;
760
775
} ;
0 commit comments