calx

C++23 総合数学ライブラリ

C++23 / LGPL v3 / 外部依存ゼロ
多倍長演算 特殊関数 線形代数 FFT 数値積分 Lie 群

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・楕円積分・超幾何関数など。 doubleComplex<double>Float (多倍長) で利用可能。

数値アルゴリズム

線形代数 (LU/QR/SVD)・数値積分・求根・最適化・ODE・補間・FFT。 Matrix<Float> のように多倍長型との組み合わせも可能。

Lie 群 / 代数

SO(2)・SE(2)・SO(3)・SE(3) の exp/log・ヤコビアン・随伴表現。 SLAM / ロボティクス向け、左摂動モデル (GTSAM 規約)。

API リファレンス

コア型 (コンパイル済みライブラリ)

コア型 (ヘッダーオンリー)

Complex<T>
複素数
Polynomial<T>
多項式
Quaternion<T>
四元数
Matrix<T> / Vector<T>
行列・ベクトル
Tensor<T>
テンソル
SparseMatrix<T>
疎行列
ModularInt<P>
剰余演算

アルゴリズムモジュール (ヘッダーオンリー)

コード例

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
ライセンス: GNU Lesser General Public License v3.0 (LGPL-3.0)。 calx 自体の変更は LGPL で公開する必要があるが、 calx をリンクして使うアプリケーションはプロプライエタリでも構わない。