You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

145 lines
3.9 KiB

  1. use ark_ec::AffineRepr;
  2. use ark_ff::fields::PrimeField;
  3. use core::ops::Add;
  4. pub fn vector_elem_product<F: PrimeField>(a: &Vec<F>, e: &F) -> Vec<F> {
  5. // maybe move this method to operator a * e
  6. let mut r: Vec<F> = vec![F::zero(); a.len()];
  7. for i in 0..a.len() {
  8. r[i] = a[i] * e;
  9. }
  10. r
  11. }
  12. pub fn matrix_vector_product<F: PrimeField>(M: &Vec<Vec<F>>, z: &Vec<F>) -> Vec<F> {
  13. // TODO assert len
  14. let mut r: Vec<F> = vec![F::zero(); M.len()];
  15. for i in 0..M.len() {
  16. for j in 0..M[i].len() {
  17. r[i] += M[i][j] * z[j];
  18. }
  19. }
  20. r
  21. }
  22. pub fn hadamard_product<F: PrimeField>(a: Vec<F>, b: Vec<F>) -> Vec<F> {
  23. // maybe move this method to operator a * b
  24. // TODO assert equals len
  25. let mut r: Vec<F> = vec![F::zero(); a.len()];
  26. for i in 0..a.len() {
  27. r[i] = a[i] * b[i];
  28. }
  29. r
  30. }
  31. pub fn naive_msm<C: AffineRepr>(s: &Vec<C::ScalarField>, p: &Vec<C>) -> C {
  32. // check lengths
  33. let mut r = p[0].mul(s[0]);
  34. for i in 1..s.len() {
  35. r = p[i].mul(s[i]);
  36. }
  37. r.into()
  38. }
  39. pub fn vec_add<F: PrimeField>(a: Vec<F>, b: Vec<F>) -> Vec<F> {
  40. let mut r: Vec<F> = vec![F::zero(); a.len()];
  41. for i in 0..a.len() {
  42. r[i] = a[i] + b[i];
  43. }
  44. r
  45. }
  46. // TODO instead of vec_add do:
  47. // impl<'a, 'b, F> Add<&'b Vec<F>> for &'a Vec<F> {
  48. // type Output = Vec<F>;
  49. // fn add(self, rhs: &'b Vec<F>) -> Vec<F> {
  50. // let mut r: Vec<F> = vec![F::zero(); self.len()];
  51. // for i in 0..self.len() {
  52. // r[i] = self[i] + rhs[i];
  53. // }
  54. // r
  55. // }
  56. // }
  57. pub fn vec_sub<F: PrimeField>(a: Vec<F>, b: Vec<F>) -> Vec<F> {
  58. let mut r: Vec<F> = vec![F::zero(); a.len()];
  59. for i in 0..a.len() {
  60. r[i] = a[i] - b[i];
  61. }
  62. r
  63. }
  64. pub fn to_F_matrix<F: PrimeField>(M: Vec<Vec<usize>>) -> Vec<Vec<F>> {
  65. let mut R: Vec<Vec<F>> = vec![Vec::new(); M.len()];
  66. for i in 0..M.len() {
  67. R[i] = vec![F::zero(); M[i].len()];
  68. for j in 0..M[i].len() {
  69. R[i][j] = F::from(M[i][j] as u64);
  70. }
  71. }
  72. R
  73. }
  74. pub fn to_F_vec<F: PrimeField>(z: Vec<usize>) -> Vec<F> {
  75. let mut r: Vec<F> = vec![F::zero(); z.len()];
  76. for i in 0..z.len() {
  77. r[i] = F::from(z[i] as u64);
  78. }
  79. r
  80. }
  81. #[cfg(test)]
  82. mod tests {
  83. use super::*;
  84. use ark_bn254::{g1::G1Affine, Fr};
  85. use ark_ec::CurveGroup;
  86. use ark_std::{One, Zero};
  87. use std::ops::Mul;
  88. #[test]
  89. fn test_matrix_vector_product() {
  90. let A = to_F_matrix::<Fr>(vec![
  91. vec![0, 1, 0, 0, 0, 0],
  92. vec![0, 0, 0, 1, 0, 0],
  93. vec![0, 1, 0, 0, 1, 0],
  94. vec![5, 0, 0, 0, 0, 1],
  95. ]);
  96. let z = to_F_vec(vec![1, 3, 35, 9, 27, 30]);
  97. let Az = matrix_vector_product(&A, &z);
  98. assert_eq!(Az, to_F_vec(vec![3, 9, 30, 35]));
  99. }
  100. #[test]
  101. fn test_hadamard_product() {
  102. let a = to_F_vec::<Fr>(vec![1, 2, 3, 4, 5, 6]);
  103. let b = to_F_vec(vec![7, 8, 9, 10, 11, 12]);
  104. assert_eq!(
  105. hadamard_product(a, b),
  106. to_F_vec(vec![7, 16, 27, 40, 55, 72])
  107. );
  108. }
  109. #[test]
  110. fn test_ABC_hadamard() {
  111. let A = to_F_matrix::<Fr>(vec![
  112. vec![0, 1, 0, 0, 0, 0],
  113. vec![0, 0, 0, 1, 0, 0],
  114. vec![0, 1, 0, 0, 1, 0],
  115. vec![5, 0, 0, 0, 0, 1],
  116. ]);
  117. let B = to_F_matrix(vec![
  118. vec![0, 1, 0, 0, 0, 0],
  119. vec![0, 1, 0, 0, 0, 0],
  120. vec![1, 0, 0, 0, 0, 0],
  121. vec![1, 0, 0, 0, 0, 0],
  122. ]);
  123. let C = to_F_matrix(vec![
  124. vec![0, 0, 0, 1, 0, 0],
  125. vec![0, 0, 0, 0, 1, 0],
  126. vec![0, 0, 0, 0, 0, 1],
  127. vec![0, 0, 1, 0, 0, 0],
  128. ]);
  129. let z = to_F_vec(vec![1, 3, 35, 9, 27, 30]);
  130. let Az = matrix_vector_product(&A, &z);
  131. let Bz = matrix_vector_product(&B, &z);
  132. let Cz = matrix_vector_product(&C, &z);
  133. assert_eq!(hadamard_product(Az, Bz), Cz);
  134. }
  135. }