Useful Math Tool - SageMath

» Hacking-Tips

개요

각종 수학과 관련된 기능이 포함된 툴이다.

툴 자체를 실행파일로 실행이 가능하며, 해당 툴에서 .sage 확장자의 파일들을 실행시킬 수 있다.

하지만, 파이썬 모듈로도 동일한 기능을 제공하기 때문에 편의 상 파이썬 모듈의 형태로 더욱 자주 사용한다.

How to install?

window, macOS, Linux 등등 많은 운영체제에서 지원하지만…

python 모듈의 형태로 사용할 것이라면.. window에 설치하는 것은 추천하지 않는다.

wsl 에 까는 것을 추천한다. 윈도우 문제들도 익스코드 자체는 리눅스에서 돌려도 무방하기에 wsl에만 깔아 놓고 잘 사용하고 있다.

sudo apt install sagemath

Ubuntu 기준으로는 위 명령어 하나면 모든 게 해결된다.

다만, 용량이 크기 때문에 상당 시간 소요된다. 다운로드 중에는 절전 모드로 진입하지 않도록 신경을 잘 써주자. 다운로드하며 절전 모드로 바뀐 적이 있는데.. 이것 때문에 VM 하나를 날려 먹은 슬픈 기억이 있다…

주요 기능

sagemath에는 훌륭한 기능들이 많지만… 행렬 관련 연산을 위해서 설치한 tool이다. reversing에서 역연산을 할 때 sagemath가 z3보다 훨씬 빠른 속도를 자랑하기 때문에, sagemath로 해결할 수 있는 경우에 sagemath를 이용하여 역연산 코드를 짜는 편이다.

다만, 범용성은 z3-solver가 더 좋은 듯 하다.

python에서 sage를 사용하기 위해서는 다음과 같이 import 해주면 된다.

# import문
from sage.all import *

Matrix 선언

# 이중 리스트를 Matrix class로 바꾸어 준다.
Mat = [[2, 3, 1, 1], [1, 2, 3, 1], [1, 1, 2, 3], [3, 1, 1, 2]]
Mat = Matrix(Mat)

# modular 상에서 선언도 가능하다.
Mat = [[2, 3, 1, 1], [1, 2, 3, 1], [1, 1, 2, 3], [3, 1, 1, 2]]
Mat = Matrix(Zmod(251), Mat)

Matrix element에 접근

# 아래 두 가지 표현으로 접근이 가능하다
Mat[i][j]
Mat[i, j]

행렬 관련 연산

# 기존에 사용하던 연산자를 그대로 사용해도 된다.

# 행렬곱 (행렬 * 행렬, 행렬 * 벡터 다 가능, scalar곱도 가능)
A * B

# 참고로 vector는 1차원 list로 선언 가능
a = [0x01, 0xA6, 0x46, 0x12]
a = vector(a)

역행렬

# inverse() 메소드를 이용하면 된다.
# type(A) -> matrix
inverse_A = A.inverse()

solve_right, solve_left

# solve_right
# A * B = C의 형태인데... A와 C를 알아서 B를 구하고 싶어??
B = A.solve_right(C)

# solve_left
# A * B = C의 형태인데... B와 C를 알고 A를 구하고 싶어??
A = B.solve_right(C)

주의 사항

Zmod() 이용해 모듈러 상에서 값을 선언했다고 하자...

type(Mat[3, 5]) == int ??
-> No...!!

# int class로 바꾸기 위해 아래의 작업 필요
tmp = Mat[3, 5]
tmp = int(tmp)

# int(tmp)와 동일하게 아래 옵션들도 존재
tmp = ZZ(tmp)
tmp = Integer(tmp)

#참고로 soon_haari는 위 3가지 중 ZZ()를 가장 선호한다고 한다..