|
|
@@ -0,0 +1,87 @@
|
|
|
+# 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)
|
|
|
+
|