error in elliptic curve scalar multiplication code
The following code i have written for scalar multiplication over elliptic curve for prime field 37 but it gives me error for some of the scalar. the method is LSB first.
import time
import sys
from sage.all import *
# elliptic curve domain parameters, prime192v1
# domain parameters
p = 37
A = 7
B = 25
G = 1
n = 21
print "\n p =", p
print "\n A =", A
print "\n B =", B
F = GF(p)
E = EllipticCurve(F, [A,B])
print "\n Elliptic curve equation:", E
def point_add(P, Q):
x1 = P[0]
y1 = P[1]
x2 = Q[0]
y2 = Q[1]
# check P == O
if P == [0, 0]:
return Q
# check Q == O
if Q == [0, 0]:
return P
# check Q == -P
if x1 == x2 and y1 + y2 == 0:
return [0, 0]
# check P == Q
if P == Q:
return point_double(P)
slope = F((y2 - y1)/(x2 - x1))
x3 = F(slope**2 - x1 - x2)
y3 = F(slope * (x1 - x3) - y1)
return[x3, y3]
def point_double(P):
# if P == [0, 0]:
# return [0, 0]
x1 = P[0]
y1 = P[1]
slope = F((3 * x1**2 + A)/(2 * y1))
x3 = F(slope**2 - 2 * x1)
y3 = F(slope * (x1 - x3) - y1)
return [x3, y3]
def scalar_mult(K,P):
print('hi')
b_k = ZZ(K).bits(); print(b_k) # ; K.digits(2)
l = len(b_k); l
sum1 = 0*P; sum1
print(b_k[0])
if b_k[0] == 1:
sum1 = P; sum1
else:
sum1 = 0
Q = P; print(Q)
for i in range(1, l):
Q = point_double(Q); print(Q)
if b_k[i] == 1:
print (b_k[i])
# sum = point_add(sum, Q)
sum1 = point_add(sum1, Q)
print(sum1)
# Q = point_double(Q)
return sum1
P = E(20,32); P #; P.random_point(); P
f1 = P.order(); f1
K = randint(1,f1); K
answer1 = K*P; answer1
start1 = time.time()
answer = scalar_mult(K,P); answer
end1 = time.time()
print "\n Time Required to compute scalar multiplication: %s" % (end1 - start1)
answer2 = E(answer); answer2