sumcheck.sage 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. # Boolean hypercube means a bitstring
  2. # 3d boolean hypercube = ℤ₂³
  3. var("x y z")
  4. f = 3*x*y + 5*x*z + 2*x*y*z + 6
  5. claimed_eval = sum([
  6. f(x=0, y=0, z=0),
  7. f(x=0, y=0, z=1),
  8. f(x=0, y=1, z=0),
  9. f(x=0, y=1, z=1),
  10. f(x=1, y=0, z=0),
  11. f(x=1, y=0, z=1),
  12. f(x=1, y=1, z=0),
  13. f(x=1, y=1, z=1),
  14. ])
  15. # We will now prove the claim
  16. assert claimed_eval == 66
  17. # Prover constructs g1 such that g1(0) + g1(1) == claimed_eval
  18. g1_0 = sum([
  19. f(x=0, y=0, z=0),
  20. f(x=0, y=0, z=1),
  21. f(x=0, y=1, z=0),
  22. f(x=0, y=1, z=1),
  23. ])
  24. g1_1 = sum([
  25. f(x=1, y=0, z=0),
  26. f(x=1, y=0, z=1),
  27. f(x=1, y=1, z=0),
  28. f(x=1, y=1, z=1),
  29. ])
  30. g1 = (1 - x)*g1_0 + x*g1_1
  31. # Verifier:
  32. assert g1(x=0) + g1(x=1) == claimed_eval
  33. r1 = 2
  34. # Prover now constructs g2(y) such that g1(r1) == g2(0) + g2(1)
  35. g2_0 = sum([
  36. f(x=r1, y=0, z=0),
  37. f(x=r1, y=0, z=1),
  38. ])
  39. g2_1 = sum([
  40. f(x=r1, y=1, z=0),
  41. f(x=r1, y=1, z=1),
  42. ])
  43. g2 = (1 - y)*g2_0 + y*g2_1
  44. # Verifier
  45. assert g2(y=0) + g2(y=1) == g1(x=r1)
  46. r2 = 7
  47. # Prover constructs g3(z) : g2(r2) == g3(0) + g3(1)
  48. g3_0 = f(x=r1, y=r2, z=0)
  49. g3_1 = f(x=r1, y=r2, z=1)
  50. g3 = (1 - z)*g3_0 + z*g3_1
  51. # Now verifier picks a random challenge
  52. α = 9
  53. # and checks f(r1, r2, α) == g3(α)
  54. assert f(x=r1, y=r2, z=α) == g3(z=α)
  55. # The verifier is now convinced the claimed_eval is correct.
  56. # They did not need to sum a whole load of evaluations.