Elliptic Curve Prime factorisation

kost BebiX k.bx at ya.ru
Fri Jan 14 15:01:52 EST 2011


14.01.2011, 21:52, "mukesh tiwari" <mukeshtiwari.iiitm at gmail.com>:
> Hello all , I have implemented Elliptic curve prime factorisation
> using wikipedia [ http://en.wikipedia.org/wiki/Lenstra_elliptic_curve_factorization].
> I think that this code is not optimised and posting for further
> improvement. Feel free to comment and if you have any link regarding
> Elliptic curve prime factorisation , kindly post it.
> Thank you
>
> import math
> import random
>
> #y^2=x^3+ax+b mod n
>
> def extended_gcd(a,b):   # taken from wikipedia
>         x,y,lastx,lasty=0,1,1,0
>         while b!=0:
>                 q=a/b
>                 a,b=b,a%b
>                 x,lastx=(lastx-q*x,x)
>                 y,lasty=(lasty-q*y,y)
>         if a<0:
>                 return (-a,-lastx,-lasty)
>         else:
>                 return (a,lastx,lasty)
> def gcd(a,b):
>         if a < 0:  a = -a
>         if b < 0:  b = -b
>         if a == 0: return b
>         if b == 0: return a
>         while b != 0:
>                 (a, b) = (b, a%b)
>         return a
>
> def randomCurve(N):
>         A,u,v=random.randrange(N),random.randrange(N),random.randrange(N)
>         B=(v*v-u*u*u-A*u)%N
>         return [(A,B,N),(u,v)]
>
> def addPoint(E,p_1,p_2):
>         if p_1=="Identity": return [p_2,1]
>         if p_2=="Identity": return [p_1,1]
>         a,b,n=E
>         (x_1,y_1)=p_1
>         (x_2,y_2)=p_2
>         x_1%=n
>         y_1%=n
>         x_2%=n
>         y_2%=n
>         if x_1 != x_2 :
>                 d,u,v=extended_gcd(x_1-x_2,n)
>                 s=((y_1-y_2)*u)%n
>                 x_3=(s*s-x_1-x_2)%n
>                 y_3=(-y_1-s*(x_3-x_1))%n
>         else:
>                 if (y_1+y_2)%n==0:return ["Identity",1]
>                 else:
>                         d,u,v=extended_gcd(2*y_1,n)
>                         s=((3*x_1*x_1+a)*u)%n
>                         x_3=(s*s-2*x_1)%n
>                         y_3=(-y_1-s*(x_3-x_1))%n
>
>         return [(x_3,y_3),d]
>
> def mulPoint(E,P,m):
>         Ret="Identity"
>         d=1
>         while m!=0:
>                 if m%2!=0: Ret,d=addPoint(E,Ret,P)
>                 if d!=1 : return [Ret,d]  # as soon as i got anything otherthan 1
> return
>                 P,d=addPoint(E,P,P)
>                 if d!=1 : return [Ret,d]
>                 m>>=1
>         return [Ret,d]
>
> def ellipticFactor(N,m,times=5):
>         for i in xrange(times):
>                 E,P=randomCurve(N);
>                 Q,d=mulPoint(E,P,m)
>                 if d!=1 : return d
>         return N
>
> if __name__=="__main__":
>         n=input()
>         m=int(math.factorial(1000))
>         while n!=1:
>                 k=ellipticFactor(n,m)
>                 n/=k
>                 print k
>
> --
> http://mail.python.org/mailman/listinfo/python-list

Well, first of all you should read and follow this http://www.python.org/dev/peps/pep-0008/ :-)

-- 
jabber: k.bx at ya.ru



More information about the Python-list mailing list