@@ -866,35 +866,51 @@ impl<C: Config> UniPolyExtrapolator<C> {
866866 }
867867
868868 pub fn extrapolate_uni_poly (
869- & mut self ,
869+ & self ,
870870 builder : & mut Builder < C > ,
871+ p_0 : Ext < C :: F , C :: EF > ,
871872 p_i : & Array < C , Ext < C :: F , C :: EF > > ,
872873 eval_at : Ext < C :: F , C :: EF > ,
873874 ) -> Ext < C :: F , C :: EF > {
874875 let res: Ext < C :: F , C :: EF > = builder. constant ( C :: EF :: ZERO ) ;
876+ let length: RVar < _ > = builder. eval_expr ( p_i. len ( ) + Usize :: from ( 1 ) ) ;
875877
876- builder. if_eq ( p_i . len ( ) , Usize :: from ( 4 ) ) . then_or_else (
878+ builder. if_eq ( length , Usize :: from ( 4 ) ) . then_or_else (
877879 |builder| {
878- let ext = self . extrapolate_uni_poly_deg_3 ( builder, p_i, eval_at) ;
880+ let p_i_1: Ext < C :: F , C :: EF > = builder. get ( p_i, 0 ) ;
881+ let p_i_2: Ext < C :: F , C :: EF > = builder. get ( p_i, 1 ) ;
882+ let p_i_3: Ext < C :: F , C :: EF > = builder. get ( p_i, 2 ) ;
883+ let ext =
884+ self . extrapolate_uni_poly_deg_3 ( builder, p_0, p_i_1, p_i_2, p_i_3, eval_at) ;
879885 builder. assign ( & res, ext) ;
880886 } ,
881887 |builder| {
882- builder. if_eq ( p_i . len ( ) , Usize :: from ( 3 ) ) . then_or_else (
888+ builder. if_eq ( length , Usize :: from ( 3 ) ) . then_or_else (
883889 |builder| {
884- let ext = self . extrapolate_uni_poly_deg_2 ( builder, p_i, eval_at) ;
890+ let p_i_1: Ext < C :: F , C :: EF > = builder. get ( p_i, 0 ) ;
891+ let p_i_2: Ext < C :: F , C :: EF > = builder. get ( p_i, 1 ) ;
892+ let ext =
893+ self . extrapolate_uni_poly_deg_2 ( builder, p_0, p_i_1, p_i_2, eval_at) ;
885894 builder. assign ( & res, ext) ;
886895 } ,
887896 |builder| {
888- builder. if_eq ( p_i . len ( ) , Usize :: from ( 2 ) ) . then_or_else (
897+ builder. if_eq ( length , Usize :: from ( 2 ) ) . then_or_else (
889898 |builder| {
890- let ext = self . extrapolate_uni_poly_deg_1 ( builder, p_i, eval_at) ;
899+ let p_i_1: Ext < C :: F , C :: EF > = builder. get ( p_i, 0 ) ;
900+ let ext =
901+ self . extrapolate_uni_poly_deg_1 ( builder, p_0, p_i_1, eval_at) ;
891902 builder. assign ( & res, ext) ;
892903 } ,
893904 |builder| {
894- builder. if_eq ( p_i . len ( ) , Usize :: from ( 5 ) ) . then_or_else (
905+ builder. if_eq ( length , Usize :: from ( 5 ) ) . then_or_else (
895906 |builder| {
896- let ext =
897- self . extrapolate_uni_poly_deg_4 ( builder, p_i, eval_at) ;
907+ let p_i_1: Ext < C :: F , C :: EF > = builder. get ( p_i, 0 ) ;
908+ let p_i_2: Ext < C :: F , C :: EF > = builder. get ( p_i, 1 ) ;
909+ let p_i_3: Ext < C :: F , C :: EF > = builder. get ( p_i, 2 ) ;
910+ let p_i_4: Ext < C :: F , C :: EF > = builder. get ( p_i, 3 ) ;
911+ let ext = self . extrapolate_uni_poly_deg_4 (
912+ builder, p_0, p_i_1, p_i_2, p_i_3, p_i_4, eval_at,
913+ ) ;
898914 builder. assign ( & res, ext) ;
899915 } ,
900916 |builder| {
@@ -914,7 +930,8 @@ impl<C: Config> UniPolyExtrapolator<C> {
914930 fn extrapolate_uni_poly_deg_1 (
915931 & self ,
916932 builder : & mut Builder < C > ,
917- p_i : & Array < C , Ext < C :: F , C :: EF > > ,
933+ p_i_0 : Ext < C :: F , C :: EF > ,
934+ p_i_1 : Ext < C :: F , C :: EF > ,
918935 eval_at : Ext < C :: F , C :: EF > ,
919936 ) -> Ext < C :: F , C :: EF > {
920937 // w0 = 1 / (0−1) = -1
@@ -923,9 +940,6 @@ impl<C: Config> UniPolyExtrapolator<C> {
923940 let d1: Ext < C :: F , C :: EF > = builder. eval ( eval_at - self . constants [ 1 ] ) ;
924941 let l: Ext < C :: F , C :: EF > = builder. eval ( d0 * d1) ;
925942
926- let p_i_0 = builder. get ( p_i, 0 ) ;
927- let p_i_1 = builder. get ( p_i, 1 ) ;
928-
929943 let t0: Ext < C :: F , C :: EF > = builder. eval ( self . constants [ 5 ] * p_i_0 * d0. inverse ( ) ) ;
930944 let t1: Ext < C :: F , C :: EF > = builder. eval ( self . constants [ 1 ] * p_i_1 * d1. inverse ( ) ) ;
931945
@@ -935,7 +949,9 @@ impl<C: Config> UniPolyExtrapolator<C> {
935949 fn extrapolate_uni_poly_deg_2 (
936950 & self ,
937951 builder : & mut Builder < C > ,
938- p_i : & Array < C , Ext < C :: F , C :: EF > > ,
952+ p_i_0 : Ext < C :: F , C :: EF > ,
953+ p_i_1 : Ext < C :: F , C :: EF > ,
954+ p_i_2 : Ext < C :: F , C :: EF > ,
939955 eval_at : Ext < C :: F , C :: EF > ,
940956 ) -> Ext < C :: F , C :: EF > {
941957 // w0 = 1 / ((0−1)(0−2)) = 1/2
@@ -947,10 +963,6 @@ impl<C: Config> UniPolyExtrapolator<C> {
947963
948964 let l: Ext < C :: F , C :: EF > = builder. eval ( d0 * d1 * d2) ;
949965
950- let p_i_0: Ext < C :: F , C :: EF > = builder. get ( p_i, 0 ) ;
951- let p_i_1: Ext < C :: F , C :: EF > = builder. get ( p_i, 1 ) ;
952- let p_i_2: Ext < C :: F , C :: EF > = builder. get ( p_i, 2 ) ;
953-
954966 let t0: Ext < C :: F , C :: EF > = builder. eval ( self . constants [ 6 ] * p_i_0 * d0. inverse ( ) ) ;
955967 let t1: Ext < C :: F , C :: EF > = builder. eval ( self . constants [ 5 ] * p_i_1 * d1. inverse ( ) ) ;
956968 let t2: Ext < C :: F , C :: EF > = builder. eval ( self . constants [ 6 ] * p_i_2 * d2. inverse ( ) ) ;
@@ -961,7 +973,10 @@ impl<C: Config> UniPolyExtrapolator<C> {
961973 fn extrapolate_uni_poly_deg_3 (
962974 & self ,
963975 builder : & mut Builder < C > ,
964- p_i : & Array < C , Ext < C :: F , C :: EF > > ,
976+ p_i_0 : Ext < C :: F , C :: EF > ,
977+ p_i_1 : Ext < C :: F , C :: EF > ,
978+ p_i_2 : Ext < C :: F , C :: EF > ,
979+ p_i_3 : Ext < C :: F , C :: EF > ,
965980 eval_at : Ext < C :: F , C :: EF > ,
966981 ) -> Ext < C :: F , C :: EF > {
967982 // w0 = 1 / ((0−1)(0−2)(0−3)) = -1/6
@@ -975,11 +990,6 @@ impl<C: Config> UniPolyExtrapolator<C> {
975990
976991 let l: Ext < C :: F , C :: EF > = builder. eval ( d0 * d1 * d2 * d3) ;
977992
978- let p_i_0: Ext < C :: F , C :: EF > = builder. get ( p_i, 0 ) ;
979- let p_i_1: Ext < C :: F , C :: EF > = builder. get ( p_i, 1 ) ;
980- let p_i_2: Ext < C :: F , C :: EF > = builder. get ( p_i, 2 ) ;
981- let p_i_3: Ext < C :: F , C :: EF > = builder. get ( p_i, 3 ) ;
982-
983993 let t0: Ext < C :: F , C :: EF > = builder. eval ( self . constants [ 9 ] * p_i_0 * d0. inverse ( ) ) ;
984994 let t1: Ext < C :: F , C :: EF > = builder. eval ( self . constants [ 6 ] * p_i_1 * d1. inverse ( ) ) ;
985995 let t2: Ext < C :: F , C :: EF > = builder. eval ( self . constants [ 7 ] * p_i_2 * d2. inverse ( ) ) ;
@@ -991,7 +1001,11 @@ impl<C: Config> UniPolyExtrapolator<C> {
9911001 fn extrapolate_uni_poly_deg_4 (
9921002 & self ,
9931003 builder : & mut Builder < C > ,
994- p_i : & Array < C , Ext < C :: F , C :: EF > > ,
1004+ p_i_0 : Ext < C :: F , C :: EF > ,
1005+ p_i_1 : Ext < C :: F , C :: EF > ,
1006+ p_i_2 : Ext < C :: F , C :: EF > ,
1007+ p_i_3 : Ext < C :: F , C :: EF > ,
1008+ p_i_4 : Ext < C :: F , C :: EF > ,
9951009 eval_at : Ext < C :: F , C :: EF > ,
9961010 ) -> Ext < C :: F , C :: EF > {
9971011 // w0 = 1 / ((0−1)(0−2)(0−3)(0−4)) = 1/24
@@ -1007,12 +1021,6 @@ impl<C: Config> UniPolyExtrapolator<C> {
10071021
10081022 let l: Ext < C :: F , C :: EF > = builder. eval ( d0 * d1 * d2 * d3 * d4) ;
10091023
1010- let p_i_0: Ext < C :: F , C :: EF > = builder. get ( p_i, 0 ) ;
1011- let p_i_1: Ext < C :: F , C :: EF > = builder. get ( p_i, 1 ) ;
1012- let p_i_2: Ext < C :: F , C :: EF > = builder. get ( p_i, 2 ) ;
1013- let p_i_3: Ext < C :: F , C :: EF > = builder. get ( p_i, 3 ) ;
1014- let p_i_4: Ext < C :: F , C :: EF > = builder. get ( p_i, 4 ) ;
1015-
10161024 let t0: Ext < C :: F , C :: EF > = builder. eval ( self . constants [ 11 ] * p_i_0 * d0. inverse ( ) ) ;
10171025 let t1: Ext < C :: F , C :: EF > = builder. eval ( self . constants [ 9 ] * p_i_1 * d1. inverse ( ) ) ;
10181026 let t2: Ext < C :: F , C :: EF > = builder. eval ( self . constants [ 10 ] * p_i_2 * d2. inverse ( ) ) ;
0 commit comments