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 tipo int o bien de tipo EnteroModuloP o ElementoFq según sea n 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:
 

PuntoFqRacional

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 tipo EnteroModuloP o ElementoFq 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, utilice Fq().

Parámetros:
  • x – un elemento del cuerpo finito de q elementos.
  • y – un elemento del cuerpo finito de q elementos.

Los elementos de coeficientes y discriminante serán del tipo EnteroModuloP o ElementoFq 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:
 

bool

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 tipo int o bien de tipo EnteroModuloP o ElementoFq según sea n 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:
 

PuntoF2mRacional

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 tipo EnteroModuloP o ElementoFq según m sea uno o mayor que uno. Para construir elementos de estos tipos, utilice Fq().

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 y discriminante serán del tipo EnteroModuloP o ElementoFq 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:
 

bool

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 tipo int o bien de tipo fractions.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:
 

PuntoQRacional

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 tipo int o fractions.Fraction.

Parámetros:
  • x – un número racional.
  • y – un número racional.

Los elementos de coeficientes y discriminante serán del tipo int o fractions.Fraction según se haya llamado a curva_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:
 

bool

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.

class PuntoRacional(x, y)[fuente]

Clase abstracta que representa un punto racional de una curva elíptica. El resto de las clases Punto*Racional heredan de esta.

Esta clase no se puede instanciar. Sirve como punto de partida para crear curvas elípticas sobre nuevos cuerpos.