数学の研究に便利な 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を起動します。
前回やった、 , での有理点を表示してみましょう。
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)
一瞬で出てきました。射影座標(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)