He estado implementando la adición de puntos en un programa C++ que he escrito, pero no veo cómo se puede hacer esto correctamente. Cuando lo hago slope = (y1 - y2)/(x1 - x2)
, obtengo un maldito decimal, que no produce los puntos adecuados cuando se aplica a las otras partes de la ecuación debido a que no conserva sus cualidades fraccionarias. ¿Alguien tiene alguna idea de cómo superar eso?
La suma de puntos se define mediante la siguiente ecuación:
slope = (y1 - y2) / (x1 - x2)
xsum = slope ^ 2 - (x1 + x2)
ysum = slope * (x1 - xsum) - y1
Donde Dirección Privada x02 con coordenadas x,y respectivamente:
89565891926547004231252920425935692360644145829622209833684329913297188986597
12158399299693830322967808612713398636155367887041628176798871954788371653930
con la Adición de Puntos de Dirección Privada x01 con coordenadas x,y respectivamente:
55066263022277343669578718895168534326250603453777594175500187360389116729240
32670510020758816978083085130507043184471273380659243275938904335757337482424
aplicada a la ecuación anterior produce el resultado de Dirección Privada x03 con coordenadas x, y respectivamente:
112711660439710606056748659173929673102114977341539408544630613555209775888121
25583027980570883691656905877401976406448868254816295069919888960541586679410
http://en.wikipedia.org/wiki/Elliptic_curve_point_multiplication
EDITAR:
Preparé este programa en C++ y lo modifiqué de todas las formas que se me ocurrieron (moviendo %p, haciéndolo demasiadas veces, dividiendo las ecuaciones y cosas por el estilo). No puedo conseguir que resulte en los resultados adecuados. ¿A alguien le importaría echarle un vistazo y ver qué puede encontrar, por favor?
La frase mágica en esa página está en un campo finito . Aquí el campo finito son los enteros mod p, donde p es el número 2 256 - 2 32 - 2 9 - 2 8 - 2 7 - 2 6 - 2 4 - 1 (ver aquí ). Así que toda la aritmética en tus ecuaciones no es aritmética ordinaria de números enteros o números reales; hay que hacerlo mod p. Consulte http://en.wikipedia.org/wiki/Modular_arithmetic . Para sumas, restas y multiplicaciones, puede usar la aritmética de enteros ordinaria y calcular el resto mod p al final. Para la división, necesitará algo como el algoritmo euclidiano extendido. Por supuesto, también deberá usar aritmética de precisión arbitraria si aún no lo ha hecho, ya que los números de este tamaño son demasiado grandes para los tipos estándar de C++ como long int
y double
.
Nate Eldredge
Mío
Nate Eldredge
willem hengeveld
willem hengeveld
willem hengeveld
willem hengeveld
Mío
willem hengeveld
Mío
Mío
Mío
willem hengeveld
Mío
Mío