Curvas elípticas¶
Aritmética con curvas elípticas.
Este módulo permite operar con el grupo de puntos de una curva elíptica.
Para utilizar las funciones y las clases de este módulo, debe importarlo previamente:
# reemplace ... por la función/clase que desea utilizar
from ccepy.curvas_elipticas import ...
Para operar con puntos de una curva elíptica, use las funciones de la forma
curva_eliptica_sobre_*
y los operadores aritméticos habituales.
>>> E = curva_eliptica_sobre_Fq(a=2, b=3, p=97) # y^2 = x^3 + 2x + 3 sobre F97
>>> E.coeficientes
Coeficientes(a=2, b=3)
>>> P = E(0, 10)
>>> P
(0,10)
>>> Q = E(3, 6)
>>> Q
(3,6)
>>> P + Q
(85,71)
>>> -P
(0,87)
>>> 3 * P
(23,24)
Lista de funciones y clases de curvas_elipticas
:
curva_eliptica_sobre_Fq |
Devuelve el constructor de puntos de una curva elíptica sobre un cuerpo finito de q elementos de característica distinta de 2 y 3. |
PuntoFqRacional |
Representa un punto de una curva elíptica sobre un cuerpo finito de q elementos de característica distinta de 2 y 3. |
curva_eliptica_sobre_F2m |
Devuelve el constructor de puntos de una curva elíptica sobre el cuerpo finito de 2**m elementos. |
PuntoF2mRacional |
Representa un punto de una curva elíptica sobre el cuerpo finito de 2**m elementos. |
curva_eliptica_sobre_Q |
Devuelve el constructor de puntos de una curva elíptica sobre los números racionales. |
PuntoQRacional |
Representa un punto de una curva elíptica sobre los números racionales. |
PuntoRacional |
Clase abstracta que representa un punto racional de una curva elíptica. |
-
curva_eliptica_sobre_Fq
(a, b, p, n=1, pol_irreducible=None)[fuente]¶ Devuelve el constructor de puntos de una curva elíptica sobre un cuerpo finito de q elementos de característica distinta de 2 y 3.
>>> E = curva_eliptica_sobre_Fq(1, 1, 5, 2) # y^2 = x^3 + x + 1 sobre F25 >>> E <class 'ccepy.curvas_elipticas.curva_eliptica_sobre_Fq.<locals>.PuntoFqRacional'> >>> E(0, 1) ({[0, 0]; 25},{[1, 0]; 25})
Los dos primeros argumentos (
a
,b
) son los coeficientes de la ecuación de Weierstrass simplificada: \(y^2 = x^3 + a x + b\). Estos valores pueden ser bien de tipoint
o bien de tipoEnteroModuloP
oElementoFq
según sean
uno o mayor que uno respectivamente.Los tres últimos argumentos (
p
,n
,pol_irreducible
) definen el cuerpo finito de p**n elementos sobre el que se define la curva eliptipca.Parámetros: - a – el coeficiente que acompaña a x en la ecuación de Weierstrass
- b – el término independiente de la ecuación de Weierstrass
- p (int) – un número primo.
- n (Optional[int]) – un número natural.
- pol_irreducible (Optional[PolinomioZp]) – un polinomio de grado n irreducible.
Devuelve: la clase que representa los puntos de la curva elíptica.
Tipo del valor devuelto:
-
class
PuntoFqRacional
(x, y)[fuente]¶ Representa un punto de una curva elíptica sobre un cuerpo finito de q elementos de característica distinta de 2 y 3.
>>> E = curva_eliptica_sobre_Fq(1, 1, 5, 2) # y^2 = x^3 + x + 1 sobre F25 >>> F25 = Fq(5, 2) >>> P = E(F25.cero(), F25.uno()) >>> type(P) <class 'ccepy.curvas_elipticas.curva_eliptica_sobre_Fq.<locals>.PuntoFqRacional'> >>> P ({[0, 0]; 25},{[1, 0]; 25}) >>> Q = E(F25([4, 0]), F25([2, 0])) >>> Q ({[4, 0]; 25},{[2, 0]; 25}) >>> P + Q ({[2, 0]; 25},{[1, 0]; 25}) >>> -P ({[0, 0]; 25},{[4, 0]; 25}) >>> 4 * P ({[3, 0]; 25},{[4, 0]; 25})
La curva elíptica está definida por la ecuación de Weierstrass simplificada \(y^2 = x^3 + a x + b\).
Soporta los operadores
+
,-
,*
con su significado habitual.Los parámetros
x
,y
deben ser del tipoEnteroModuloP
oElementoFq
según el cuerpo finito tenga un número primo de elementos o un número potencia de un primo de elementos. Para construir elementos de estos tipos, utiliceFq()
.Parámetros: - x – un elemento del cuerpo finito de q elementos.
- y – un elemento del cuerpo finito de q elementos.
Los elementos de
coeficientes
ydiscriminante
serán del tipoEnteroModuloP
oElementoFq
según el cuerpo finito tenga un número primo de elementos o un número potencia de un primo de elementos.-
coeficientes
¶ Tuple – los coeficientes (a, b) de la ecuación de Weierstrass. (atributo de clase)
-
discriminante
¶ El discriminate de la curva elíptica. (atributo de clase)
-
Fq
¶ El constructor de elementos del cuerpo finito de q elementos. (atributo de clase)
-
classmethod
contiene
(x, y)[fuente]¶ Comprueba si el punto (x, y) pertenece a la curva elíptica.
Parámetros: - a – un elemento del cuerpo finito de q elementos.
- b – un elemento del cuerpo finito de q elementos.
Devuelve: verdadero o falso.
Tipo del valor devuelto:
-
elemento_neutro
()¶ Devuelve el elemento neutro.
Devuelve: El elemento neutro.
-
es_elemento_neutro
()¶ Comprueba si es el elemento neutro (el punto del infinito).
Devuelve: verdadero o falso. Tipo del valor devuelto: bool
-
x
¶ La componente x del punto si no es el elemento neutro. Es un atributo de solo lectura.
-
y
¶ La componente y del punto si no es el elemento neutro. Es un atributo de solo lectura.
-
curva_eliptica_sobre_F2m
(a, b, m, pol_irreducible=None)[fuente]¶ Devuelve el constructor de puntos de una curva elíptica sobre el cuerpo finito de 2**m elementos.
>>> pol_irreducible = PolinomioZp([1, 1, 0, 0, 1], p=2) >>> F16 = Fq(2, 4, pol_irreducible) >>> a = F16([0, 0, 0, 1]) >>> b = F16([1, 0, 0, 1]) >>> E = curva_eliptica_sobre_F2m(a, b, 4, pol_irreducible) >>> E <class 'ccepy.curvas_elipticas.curva_eliptica_sobre_F2m.<locals>.PuntoF2mRacional'> >>> E(F16.uno(), F16.uno()) ({[1, 0, 0, 0]; 16},{[1, 0, 0, 0]; 16})
Los dos primeros argumentos (
a
,b
) son los coeficientes de la ecuación de Weierstrass simplificada: \(y^2 + x y = x^3 + a x^2 + b\). Estos valores pueden ser bien de tipoint
o bien de tipoEnteroModuloP
oElementoFq
según sean
uno o mayor que uno respectivamente.Los dos últimos argumentos (
m
,pol_irreducible
) definen el cuerpo finito de 2**m elementos sobre el que se define la curva eliptipca.Parámetros: - a – el coeficiente que acompaña a x^2 en la ecuación de Weierstrass
- b – el término independiente de la ecuación de Weierstrass
- m ([int]) – un número natural.
- pol_irreducible (Optional[PolinomioZp]) – un polinomio de grado m irreducible.
Devuelve: la clase que representa los puntos de la curva elíptica.
Tipo del valor devuelto:
-
class
PuntoF2mRacional
(x, y)[fuente]¶ Representa un punto de una curva elíptica sobre el cuerpo finito de 2**m elementos.
>>> pol_irreducible = PolinomioZp([1, 1, 0, 0, 1], p=2) >>> F16 = Fq(2, 4, pol_irreducible) >>> a = F16([0, 0, 0, 1]) >>> b = F16([1, 0, 0, 1]) >>> E = curva_eliptica_sobre_F2m(a, b, 4, pol_irreducible) >>> E.coeficientes Coeficientes(a={[0, 0, 0, 1]; 16}, b={[1, 0, 0, 1]; 16}) >>> P = E(F16([0, 1, 0, 0]), F16([1, 1, 1, 1])) >>> type(P) <class 'ccepy.curvas_elipticas.curva_eliptica_sobre_F2m.<locals>.PuntoF2mRacional'> >>> P ({[0, 1, 0, 0]; 16},{[1, 1, 1, 1]; 16}) >>> Q = E(F16([0, 0, 1, 1]), F16([0, 0, 1, 1])) >>> Q ({[0, 0, 1, 1]; 16},{[0, 0, 1, 1]; 16}) >>> P + Q ({[1, 0, 0, 0]; 16},{[1, 0, 0, 0]; 16}) >>> -P ({[0, 1, 0, 0]; 16},{[1, 0, 1, 1]; 16}) >>> 2 * P ({[1, 1, 0, 1]; 16},{[0, 1, 0, 0]; 16})
La curva elíptica está definida por la ecuación de Weierstrass simplificada \(y^2 + x y = x^3 + a x^2 + b\).
Soporta los operadores
+
,-
,*
con su significado habitual.Los parámetros
x
,y
deben ser del tipoEnteroModuloP
oElementoFq
según m sea uno o mayor que uno. Para construir elementos de estos tipos, utiliceFq()
.Parámetros: - x – un elemento del cuerpo finito de 2**m elementos.
- y – un elemento del cuerpo finito de 2**m elementos.
Los elementos de
coeficientes
ydiscriminante
serán del tipoEnteroModuloP
oElementoFq
según m sea uno o mayor que uno.-
coeficientes
¶ Tuple – los coeficientes (a, b) de la ecuación de Weierstrass. (atributo de clase)
-
discriminante
¶ El discriminate de la curva elíptica. (atributo de clase)
-
Fq
¶ El constructor de elementos del cuerpo finito de 2**m elementos. (atributo de clase)
-
classmethod
contiene
(x, y)[fuente]¶ Comprueba si el punto (x, y) pertenece a la curva elíptica.
Parámetros: - a – un elemento del cuerpo finito de 2**m elementos.
- b – un elemento del cuerpo finito de 2**m elementos.
Devuelve: verdadero o falso.
Tipo del valor devuelto:
-
elemento_neutro
()¶ Devuelve el elemento neutro.
Devuelve: El elemento neutro.
-
es_elemento_neutro
()¶ Comprueba si es el elemento neutro (el punto del infinito).
Devuelve: verdadero o falso. Tipo del valor devuelto: bool
-
x
¶ La componente x del punto si no es el elemento neutro. Es un atributo de solo lectura.
-
y
¶ La componente y del punto si no es el elemento neutro. Es un atributo de solo lectura.
-
curva_eliptica_sobre_Q
(a, b)[fuente]¶ Devuelve el constructor de puntos de una curva elíptica sobre los números racionales.
>>> E = curva_eliptica_sobre_Q(0, 4) # y^2 = x^3 + 4 sobre Q >>> E <class 'ccepy.curvas_elipticas.curva_eliptica_sobre_Q.<locals>.PuntoQRacional'> >>> E(0, -2) (0,-2)
Los argumentos (
a
,b
) son los coeficientes de la ecuación de Weierstrass simplificada: \(y^2 = x^3 + a x + b\). Estos valores pueden ser bien de tipoint
o bien de tipofractions.Fraction
.Parámetros: - a – el coeficiente que acompaña a x en la ecuación de Weierstrass
- b – el término independiente de la ecuación de Weierstrass
Devuelve: la clase que representa los puntos de la curva elíptica.
Tipo del valor devuelto:
-
class
PuntoQRacional
(x, y)[fuente]¶ Representa un punto de una curva elíptica sobre los números racionales.
>>> E = curva_eliptica_sobre_Q(-18, -72) # y^2 = x^3 - 18 * x - 72 sobre Q >>> P = E(6, 6) >>> type(P) <class 'ccepy.curvas_elipticas.curva_eliptica_sobre_Q.<locals>.PuntoQRacional'> >>> P (6,6) >>> Q = E(Fraction(177, 4), Fraction(-2343, 8)) >>> Q (177/4,-2343/8) >>> P + Q (28102/2601,4183750/132651) >>> -P (6,-6) >>> 4 * P (111795513/9759376,-1067078260371/30488290624)
La curva elíptica está definida por la ecuación de Weierstrass simplificada \(y^2 = x^3 + a x + b\).
Soporta los operadores
+
,-
,*
con su significado habitual.Los parámetros
x
,y
deben ser del tipoint
ofractions.Fraction
.Parámetros: - x – un número racional.
- y – un número racional.
Los elementos de
coeficientes
ydiscriminante
serán del tipoint
ofractions.Fraction
según se haya llamado acurva_eliptica_sobre_Q()
.-
coeficientes
¶ Tuple – los coeficientes (a, b) de la ecuación de Weierstrass. (atributo de clase)
-
discriminante
¶ El discriminate de la curva elíptica. (atributo de clase)
-
classmethod
contiene
(x, y)[fuente]¶ Comprueba si el punto (x, y) pertenece a la curva elíptica.
Parámetros: - a – un número racional.
- b – un número racional.
Devuelve: verdadero o falso.
Tipo del valor devuelto:
-
elemento_neutro
()¶ Devuelve el elemento neutro.
Devuelve: El elemento neutro.
-
es_elemento_neutro
()¶ Comprueba si es el elemento neutro (el punto del infinito).
Devuelve: verdadero o falso. Tipo del valor devuelto: bool
-
x
¶ La componente x del punto si no es el elemento neutro. Es un atributo de solo lectura.
-
y
¶ La componente y del punto si no es el elemento neutro. Es un atributo de solo lectura.