| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- # From the Sonic paper
- from finite_fields import finitefield
- import numpy as np
- from multipoly import Variable, MultivariatePolynomial
- p = 0x40000000000000000000000000000000224698fc094cf91b992d30ed00000001
- fp = finitefield.IntegersModP(p)
- var_one = fp(1)
- var_x = fp(4)
- var_y = fp(6)
- var_s = fp(1)
- var_xy = var_x * var_y
- var_sxy = var_s * var_xy
- var_1_neg_s = var_one - var_s
- var_x_y = var_x + var_y
- var_1_s_neg_x_y = var_1_neg_s * var_x_y
- a = np.array([
- var_one, var_x, var_xy, var_1_neg_s, var_1_neg_s
- ])
- b = np.array([
- var_one, var_y, var_s, var_x_y, var_s
- ])
- c = np.array([
- var_one, var_xy, var_sxy, var_1_s_neg_x_y, var_s
- ])
- assert len(a) == len(b)
- assert len(b) == len(c)
- # 1 - s = 1 - s
- u1 = np.array([0, 0, 0, 1, -1])
- v1 = np.array([0, 0, 0, 0, 0])
- w1 = np.array([0, 0, 0, 0, 0])
- k1 = 0
- assert a.dot(u1) + b.dot(v1) + c.dot(w1) == k1
- # xy = xy
- u2 = np.array([0, 0, 1, 0, 0])
- v2 = np.array([0, 0, 0, 0, 0])
- w2 = np.array([0, -1, 0, 0, 0])
- k2 = 0
- assert a.dot(u2) + b.dot(v2) + c.dot(w2) == k2
- # s = s
- u3 = np.array([0, 0, 0, 0, 0])
- v3 = np.array([0, 0, 1, 0, -1])
- w3 = np.array([0, 0, 0, 0, 0])
- k3 = 0
- assert a.dot(u3) + b.dot(v3) + c.dot(w3) == k3
- # s = s
- u4 = np.array([0, 0, 0, 0, 0])
- v4 = np.array([0, 0, 1, 0, 0])
- w4 = np.array([0, 0, 0, 0, -1])
- k4 = 0
- assert a.dot(u4) + b.dot(v4) + c.dot(w4) == k4
- # 1 - s
- u5 = np.array([1, 0, 0, -1, 0])
- v5 = np.array([0, 0, -1, 0, 0])
- w5 = np.array([0, 0, 0, 0, 0])
- k5 = 0
- assert a.dot(u5) + b.dot(v5) + c.dot(w5) == k5
- # x + y
- u6 = np.array([0, 1, 0, 0, 0])
- v6 = np.array([0, 1, 0, -1, 0])
- w6 = np.array([0, 0, 0, 0, 0])
- k6 = 0
- assert a.dot(u6) + b.dot(v6) + c.dot(w6) == k6
- y = Variable("Y")
- p = MultivariatePolynomial()
- for i, (a_i, b_i, c_i) in enumerate(zip(a, b, c)):
- print(a_i, b_i, c_i)
- p += y**i * (a_i * b_i - c_i)
- print(p)
|