|
1 | 1 | #![allow(non_snake_case)] |
| 2 | + |
| 3 | +use core::slice::SlicePattern; |
2 | 4 | use std::ops::Mul; |
3 | 5 |
|
4 | | -use ark_bls12_381::{Fr, G1Affine, G1Projective}; |
| 6 | +use ark_bls12_381::{Config, Fr, G1Affine, G1Projective}; |
5 | 7 | use ark_ec::CurveGroup; |
| 8 | +use ark_ec::short_weierstrass::Projective; |
6 | 9 | use ark_ff::{batch_inversion, BigInt, Field, PrimeField}; |
7 | 10 | use ark_serialize::{CanonicalDeserialize, CanonicalSerialize, Read, SerializationError, Write}; |
8 | 11 | use ark_std::rand::RngCore; |
@@ -41,10 +44,8 @@ pub struct WeightedInnerProductProof { |
41 | 44 | g: G1Projective, |
42 | 45 | h: G1Projective, |
43 | 46 |
|
44 | | - vec_c_L: Vec<G1Projective>, |
45 | | - vec_c_R: Vec<G1Projective>, |
46 | | - vec_d_L: Vec<G1Projective>, |
47 | | - vec_d_R: Vec<G1Projective>, |
| 47 | + vec_L: Vec<G1Projective>, |
| 48 | + vec_R: Vec<G1Projective>, |
48 | 49 |
|
49 | 50 | c_final: Fr, |
50 | 51 | d_final: Fr, |
@@ -571,29 +572,39 @@ impl WeightedInnerProductProof { |
571 | 572 | let e2_xL_einv2_xR = e2_xL + einv2_xR; |
572 | 573 | let alpha_hat = alpha + e2_xL_einv2_xR; |
573 | 574 |
|
| 575 | + // Now we make G_hat |
| 576 | + let e_yinv = e * powers_y_inv[n-1]; |
| 577 | + let G_hat = (0..n) |
| 578 | + .map(|i| { |
| 579 | + let GLe_inv = G_L[i] * e_inv; |
| 580 | + let GRe_yinv = G_R[i] * e_yinv; |
| 581 | + *GRe_yinv + *GLe_inv |
| 582 | + }) |
| 583 | + .collect::<Vec<G1Affine>>(); |
| 584 | + // G = &mut G_hat[..]; |
574 | 585 |
|
575 | | - |
576 | | - /*for i in 0..n { |
577 | | - c_L[i] += gamma_inv * c_R[i]; |
578 | | - d_L[i] += gamma * d_R[i]; |
579 | | - G_L[i] = (G_L[i] + G_R[i].mul(gamma)).into_affine(); |
580 | | - H_L[i] = (H_L[i] + H_R[i].mul(gamma_inv)).into_affine(); |
581 | | - }*/ |
| 586 | + let H_hat = (0..n) |
| 587 | + .map(|i| { |
| 588 | + let HLe = H_L[i] * e; |
| 589 | + let HRe_inv = H_R[i] * e_inv; |
| 590 | + *HLe + *HRe_inv |
| 591 | + }) |
| 592 | + .collect::<Vec<G1Affine>>(); |
582 | 593 |
|
583 | 594 | // Save the rescaled vector for splitting in the next loop |
584 | | - slice_c = c_L; |
585 | | - slice_d = d_L; |
586 | | - slice_G = G_L; |
587 | | - slice_H = H_L; |
| 595 | + slice_c = &mut c_hat.as_slice(); |
| 596 | + slice_d = &mut d_hat.as_slice(); |
| 597 | + slice_G = &mut G_hat.as_slice(); |
| 598 | + slice_H = &mut H_hat.as_slice(); |
588 | 599 | } |
589 | 600 |
|
590 | 601 | WeightedInnerProductProof { |
591 | 602 | G: crs_G_vec, |
592 | 603 | H: crs_H_vec, |
593 | | - vec_c_L: vec_c_L, |
594 | | - vec_c_R: vec_c_R, |
595 | | - vec_d_L: vec_d_L, |
596 | | - vec_d_R: vec_d_R, |
| 604 | + g: *crs_G, |
| 605 | + h: *crs_H, |
| 606 | + vec_L: L, |
| 607 | + vec_R: R, |
597 | 608 | c_final: slice_c[0], |
598 | 609 | d_final: slice_d[0], |
599 | 610 | } |
|
0 commit comments