

#C20.txt: April 1, 2024
Help20:=proc(): print(`RP(a,b), DoesLie(a,b,P), AddE(a,b,P,Q) `):end:
#Elliptic curve: y^2=x^3+a*x+b 
RP:=proc(a,b) local x: x:=rand(0..200)()/100: [x,sqrt(x^3+a*x+b)]:end:

DoesLie:=proc(a,b,P): P[2]^2-P[1]^3-a*P[1]-b:end:

AddE:=proc(a,b,P,Q) local x,y,s,eq,sol,R,xR:
 s:=(P[2]-Q[2])/(P[1]-Q[1]):
  y:=P[2]+(x-P[1])*s:
sol:={solve(y^2-x^3-a*x-b,x)};


if not (nops(sol)=3 and member(P[1],sol) and member(Q[1],sol)) then
  print(`Something bad happened`):
  RETURN(FAIL):
fi:

sol:=sol minus {P[1],Q[1]}:
xR:=sol[1]:
[xR,-sqrt(xR^3+a*xR+b)]:
end: 

Help:=proc(): print(`EC(a,b,p), AE(P,Q), AEp(P,Q,p)`): end:

EC:=proc(a,b,p) local x,y,gu:
gu:={}:
for x from 0 to p-1 do
 for y from 0 to p-1 do
   if y^2-(x^3+a*x+b) mod p=0 then
     gu:=gu union {[x,y]}:
   fi:
  od:
od:
gu:
end:


AEp:=proc(P,Q,p) local lambda,xR,yR:
  if P[1]=Q[1] then
    RETURN(0):
  else
   lambda:=(Q[2]-P[2])*(Q[1]-P[1])&^(-1) mod p:
   xR:=lambda^2-P[1]-Q[1] mod p:
    yR:=lambda*(P[1]-xR)-P[2] mod p:
    RETURN([xR,yR]):
 fi:
end:



AE:=proc(P,Q,a,b) local lambda,xR,yR:

if P[1]<>Q[1] then
   lambda:=(Q[2]-P[2])*(Q[1]-P[1])^(-1):
   xR:=lambda^2-P[1]-Q[1] :
    yR:=lambda*(P[1]-xR)-P[2] :
    RETURN([xR,yR]):

elif P[1]=Q[1] then
   if P[2]=-Q[2] then
    RETURN(0):
  elif P[2]=Q[2] and P[2]<>1 then
  s:=(3*P[1]^2+a)/(2*P[2]):
  xR:=[s^2-2*P[1]
  RETURN([xR,P[2]-s*(P[1]-xR)]):
fi:
fi:


end:



