SageMath를 설치하고 python과 함께 사용하는 방법을 정리한다.

SageMath

SageMath는 오픈소스 수학 소프트웨어로, python과 함께 사용하여 복잡한 수학 계산을 도와준다.

이 글은 macOS를 기준으로 작성하였다.

Install

brew install sage

Homebrew를 이용하여 설치할 수 있다.

How to use python modules in sage

sage --pip install --user pycryptodome==3.20.0
sage --pip install --user pwntools==4.12.0

위와 같은 명령어로 sage에 pip 모듈을 설치하고 import하여 사용할 수 있다.

How to use sage in python

sage --python

위 명령어를 이용해서 python을 실행하면 import sage로 sage를 python에서 사용할 수 있다.

# example.sage

p = 0xDB7C2ABF62E35E668076BEAD208B
Fp = GF(p)
a = 0xDB7C2ABF62E35E668076BEAD2088
b = 0x659EF8BA043916EEDE8911702B22
Gx = 0x09487239995a5ee76b55f9c2f098
Qx = 0x5a3a2f05fd136c4a58331a648c72
R.<u> = PolynomialRing(Fp)
eq = (((3 * Gx^2 + a * u^4)^2 / (4 * (Gx^3 + a * u^4 * Gx + b * u^6))) - 2 * Gx - Qx).numerator()
roots = eq.roots()
print(roots)
u = roots[0][0]
aa = hex((a * u^4) % p)
bb = hex((b * u^6) % p)
print(aa, bb)
#example.sage.py

# This file was *autogenerated* from the file example.sage
from sage.all_cmdline import *   # import sage library

_sage_const_0xDB7C2ABF62E35E668076BEAD208B = Integer(0xDB7C2ABF62E35E668076BEAD208B); _sage_const_0xDB7C2ABF62E35E668076BEAD2088 = Integer(0xDB7C2ABF62E35E668076BEAD2088); _sage_const_0x659EF8BA043916EEDE8911702B22 = Integer(0x659EF8BA043916EEDE8911702B22); _sage_const_0x09487239995a5ee76b55f9c2f098 = Integer(0x09487239995a5ee76b55f9c2f098); _sage_const_0x5a3a2f05fd136c4a58331a648c72 = Integer(0x5a3a2f05fd136c4a58331a648c72); _sage_const_3 = Integer(3); _sage_const_2 = Integer(2); _sage_const_4 = Integer(4); _sage_const_6 = Integer(6); _sage_const_0 = Integer(0)
p = _sage_const_0xDB7C2ABF62E35E668076BEAD208B
Fp = GF(p)
a = _sage_const_0xDB7C2ABF62E35E668076BEAD2088
b = _sage_const_0x659EF8BA043916EEDE8911702B22
Gx = _sage_const_0x09487239995a5ee76b55f9c2f098
Qx = _sage_const_0x5a3a2f05fd136c4a58331a648c72
R = PolynomialRing(Fp, names=('u',)); (u,) = R._first_ngens(1)
eq = (((_sage_const_3  * Gx**_sage_const_2  + a * u**_sage_const_4 )**_sage_const_2  / (_sage_const_4  * (Gx**_sage_const_3  + a * u**_sage_const_4  * Gx + b * u**_sage_const_6 ))) - _sage_const_2  * Gx - Qx).numerator()
roots = eq.roots()
print(roots)
u = roots[_sage_const_0 ][_sage_const_0 ]
aa = hex((a * u**_sage_const_4 ) % p)
bb = hex((b * u**_sage_const_6 ) % p)
print(aa, bb)

.sage 파일은 sage 코드를 작성할 수 있고 sage example.sage로 실행할 수 있다. 해당 명령으로 sage 파일을 실행하면 example.sage.py 파일이 같은 디렉토리에 생성된다.

Tips

Neovim에서 .sage 파일을 편집할 때 기본적으로 syntax highlighting이 적용되지 않는다. 이 때 :set filetype=python과 같은 방법으로 파일을 python으로 인식하도록 하면 python의 syntax highlighting이 적용된다.