sonic.py 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. # From the Sonic paper
  2. from finite_fields import finitefield
  3. import numpy as np
  4. from multipoly import Variable, MultivariatePolynomial
  5. p = 0x40000000000000000000000000000000224698fc094cf91b992d30ed00000001
  6. fp = finitefield.IntegersModP(p)
  7. var_one = fp(1)
  8. var_x = fp(4)
  9. var_y = fp(6)
  10. var_s = fp(1)
  11. var_xy = var_x * var_y
  12. var_sxy = var_s * var_xy
  13. var_1_neg_s = var_one - var_s
  14. var_x_y = var_x + var_y
  15. var_1_s_neg_x_y = var_1_neg_s * var_x_y
  16. a = np.array([
  17. var_one, var_x, var_xy, var_1_neg_s, var_1_neg_s
  18. ])
  19. b = np.array([
  20. var_one, var_y, var_s, var_x_y, var_s
  21. ])
  22. c = np.array([
  23. var_one, var_xy, var_sxy, var_1_s_neg_x_y, var_s
  24. ])
  25. assert len(a) == len(b)
  26. assert len(b) == len(c)
  27. # 1 - s = 1 - s
  28. u1 = np.array([0, 0, 0, 1, -1])
  29. v1 = np.array([0, 0, 0, 0, 0])
  30. w1 = np.array([0, 0, 0, 0, 0])
  31. k1 = 0
  32. assert a.dot(u1) + b.dot(v1) + c.dot(w1) == k1
  33. # xy = xy
  34. u2 = np.array([0, 0, 1, 0, 0])
  35. v2 = np.array([0, 0, 0, 0, 0])
  36. w2 = np.array([0, -1, 0, 0, 0])
  37. k2 = 0
  38. assert a.dot(u2) + b.dot(v2) + c.dot(w2) == k2
  39. # s = s
  40. u3 = np.array([0, 0, 0, 0, 0])
  41. v3 = np.array([0, 0, 1, 0, -1])
  42. w3 = np.array([0, 0, 0, 0, 0])
  43. k3 = 0
  44. assert a.dot(u3) + b.dot(v3) + c.dot(w3) == k3
  45. # s = s
  46. u4 = np.array([0, 0, 0, 0, 0])
  47. v4 = np.array([0, 0, 1, 0, 0])
  48. w4 = np.array([0, 0, 0, 0, -1])
  49. k4 = 0
  50. assert a.dot(u4) + b.dot(v4) + c.dot(w4) == k4
  51. # 1 - s
  52. u5 = np.array([1, 0, 0, -1, 0])
  53. v5 = np.array([0, 0, -1, 0, 0])
  54. w5 = np.array([0, 0, 0, 0, 0])
  55. k5 = 0
  56. assert a.dot(u5) + b.dot(v5) + c.dot(w5) == k5
  57. # x + y
  58. u6 = np.array([0, 1, 0, 0, 0])
  59. v6 = np.array([0, 1, 0, -1, 0])
  60. w6 = np.array([0, 0, 0, 0, 0])
  61. k6 = 0
  62. assert a.dot(u6) + b.dot(v6) + c.dot(w6) == k6
  63. y = Variable("Y")
  64. p = MultivariatePolynomial()
  65. for i, (a_i, b_i, c_i) in enumerate(zip(a, b, c)):
  66. print(a_i, b_i, c_i)
  67. p += y**i * (a_i * b_i - c_i)
  68. print(p)