IIC3253/2023

[T3] Definición de adición para curvas elípticas

Opened this issue · 1 comments

Hola! Que tengo una duda sobre la nomenclatura en el libro y como pasar esto a Python.
Por ejemplo, en el libro tenemos la siguiente expresión:
Captura de Pantalla 2023-06-20 a la(s) 21 54 01
Esto correspondería a (s^2 - x1 -x2) mod p que en Python se programaría:
(s**2 -x1 - x2) % p o equivalentemente (s*s -x1 - x2) % p

Mi problema es con la siguiente expresión:
Captura de Pantalla 2023-06-20 a la(s) 21 53 49
Aquí lo que yo entiendo es ((y2-y1)/(x2-x1)) mod p y se programaría ((y2-y1)/(x2-x1)) % p . Pero el problema es que esto te da como resultado una fracción por lo que escaparíamos del conjunto de los números enteros y no estaría en el grupo que definimos.

En internet encontré la misma expresión definida de la siguiente manera:
s = (y2 - y1) * pow(x2 - x1, -1, p)
que debería ser equivalente a decir (y2 - y1) / ((x2 - x1)mod p), pero por alguna razón esta expresión siempre me da números enteros y hace mucho más sentido.

Aún así, no estoy seguro que esta expresión sea correcta porque no logró hacer adición correctamente usando esta expresión.

Mi pregunta es, ¿Como programa las siguientes dos expresiones del libro en python?
Captura de Pantalla 2023-06-20 a la(s) 21 53 55

Captura de Pantalla 2023-06-20 a la(s) 21 53 49

La expresión ((y2-y1)/(x2-x1)) mod p del libro es equivalente a ((y2-y1)*z) mod p donde z es el inverso de (x2 - x1) en módulo p. Vale decir, el libro usa el hecho de que u/v es equivalente a u*v^(-1).

En la expresión s = (y2 - y1) * pow(x2 - x1, -1, p) estás usando la equivalencia anterior, ya que pow(x2 - x1, -1, p) calcula el inverso de (x2 - x1) en módulo p.

Saludos!