From 6006ec74f5ad7ba7f4fd8455d98272889e344d94 Mon Sep 17 00:00:00 2001 From: jeremyteitelbaum Date: Tue, 22 May 2018 16:16:07 -0400 Subject: [PATCH] expanded example --- ctnt2018/CTNT ECM Example.ipynb | 112 ++++++++++++++++++++++++++++++++ ctnt2018/ECM.py | 2 - ctnt2018/primes10000.pickle | Bin 0 -> 27476 bytes 3 files changed, 112 insertions(+), 2 deletions(-) create mode 100644 ctnt2018/CTNT ECM Example.ipynb create mode 100644 ctnt2018/primes10000.pickle diff --git a/ctnt2018/CTNT ECM Example.ipynb b/ctnt2018/CTNT ECM Example.ipynb new file mode 100644 index 0000000..8741590 --- /dev/null +++ b/ctnt2018/CTNT ECM Example.ipynb @@ -0,0 +1,112 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Factor of F_7 is 59649589127497217\n" + ] + } + ], + "source": [ + "# %load ECM.py\n", + "# %load ec3.py\n", + "from math import log\n", + "import pickle\n", + "import gmpy2\n", + "\n", + "with open('primes10000.pickle','rb') as f:\n", + " Primes10000=pickle.load(f)\n", + " \n", + "def ecm(N,arange=100,krange=10000):\n", + " for a in range(-arange,arange):\n", + " x,y=0,1\n", + " for B in Primes10000:\n", + " k=B**(int(log(10000)/log(B)))\n", + " sx,sy,t=x,y,k\n", + " first=True\n", + " while t>0:\n", + " if t%2==1:\n", + " if first:\n", + " xm,ym=sx,sy\n", + " first=False\n", + " else:\n", + " # x1=xm,y1=ym, x2=sx,y2=sy,a=a,b=1,N=N\n", + " d,u,v=gmpy2.gcdext(sx-xm,N)\n", + " if d>1:\n", + " if d==N:\n", + " break\n", + " else:\n", + " return d\n", + " L=(u*(sy-ym)) % N\n", + " x_sum=(L*L-xm-sx) % N\n", + " ym=(L*(xm-x_sum)-ym) % N\n", + " xm=x_sum\n", + " # sx=x,sy=y,a=a,b=1,N\n", + " d,u,v=gmpy2.gcdext(2*sy,N)\n", + " if d>1:\n", + " if d==N:\n", + " break\n", + " else:\n", + " return d\n", + " L=(u*(3*sx*sx+a)) % N\n", + " x2=(L*L-2*sx) % N\n", + " sy=(L*(sx-x2)-sy) %N\n", + " sx=x2\n", + " t=t//2\n", + " x,y=xm,ym\n", + " print('Failed')\n", + "\n", + "\n", + "\n", + "N=2**(128)+1\n", + "print('Factor of F_7 is',ecm(N))\n", + "N=2**(256)+1\n", + "print('Factor of F_8 is',ecm(N))\n", + "N=2**(512)+1\n", + "print('Factor of F_9 is',ecm(N))\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.4" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/ctnt2018/ECM.py b/ctnt2018/ECM.py index dc01c5f..b486c3f 100644 --- a/ctnt2018/ECM.py +++ b/ctnt2018/ECM.py @@ -20,7 +20,6 @@ def ecm(N,arange=100,krange=10000): xm,ym=sx,sy first=False else: - # x1=xm,y1=ym, x2=sx,y2=sy,a=a,b=1,N=N d,u,v=gmpy2.gcdext(sx-xm,N) if d>1: if d==N: @@ -31,7 +30,6 @@ def ecm(N,arange=100,krange=10000): x_sum=(L*L-xm-sx) % N ym=(L*(xm-x_sum)-ym) % N xm=x_sum - # sx=x,sy=y,a=a,b=1,N d,u,v=gmpy2.gcdext(2*sy,N) if d>1: if d==N: diff --git a/ctnt2018/primes10000.pickle b/ctnt2018/primes10000.pickle new file mode 100644 index 0000000000000000000000000000000000000000..2d1295500526e186645a913a29ec99baa1cbe5fa GIT binary patch literal 27476 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 literal 0 HcmV?d00001