matplotlibをインストールします。
~$ pip install matplotlib
%matplotlib inline import numpy as np import matplotlib.pyplot as plt # 乱数を生成 x = np.random.rand(100) y = np.random.rand(100) # 散布図を描画 plt.scatter(x, y) plt.show()
うまくいきました。
次にとなる整数を少しプロットしてみます。
%matplotlib inline import numpy as np import matplotlib.pyplot as plt a = np.array([[1,1], [2,4], [3,9], [4, 16]]) x = a[:, 0] y = a[:, 1] print x print y plt.scatter(x, y) plt.show()
今度は数式で計算します。
%matplotlib inline import numpy as np import matplotlib.pyplot as plt a = np.empty((0,2)) def square(x): return x*x for i in range(5): a = np.append(a, np.array([[i,square(i)]]), axis=0) x = a[:, 0] y = a[:, 1] plt.scatter(x, y) plt.show()
さてついに、有限体上の楕円曲線の解をプロットしてみましょう。
, の場合です。
%matplotlib inline import numpy as np import matplotlib.pyplot as plt points = np.empty((0,2)) class EC: def __init__(self, a, b, c, p): self.a = a self.b = b self.c = c self.p = p def oncurve(self, x, y): l = ((y**2) % self.p) r = (((x**3) + self.a*(x**2) + self.b*x + self.c) % self.p) #print "(" + str(x) + "," + str(y) + ") " + "l=" + str(l) + ",r=" + str(r) return l == r def d(self): return -4*(self.a**3)*self.c \ + (self.a**2)*(self.b**2) \ + 18*self.a*self.b*self.c \ - 4*(self.b**3) \ - 27 * (self.c**2) ec = EC(0, 1, 1, 5) for x in range(ec.p): for y in range(ec.p): if ec.oncurve(x, y): points = np.append(points, np.array([[x,y]]), axis=0) print "d:" + str(ec.d()) print "#EC:" + str(points.shape[0]+1) plotx = points[:, 0] ploty = points[:, 1] plt.scatter(plotx, ploty) plt.show()
有理点の数が#EC: 8+1(無限遠点)=9 であることが分かりました。
これで、における任意の楕円曲線上の有理点を簡単に数えられる実験道具を手に入れました。
Hasse-Weilの定理が正しい事を、この曲線 で試してみましょう。
確かにHasse-Heilの定理が成り立っている気がしますね。