Pebble Coding

ソフトウェアエンジニアによるIT技術、数学の備忘録

macOS sierra 10.12 で Jupyter Notebook を立ち上げるまで

macOS sierra 10.12 に Jupiter Notebook をインストールする。

~$ brew install python
~$ brew link python
~$ python --version
Python 2.7.10
~$ which python
/usr/bin/python
~$ ls -l /usr/bin/python
-rwxr-xr-x  1 root  wheel  66576  4 29 08:36 /usr/bin/python*

~$ curl https://bootstrap.pypa.io/ez_setup.py -o - | sudo python
~$ pip install --user jupyter
~$ cd ~/Library/Python/2.7/bin
~$ ./jupyter notebook

最後のコマンドは notebook serverを起動するコマンドです。

ブラウザにこのような画面が立ち上がります。

f:id:pebble8888:20170901230043p:plain

右上のNewのとこからPython2を選ぶとセルにpythonコードを入力できるようになります。

f:id:pebble8888:20170901230052p:plain

セルに簡単なpythonコードを入れてみます。

f:id:pebble8888:20170901230059p:plain

セルに入れたpythonコードを実行するにはCellメニューからRunCellsを実行します。

f:id:pebble8888:20170901230114p:plain

実行結果が表示されました。

f:id:pebble8888:20170901230123p:plain

時間があったら、グラフ表示方法も調べたいですね。

Hasse-Weilの定理(楕円関数限定版)

Hasse-Weilの定理を楕円関数に限定した形で書くと、

Cが有限体  F_{p} 上定義された非特異な楕円曲線であるとき、
C上の  F_{p} に座標を持つ点の数を \#  C( F_{p}) と定義すると、
 p+1 -2 \sqrt {p} \leq \# C(F_{p}) \leq p+1 + 2 \sqrt {p}

不等式だが、任意の楕円曲線に関するものだというのがすごい。
これを実感するために、pを {10}^{100}くらいの数とすると、 \sqrt {p}は桁が半分の{10}^{50}くらいの数になる。
すると有限体上の楕円曲線上の解(x,y)(整数点)の個数は
 {10}^{100} - 2 \times {10}^{50} から
 {10}^{100} + 2 \times {10}^{50}の間であるということになる。 (-1は誤差なので省略した)

有限体F_{p}を定めたとき、解はおよそp個くらいあるから心配するなということをいっている。
楕円曲線を暗号として使う場合、もしこの解の数が極端に少なかったら、
簡単に破られてしまい、暗号としては使い物にならなくなってしまう。

www.pebblewind.com

Mordellの定理(位数2の有理点をもつ曲線の場合)

Cを C: y^{2} = x^{3} + a x^{2} + b x で与えられる3次曲線とする。ここでa,bは整数。
このとき曲線上の有理点のなす群C(Q)は有限生成アーベル群である。

解(x,y)が無限個、有限個どちらの場合でも、有限個の元から出発し、群演算によって、全ての元を作り出せるといっている。

有限アーベル群と有限生成アーベル群

有限アーベル群と有限生成アーベル群の違いを直感的に説明する。
アーベル群の正確な定義は述べないが、一つの演算(加法や乗法と呼ぶ)が定義された数の集合としておく。

有限アーベル群とは元の数が有限であるアーベル群である。
例えば、加法として2つの整数を加算して5で割った余りと定義した群は元が{0, 1, 2, 3, 4}の5つしかない有限アーベル群である。

無限アーベル群とは元の数が無限個あるアーベル群である。
例えば、加法として2つの整数を加算と定義した群、つまり整数全体は元の数が無限個あるので無限アーベル群である。

有限生成アーベル群とは、有限個の元に演算を有限回もしくは無限回施すことにより、群の全ての元を生成できる群である。
有限生成アーベル群は有限生成有限アーベル群と有限生成無限アーベル群の2種類に分けられる。
例えば、加法として2つの整数を加算と定義した群、つまり整数全体は元1とその逆元-1の加算を繰り返すことによって、
全ての元を作り出すことができる。したがって有限生成(無限)アーベル群である。

正確な定義についてはこちら
有限生成アーベル群 - Wikipedia

Nagell-Lutzの定理

Nagell-Lutzの定理

y^{2}=x^{3} + a x^{2} + b x + c を整数係数a,b,cを持つ非特異3次曲線とする。
P=(x,y)を有限位数の有理点とする時 x,yは整数である。

これは、整数ではない有理点が存在するときは、無限位数となるということも同時に示している。

例えば、y^{2} = x^{3} + 2 (a=0, b=0, c=2)の場合を考えると、
 P = (-1, 1) は有理点だが、この曲線の2倍公式(c=2)

 x1 = \frac { x^{4} - 8cx } {4 x^{3} + 4c}

 y1 = \sqrt {x1^{3} + c}
を使って求めた2P,4Pは
2P: ( \frac {17} {4}, \frac {71} {8} )
4P: ( \frac {66113} {80656}, \frac {36583777} {22906304})
のようになる。
(本当は3Pを計算したかったが複雑になるので代わりに4Pを計算した)
この点をいくら加算していっても、有限回で無限遠点に到達することはなく、これらは有限位数の有利点ではない。
ちなみにこの楕円関数の有限位数の点は無限遠点しかない。

この2倍公式の計算はpythonを用いた。 (実はこの記事の主題はこれである。)

from math import *
from fractions import Fraction
from sys import *

def twice(x, y):
    x2 = (x*x*x*x-16*x)/(4*x*x*x+8)
    y2 = sqrt_frac(x2*x2*x2+2)
    return x2, y2

def sqrt_frac(x):
    n = x.numerator
    d = x.denominator
    r_n = 0
    r_d = 1
    found = False 
    for i in range(100000000):
        if i*i == n:
            r_n = i
            found = True
            break
        if i*i > n:
            break
    if not found:
        sys.exit()

    found = False
    for i in range(100000000):
        if i*i == d:
            r_d = i
            found = True
            break
        if i*i > d:
            break
    if not found:
        sys.exit()

    return Fraction(r_n, r_d)

r1x, r1y = twice(Fraction(-1), Fraction(1)) 
print(r1x, r1y)
r2x, r2y = twice(r1x, r1y)
print(r2x, r2y)
r3x, r3y = twice(r2x, r2y)
print(r3x, r3y)

有理数の計算にはFractionを用いた。
整数のsqrtを計算方法が分からなかったので、自前で関数を作った。
このプログラムでは、8P=(r3x, r3y)を求めるには精度が足りずにクラッシュする。

参考:http://www.u.dendai.ac.jp/~ochi/algeoB_05.pdf

それにしても、fractionをフル精度でsqrtしてくれるライブラリってないのかな。