Pebble Coding

プログラマーの作業メモ

macOS 10.12 jupyer notebook でグラフを描画する(Fpにおける楕円曲線の解の個数)

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()

うまくいきました。

f:id:pebble8888:20170908220013p:plain

次に y = x^{2}となる整数を少しプロットしてみます。

%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()

f:id:pebble8888:20170908222813p:plain

今度は数式で計算します。

%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()

f:id:pebble8888:20170908230438p:plain

さてついに、有限体 F_p上の楕円曲線の解をプロットしてみましょう。
 F_5,  y^{2} = x^{3} + x^{2} + 1の場合です。

%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()

f:id:pebble8888:20170908234804p:plain

有理点の数が#EC: 8+1(無限遠点)=9 であることが分かりました。

これで、 F_{p}における任意の楕円曲線上の有理点を簡単に数えられる実験道具を手に入れました。

Hasse-Weilの定理が正しい事を、この曲線  y^{2} = x^{3} + x + 1 で試してみましょう。

f:id:pebble8888:20170909000043p:plain
f:id:pebble8888:20170909000052p:plain
f:id:pebble8888:20170909000945p:plain
f:id:pebble8888:20170909001055p:plain
f:id:pebble8888:20170909001153p:plain
f:id:pebble8888:20170909001257p:plain

確かにHasse-Heilの定理が成り立っている気がしますね。