はじめに
Python で数値計算といえば NumPy や SciPy が定番ですが、
「数式そのもの」を扱いたい場面では、彼らは少し不器用です。
そこで登場するのが SymPy(シンパイ)。
SymPy は 純粋 Python 製の象徴計算(Symbolic Computation)ライブラリで、
✔ 数式を文字のまま扱い
✔ 厳密解を返し
✔ 数学的な推論や検証を可能にする
という、理論派エンジニア・研究者・セキュリティ屋に刺さる存在です。
1. SymPyとは何か?
SymPy = Symbolic Python
- 数値ではなく 記号(シンボル) を計算対象にする
- 展開・因数分解・微積分・方程式・数論まで網羅
- 外部依存なし(Pure Python)
一言で言うと:
「Pythonで数式をそのまま操作できる数学エンジン」
2. NumPyとの決定的な違い
| 観点 | SymPy | NumPy |
|---|---|---|
| 計算対象 | 数式・記号 | 数値(浮動小数点) |
| 結果 | 厳密解 | 近似値 |
| 用途 | 理論・検証・証明 | 高速数値計算 |
| 速度 | 遅め | 非常に速い |
- 数学の意味を保ちたいなら SymPy
- 性能を出したいなら NumPy
両者は競合ではなく、完全に役割分担です。
3. 最小構成で始める SymPy
インストール
pip install sympy
シンボルを定義する
from sympy import symbols
x, y = symbols('x y')
この x は数値ではありません。
「x という数学記号」そのものです。
4. 代数計算(展開・因数分解)
from sympy import expand, factor
expr = (x + 1)**2
expand(expr)
# x**2 + 2*x + 1
factor(x**2 + 2*x + 1)
# (x + 1)**2
手計算レベルの操作を、そのままコードに。
5. 微分・積分・極限
微分
from sympy import diff
diff(x**3 + 2*x, x)
# 3*x**2 + 2
積分
from sympy import integrate
integrate(x**2, x)
# x**3/3
極限
from sympy import limit
limit(1/x, x, 0)
# oo(無限大)
- 数値誤差ゼロ
- 証明・検証用途で安心
6. 方程式を「解く」
from sympy import solve
solve(x**2 - 4, x)
# [-2, 2]
連立方程式もOK:
solve([x + y - 3, x - y - 1], [x, y])
# {x: 2, y: 1}
7. 数論機能(セキュリティ分野で重要)
素因数分解
from sympy.ntheory import factorint
factorint(988027)
# {941: 1, 1051: 1}
戻り値は
{素因数: 指数} の辞書。
- RSA や暗号強度の検証
- CTF / 教育用途
- 計算可能性の実験
などでよく使われます。
8. どんな人に向いている?
- ✔ 数学・アルゴリズムを深く理解したい
- ✔ 暗号・セキュリティの理論検証をしたい
- ✔ 数式をブログ・論文・教材に落としたい
- ✔ 「なぜそうなるか」をコードで示したい
逆に、
- とにかく速く大量計算したい
→ NumPy / SciPy を使いましょう。
おわりに
SymPy は派手ではありません。
でも一度ハマると、
「数式をコードに写す」
「理論をそのまま実装する」
という体験がやめられなくなります。
数学とプログラミングの境界を、
一番エレガントに溶かすライブラリ――それが SymPy です。