Ryan Rueger

ryan@rueg.re / picture / key / home
aboutsummaryrefslogtreecommitdiffhomepage
path: root/theta_lib/theta_structures/Tuple_point.py
diff options
context:
space:
mode:
authorRyan Rueger <git@rueg.re>2025-03-01 20:25:41 +0100
committerRyan Rueger <git@rueg.re>2025-03-01 22:11:11 +0100
commitd40de259097c5e8d8fd35539560ca7c3d47523e7 (patch)
tree18e0f94350a2329060c2a19b56b0e3e2fdae56f1 /theta_lib/theta_structures/Tuple_point.py
downloadpegasis-d40de259097c5e8d8fd35539560ca7c3d47523e7.tar.gz
pegasis-d40de259097c5e8d8fd35539560ca7c3d47523e7.tar.bz2
pegasis-d40de259097c5e8d8fd35539560ca7c3d47523e7.zip
Initial Commit
Co-Authored-By: Damien Robert <Damien.Olivier.Robert+git@gmail.com> Co-Authored-By: Frederik Vercauteren <frederik.vercauteren@gmail.com> Co-Authored-By: Jonathan Komada Eriksen <jonathan.eriksen97@gmail.com> Co-Authored-By: Pierrick Dartois <pierrickdartois@icloud.com> Co-Authored-By: Riccardo Invernizzi <nidadoni@gmail.com> Co-Authored-By: Ryan Rueger <git@rueg.re> [0.01s] Co-Authored-By: Benjamin Wesolowski <benjamin@pasch.umpa.ens-lyon.fr> Co-Authored-By: Arthur Herlédan Le Merdy <ahlm@riseup.net> Co-Authored-By: Boris Fouotsa <tako.fouotsa@epfl.ch>
Diffstat (limited to 'theta_lib/theta_structures/Tuple_point.py')
-rw-r--r--theta_lib/theta_structures/Tuple_point.py106
1 files changed, 106 insertions, 0 deletions
diff --git a/theta_lib/theta_structures/Tuple_point.py b/theta_lib/theta_structures/Tuple_point.py
new file mode 100644
index 0000000..aac248b
--- /dev/null
+++ b/theta_lib/theta_structures/Tuple_point.py
@@ -0,0 +1,106 @@
+from sage.all import *
+from ..utilities.discrete_log import weil_pairing_pari
+
+class TuplePoint:
+ def __init__(self,*args):
+ if len(args)==1:
+ self._points=list(args[0])
+ else:
+ self._points=list(args)
+
+ def points(self):
+ return self._points
+
+ def parent_curves(self):
+ return [x.curve() for x in self._points]
+
+ def parent_curve(self,i):
+ return self._points[i].curve()
+
+ def n_points(self):
+ return len(self._points)
+
+ def is_zero(self):
+ return all([self._points[i]==0 for i in range(self.n_points())])
+
+ def __repr__(self):
+ return str(self._points)
+
+ def __getitem__(self,i):
+ return self._points[i]
+
+ def __setitem__(self,i,P):
+ self._points[i]=P
+
+ def __eq__(self,other):
+ n_self=self.n_points()
+ n_other=self.n_points()
+ return n_self==n_other and all([self._points[i]==other._points[i] for i in range(n_self)])
+
+ def __add__(self,other):
+ n_self=self.n_points()
+ n_other=self.n_points()
+
+ if n_self!=n_other:
+ raise ValueError("Cannot add TuplePoint of distinct lengths {} and {}.".format(n_self,n_other))
+
+ points=[]
+ for i in range(n_self):
+ points.append(self._points[i]+other._points[i])
+ return self.__class__(points)
+
+ def __sub__(self,other):
+ n_self=self.n_points()
+ n_other=self.n_points()
+
+ if n_self!=n_other:
+ raise ValueError("Cannot substract TuplePoint of distinct lengths {} and {}.".format(n_self,n_other))
+
+ points=[]
+ for i in range(n_self):
+ points.append(self._points[i]-other._points[i])
+ return self.__class__(points)
+
+ def __neg__(self):
+ n_self=self.n_points()
+ points=[]
+ for i in range(n_self):
+ points.append(-self._points[i])
+ return self.__class__(points)
+
+ def __mul__(self,m):
+ n_self=self.n_points()
+ points=[]
+ for i in range(n_self):
+ points.append(m*self._points[i])
+ return self.__class__(points)
+
+ def __rmul__(self,m):
+ return self*m
+
+ def double_iter(self,n):
+ result=self
+ for i in range(n):
+ result=2*result
+ return result
+
+ def weil_pairing(self,other,n):
+ n_self=self.n_points()
+ n_other=self.n_points()
+
+ if n_self!=n_other:
+ raise ValueError("Cannot compute the Weil pairing of TuplePoint of distinct lengths {} and {}.".format(n_self,n_other))
+
+ zeta=1
+ for i in range(n_self):
+ zeta*=weil_pairing_pari(self._points[i],other._points[i],n)
+
+ return zeta
+
+
+
+
+
+
+
+