Pebble Coding

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

SageMath のインストール方法と使い方

数学の研究に便利な SageMath のインストール方法と使い方です。
macOSの場合です。

以下のページのいずれかから以下のファイルをダウンロードします。

http://ftp.riken.jp/sagemath/osx/intel/index.html

http://ftp.yz.yamagata-u.ac.jp/pub/math/sage/osx/intel/index.html

sage-8.5-OSX_10.14.2-x86_64.tar.bz2

解凍したら、SageMath というフォルダが作成されるので、コマンドプロンプトから ./sage としてsageを起動します。

前回やった、 F_{43} ,  y^{2} = x^{3} + 7での有理点を表示してみましょう。

sage: E2 = EllipticCurve(GF(43), [0, 7])
sage: E2.points()
[(0 : 1 : 0), (2 : 12 : 1), (2 : 31 : 1), (7 : 7 : 1), (7 : 36 : 1), (12 : 12 : 1), (12 : 31 : 1), (13 : 21 : 1), (13 : 22 : 1), (20 : 3 : 1), (20 : 40 : 1), (21 : 18 : 1), (21 : 25 : 1), (25 : 18 : 1), (25 : 25 : 1), (29 : 12 : 1), (29 : 31 : 1), (32 : 3 : 1), (32 : 40 : 1), (34 : 3 : 1), (34 : 40 : 1), (35 : 21 : 1), (35 : 22 : 1), (37 : 7 : 1), (37 : 36 : 1), (38 : 21 : 1), (38 : 22 : 1), (40 : 18 : 1), (40 : 25 : 1), (42 : 7 : 1), (42 : 36 : 1)]
sage: E2.cardinality()
31
sage: plot(E2)

f:id:pebble8888:20190104151029p:plain

一瞬で出てきました。射影座標(projective coordinates)の(x, y, z)の形式のようです。
プロット画像まででてきましたよ。

secp256k1でも試してみましょう。

sage: E = EllipticCurve(GF(2 ** 256 - 2 ** 32 - 977), [0, 7])
sage: p = E.cardinality()
115792089237316195423570985008687907852837564279074904382605163141518161494337
sage: p.is_prime()
True
sage : plot(E)

すごい。一瞬です。
さすがにこちらはプロットしようとしたらエラーになりました。

DLPを解いてみましょう。
ここでQはベースポイントGを10000倍した点です。

sage: G = E([55066263022277343669578718895168534326250603453777594175500187360389116729240,32670510020758816978083085130507043184471273380659243275938904335757337482424])
sage: Q = E([55279067612272658004429375184716238028207484982037227804583126224321918234542,93139664895507357192565643142424306097487832058389223752321585898830257071353])
sage: G.discrete_log(Q)
10000  
sage: Q.discrete_log(G)

A.discrete_log(B) は点Aを何倍したらBになるかを求めてくれます。
10000程度なら一瞬で求めてくれるようです。
逆は終わるはずがなくmacのファンが回り始めたので途中でキャンセルです。

点の倍数は一瞬で求めてくれるので検算には使えますね。

sage: n = E.cardinality()
sage: n * G
(0 : 1 : 0)
sage: (n-1) * G
(55066263022277343669578718895168534326250603453777594175500187360389116729240 : 83121579216557378445487899878180864668798711284981320763518679672151497189239 : 1)