calx
C++23 総合数学ライブラリ
C++23 / LGPL v3 / 外部依存ゼロcalx は、多倍長演算 (Int, Float, Rational) を核に、 複素数・多項式・四元数・行列・テンソル・特殊関数・数値積分・FFT・Lie 群などを ひとつの統一的なフレームワークで提供する C++23 数学ライブラリである。
名前はラテン語 calculus (小石 = 計算の語源) に由来する。
多倍長演算
Int (整数)・Float (浮動小数点)・Rational (有理数) の 3 型。 BMI2/ADX 命令による高速 mpn 演算、5 段乗算アルゴリズム (Basecase → Karatsuba → Toom-3 → Toom-4 → NTT) を搭載。
NaN / Infinity 安全
Int・Float・Rational のすべてで NaN と Infinity が安全に伝播する。 ゼロ除算でクラッシュしない。
C++23 Concepts
Ring・Field・VectorSpace など 50 以上の代数的 concepts を定義。 型安全なジェネリックアルゴリズムを記述できる。
80+ 特殊関数
Bessel・Airy・Gamma・Zeta・楕円積分・超幾何関数など。
double・Complex<double>・Float (多倍長) で利用可能。
数値アルゴリズム
線形代数 (LU/QR/SVD)・数値積分・求根・最適化・ODE・補間・FFT。
Matrix<Float> のように多倍長型との組み合わせも可能。
Lie 群 / 代数
SO(2)・SE(2)・SO(3)・SE(3) の exp/log・ヤコビアン・随伴表現。 SLAM / ロボティクス向け、左摂動モデル (GTSAM 規約)。
API リファレンス
コア型 (コンパイル済みライブラリ)
コア型 (ヘッダーオンリー)
アルゴリズムモジュール (ヘッダーオンリー)
アルゴリズム解説
各クラスの内部で使用されるアルゴリズムの詳細。閾値、計算量、設計判断の根拠を扱う。
コード例
Int — 多倍長整数
#include <math/core/mp/Int.hpp>
#include <iostream>
using namespace calx;
int main() {
Int a("123456789012345678901234567890");
Int b("987654321098765432109876543210");
std::cout << "a + b = " << a + b << std::endl;
std::cout << "a * b = " << a * b << std::endl;
std::cout << "gcd = " << gcd(a, b) << std::endl;
// 素数判定 (Miller-Rabin)
Int p("170141183460469231731687303715884105727"); // 2^127 - 1
std::cout << p << " is prime: " << std::boolalpha
<< isProbablePrime(p) << std::endl;
// NaN/Infinity 安全伝播
Int zero;
Int nan = Int(1) / zero;
std::cout << "1/0 = " << nan << std::endl; // NaN
}
Float — 多倍長浮動小数点
#include <math/core/mp/Float.hpp>
#include <iostream>
using namespace calx;
int main() {
// 数学定数 (スレッドローカルキャッシュ、2 回目以降は即座に返る)
Float pi = Float::pi(1000); // π を 1000 桁で計算 (Chudnovsky)
Float e = Float::e(1000); // e を 1000 桁で計算
// 超越関数 (精度は引数から自動決定)
Float y = exp(pi); // e^π
Float z = log(y); // log(e^π) ≈ π
std::cout << "exp(pi) = " << y << std::endl;
std::cout << "log(exp(pi)) = " << z << std::endl;
// 三角関数
Float s = sin(pi / 6); // sin(π/6) = 0.5
std::cout << "sin(pi/6) = " << s << std::endl;
std::cout << "pi(1000 digits) = " << pi << std::endl;
}
ビルド
必要環境
- 64-bit OS (x86_64 / AArch64)
- C++23 対応コンパイラ (MSVC 17.x / Visual Studio 2022 で動作確認済み)
- CMake 3.20 以降
対応環境と性能特性
calx は 64-bit (x86_64 / AArch64) 環境が必須である。
内部の多倍長演算が 64-bit リムと 128-bit ワイド乗算 (_umul128 / __uint128_t) に依存するため、
32-bit 環境では動作しない。
以下のハードウェア機能が利用可能な場合、自動的に高速パスが有効になる。
| 高速パス | 有効条件 | フォールバック |
|---|---|---|
| AVX2 NTT バタフライ | AVX2 対応 CPU (Intel Haswell 以降 / AMD Zen 以降) | スカラー Montgomery NTT |
| MULX/ADCX/ADOX mpn プリミティブ |
BMI2 + ADX 対応 CPU、x64 Windows (MASM) | C++ ジェネリック実装 |
| NTT 並列化 | NTT 長 ≥ 4096 (自動判定) | シングルスレッド |
- Windows x64 + AVX2: すべての高速パスが有効。最高性能。
- Linux x64 + AVX2: AVX2 NTT は有効。MASM アセンブリは無効 (mpn プリミティブは C++ フォールバック)。
- ARM / Apple Silicon: AVX2・MASM ともに無効。全機能は動作するが、多倍長演算のスループットは低下する。
ソースコードの入手
calx-source-2026.03.13a.zip をダウンロード (約 380 KB) し、任意のフォルダに展開する。 ソースコード一覧からファイル単位で閲覧することもできる。
現在のリリースには Int (多倍長整数) と Float (多倍長浮動小数点) が含まれる。
ライブラリのビルド
cd calx
mkdir build
cd build
cmake .. -G "Visual Studio 17 2022" -A x64
cmake --build . --config Release
build/ ディレクトリに calx.sln と各ターゲットの .vcxproj が生成される。
サンプルの実行
ビルド後、コンソールからサンプルプログラムを実行できる:
examples\Release\example-int.exe
examples\Release\example-float.exe