一、
x的取值范围是0-6,mod 7的二次剩余是1,2,4, 1 = 1 m o d 7 1=1mod7 1=1mod7, 4 = 2 2 m o d 7 4=2^2mod7 4=22mod7. 2 = 3 2 m o d 7 2=3^2mod7 2=32mod7,
x | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
---|---|---|---|---|---|---|---|
y 2 = x 3 + 2 x + 4 y^2=x^3+2x+4 y2=x3+2x+4 | 1 | 4 | 6 | 6 | 3 | 3 | 5 |
是否为二次剩余 | Y | Y | N | N | N | N | N |
Y | 1,6 | 2,5 |
(所以 E 7 ( 2 , 1 ) 的 所 有 点 为 ( 0 , 1 ) ( 0 , 6 ) ( 1 , 2 ) ( 1 , 5 ) 以 及 无 穷 远 点 E_7(2,1)的所有点为(0,1)(0,6)(1,2)(1,5)以及无穷远点 E7(2,1)的所有点为(0,1)(0,6)(1,2)(1,5)以及无穷远点
二、
- P=(3,5),-P=(3,-5), − 5 m o d 7 = 2 -5mod7=2 −5mod7=2,-P=(3,2)
- Q=(2,5),-Q=(2,-5), − 5 m o d 7 = 2 -5mod7=2 −5mod7=2,-Q=(2,2)
- R=(5,0),-R=(5,0)
三、
p = 11 , a = 1 , b = 7 p=11,a=1,b=7 p=11,a=1,b=7,
因为有
x
R
=
(
λ
2
−
x
P
−
x
Q
)
m
o
d
p
x_R=(\lambda^2-x_P-x_Q)mod p
xR=(λ2−xP−xQ)modp
y R = ( λ ( x P − x R ) − y P ) m o d p y_R=(\lambda(x_P-x_R)-y_P)modp yR=(λ(xP−xR)−yP)modp
λ = y Q − y P x Q − x P m o d p , 若 P ≠ Q \lambda=\frac{y_Q-y_P}{x_Q-x_P}modp,若P\neq Q λ=xQ−xPyQ−yPmodp,若P=Q
λ = 3 x P 2 + a 2 y P m o d p , 若 P = Q \lambda=\frac{3x_P^2+a}{2y_P}modp,若P = Q λ=2yP3xP2+amodp,若P=Q
G = ( 3 , 2 ) , λ = 3 ∗ 3 ∗ 3 + 1 2 ∗ 2 m o d 11 = 7 G=(3,2),\lambda=\frac{3*3*3+1}{2*2}mod11=7 G=(3,2),λ=2∗23∗3∗3+1mod11=7
x 3 = 7 2 − 3 − 3 = 10 ( m o d 11 ) y 3 = ( 7 ∗ ( 3 − 10 ) − 2 ) = 4 ( m o d 11 ) x_3=7^2-3-3=10(mod11) y_3=(7*(3-10)-2)=4(mod11) x3=72−3−3=10(mod11)y3=(7∗(3−10)−2)=4(mod11)
G | 2G | 3G | 4G | 5G | 6G | 7G | 8G | 9G | 10G | 11G | 12G | 13G | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
(3,2) | (10,4) | (1,8) | (5,4) | (4,8) | (7,7) | (6,8) | (6,3) | (7,4) | (4,3) | (5,7) | (1,3) | (10,7) | |
λ \lambda λ | 7 | 5 | 8 | 1 | 6 | 4 | 2 | 4 | 6 | 1 | 8 | 5 |
def getLambda(x1, y1, x2, y2, a, p):
if x1 == x2 and y1 == y2:
return ((3 * x1 * x1 + a) / (2 * y1)) % p
else:
t1 = y2 - y1
t2 = x2 - x1
while t2 < 0:
t2 += p
while t1 < 0:
t1 += p
return fracMod(t1,t2,p)
def fracMod(x,y,p):
for i in range(p):
if y*i % p == x:
return i
def getX(alpha, x1, x2, p):
return (alpha ** 2 - x1 - x2) % p
def getY(alpha, x1, x3, y3, p):
return (alpha * (x1 - x3) - y1) % p
if __name__ == '__main__':
x1 = 3
y1 = 2
x2 = 3
y2 = 2
n = 13
a = 1
p = 11
for i in range(2, n+1):
alpha = getLambda(x1, y1, x2, y2, a, p)
x3 = getX(alpha, x1, x2, p)
y3 = getY(alpha, x1, x3, y1, p)
print("lambda:", alpha)
print(f"{i}G", x3, y3)
x1 = x3
y1 = y3