Răsfoiți Sursa

sonic arithmetization

narodnik 5 ani în urmă
părinte
comite
f62fcf0342
2 a modificat fișierele cu 97 adăugiri și 9 ștergeri
  1. 10 9
      scripts/halo/multipoly.py
  2. 87 0
      scripts/halo/sonic.py

+ 10 - 9
scripts/halo/multipoly.py

@@ -68,7 +68,7 @@ class MultiplyExpression:
 
 class MultivariatePolynomial:
 
-    def __init__(self, terms):
+    def __init__(self, terms=[]):
         self.terms = terms
 
     def __add__(self, term):
@@ -90,15 +90,16 @@ class MultivariatePolynomial:
             repr += str(term)
         return repr
 
-from finite_fields import finitefield
+if __name__ == "__main__":
+    from finite_fields import finitefield
 
-p = 0x40000000000000000000000000000000224698fc094cf91b992d30ed00000001
-fp = finitefield.IntegersModP(p)
+    p = 0x40000000000000000000000000000000224698fc094cf91b992d30ed00000001
+    fp = finitefield.IntegersModP(p)
 
-x = Variable("X")
-y = Variable("Y")
-z = Variable("Z")
+    x = Variable("X")
+    y = Variable("Y")
+    z = Variable("Z")
 
-p = x**3 * y**2 * x**2 * fp(5) * fp(2) + x**3 * y + z + fp(6)
-print(p)
+    p = x**3 * y**2 * x**2 * fp(5) * fp(2) + x**3 * y + z + fp(6)
+    print(p)
 

+ 87 - 0
scripts/halo/sonic.py

@@ -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)
+