@@ -2,7 +2,7 @@ use std::ops::Mul;
22
33use backend:: * ;
44
5- use crate :: MIN_VARS_FOR_PACKING ;
5+ use crate :: { MIN_VARS_FOR_PACKING , N_VARS_TO_SEND_GKR_COEFFS } ;
66
77/*
88GKR to compute sum of fractions.
@@ -13,6 +13,8 @@ pub fn prove_gkr_quotient<EF: ExtensionField<PF<EF>>>(
1313 numerators : & MleRef < ' _ , EF > ,
1414 denominators : & MleRef < ' _ , EF > ,
1515) -> ( EF , MultilinearPoint < EF > , EF , EF ) {
16+ assert ! ( numerators. n_vars( ) == denominators. n_vars( ) ) ;
17+ assert ! ( numerators. n_vars( ) > N_VARS_TO_SEND_GKR_COEFFS ) ;
1618 assert ! ( numerators. is_packed( ) == denominators. is_packed( ) ) ;
1719 let mut layers: Vec < ( Mle < ' _ , EF > , Mle < ' _ , EF > ) > =
1820 vec ! [ ( numerators. soft_clone( ) . into( ) , denominators. soft_clone( ) . into( ) ) ] ;
@@ -26,23 +28,23 @@ pub fn prove_gkr_quotient<EF: ExtensionField<PF<EF>>>(
2628 prev_denominators. unpack ( ) . as_owned_or_clone ( ) . into ( ) ,
2729 )
2830 }
29- if prev_numerators. n_vars ( ) == 1 {
31+ if prev_numerators. n_vars ( ) <= N_VARS_TO_SEND_GKR_COEFFS {
3032 break ;
3133 }
3234 let ( new_numerators, new_denominators) = sum_quotients ( prev_numerators. by_ref ( ) , prev_denominators. by_ref ( ) ) ;
3335 layers. push ( ( new_numerators. into ( ) , new_denominators. into ( ) ) ) ;
3436 }
3537
36- let ( last_numerators , last_denominators ) = layers. pop ( ) . unwrap ( ) ;
37- let last_numerators = last_numerators . as_owned ( ) . unwrap ( ) ;
38- let last_numerators = last_numerators . as_extension ( ) . unwrap ( ) ;
39- let last_denominators = last_denominators . as_owned ( ) . unwrap ( ) ;
40- let last_denominators = last_denominators . as_extension ( ) . unwrap ( ) ;
38+ let ( last_numerators_mle , last_denominators_mle ) = layers. pop ( ) . unwrap ( ) ;
39+ let last_numerators_owned = last_numerators_mle . unpack ( ) . as_owned_or_clone ( ) ;
40+ let last_denominators_owned = last_denominators_mle . unpack ( ) . as_owned_or_clone ( ) ;
41+ let last_numerators = last_numerators_owned . as_extension ( ) . unwrap ( ) ;
42+ let last_denominators = last_denominators_owned . as_extension ( ) . unwrap ( ) ;
4143 prover_state. add_extension_scalars ( last_numerators) ;
4244 prover_state. add_extension_scalars ( last_denominators) ;
43- let quotient = last_numerators[ 0 ] / last_denominators[ 0 ] + last_numerators [ 1 ] / last_denominators [ 1 ] ;
45+ let quotient = compute_quotient ( last_numerators, last_denominators) ;
4446
45- let mut point = MultilinearPoint ( vec ! [ prover_state. sample ( ) ] ) ;
47+ let mut point = MultilinearPoint ( prover_state. sample_vec ( N_VARS_TO_SEND_GKR_COEFFS ) ) ;
4648 let mut claims = vec ! [ last_numerators. evaluate( & point) , last_denominators. evaluate( & point) ] ;
4749
4850 for ( nums, denoms) in layers. iter ( ) . rev ( ) {
@@ -208,13 +210,15 @@ pub fn verify_gkr_quotient<EF: ExtensionField<PF<EF>>>(
208210 verifier_state : & mut impl FSVerifier < EF > ,
209211 n_vars : usize ,
210212) -> Result < ( EF , MultilinearPoint < EF > , EF , EF ) , ProofError > {
211- let last_nums = verifier_state. next_extension_scalars_vec ( 2 ) ?;
212- let last_dens = verifier_state. next_extension_scalars_vec ( 2 ) ?;
213- let quotient = last_nums[ 0 ] / last_dens[ 0 ] + last_nums[ 1 ] / last_dens[ 1 ] ;
214- let mut point = MultilinearPoint ( vec ! [ verifier_state. sample( ) ] ) ;
213+ assert ! ( n_vars > N_VARS_TO_SEND_GKR_COEFFS ) ;
214+ let send_len = 1 << N_VARS_TO_SEND_GKR_COEFFS ;
215+ let last_nums = verifier_state. next_extension_scalars_vec ( send_len) ?;
216+ let last_dens = verifier_state. next_extension_scalars_vec ( send_len) ?;
217+ let quotient: EF = compute_quotient ( & last_nums, & last_dens) ;
218+ let mut point = MultilinearPoint ( verifier_state. sample_vec ( N_VARS_TO_SEND_GKR_COEFFS ) ) ;
215219 let mut claims_num = last_nums. evaluate ( & point) ;
216220 let mut claims_den = last_dens. evaluate ( & point) ;
217- for i in 1 ..n_vars {
221+ for i in N_VARS_TO_SEND_GKR_COEFFS ..n_vars {
218222 ( point, claims_num, claims_den) = verify_gkr_quotient_step ( verifier_state, i, & point, claims_num, claims_den) ?;
219223 }
220224 Ok ( ( quotient, point, claims_num, claims_den) )
@@ -291,6 +295,10 @@ where
291295 ( new_numerators, new_denominators)
292296}
293297
298+ fn compute_quotient < EF : ExtensionField < PF < EF > > > ( numerators : & [ EF ] , denominators : & [ EF ] ) -> EF {
299+ numerators. iter ( ) . zip ( denominators) . map ( |( & n, & d) | n / d) . sum ( )
300+ }
301+
294302#[ cfg( test) ]
295303mod tests {
296304 use super :: * ;
0 commit comments