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)・求根・補間・FFT。 Matrix<Float> のように多倍長型との組み合わせも可能。

Lie 群 / 代数

SO(2)・SE(2)・SO(3)・SE(3) の exp/log・ヤコビアン・随伴表現。 左摂動モデル (GTSAM 規約)。

コード例

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() {
    int prec = 50;  // 50 桁精度
    Float::setDefaultPrecision(prec);

    // 数学定数 (スレッドローカルキャッシュ、2 回目以降は即座に返る)
    Float pi = Float::pi(prec);    // π を 50 桁で計算 (Chudnovsky)

    // 超越関数
    Float y = exp(pi, prec);       // e^π
    Float z = log(y, prec);        // log(e^π) = π

    std::cout << "exp(pi) = " << y.toDecimalString(prec) << std::endl;
    std::cout << "log(exp(pi)) = " << z.toDecimalString(prec) << std::endl;

    // 三角関数
    Float s = sin(pi / Float(6, prec), prec);  // sin(π/6) = 0.5
    std::cout << "sin(pi/6) = " << s.toDecimalString(20) << std::endl;
}

Rational — 有理数

#include <math/core/mp/Rational.hpp>
#include <iostream>
using namespace calx;

int main() {
    Rational a(1, 3);   // 1/3
    Rational b(1, 6);   // 1/6

    Rational sum = a + b;
    std::cout << "1/3 + 1/6 = " << sum << std::endl;  // 1/2 (自動約分)

    Rational product = a * b;
    std::cout << "1/3 * 1/6 = " << product << std::endl;  // 1/18

    // 多倍長整数との組み合わせ
    Rational big(Int("1000000000000000000"), Int("3"));
    std::cout << big << std::endl;
}

Vector — 数値ベクトル

#include <math/core/vector.hpp>
#include <iostream>
using namespace calx;

int main() {
    Vector<double> a{1.0, 2.0, 3.0};
    Vector<double> b{4.0, 5.0, 6.0};

    // 式テンプレート: 中間オブジェクトなしで評価
    Vector<double> c = 2.0 * a + b;
    std::cout << "dot(a, b) = " << dot(a, b) << std::endl;  // 32
    std::cout << "norm(a)   = " << norm(a) << std::endl;     // 3.74166

    // 3D 外積 (StaticVector)
    StaticVector<double, 3> i{1, 0, 0}, j{0, 1, 0};
    auto k = cross(i, j);  // [0, 0, 1]
}

Matrix — 行列

#include <math/core/matrix.hpp>
#include <math/core/mp/Rational.hpp>
#include <math/linalg/decomposition.hpp>
#include <iostream>
using namespace calx;
using namespace calx::algorithms;

int main() {
    // 行列演算
    Matrix<double> A({{2, 1, -1}, {-3, -1, 2}, {-2, 1, 2}});
    Vector<double> b({8, -11, -3});
    auto x = lu_solve(A, b);        // x = {2, 3, -1}

    // operator^: 転置, 逆行列, 冪乗
    auto At   = A ^ 'T';     // 転置
    auto Ainv = A ^ (-1);    // 逆行列
    auto A3   = A ^ 3;       // A*A*A

    // Rational で厳密な逆行列
    Matrix<Rational> H(3, 3);
    for (int i = 0; i < 3; i++)
        for (int j = 0; j < 3; j++)
            H(i, j) = Rational(1, i + j + 1);  // Hilbert 行列
    auto Hinv = lu_inverse(H);               // 全要素が整数 (厳密)
    auto I = H * Hinv;                       // 厳密に単位行列
}

LinAlg — 線形代数

#include <math/core/matrix.hpp>
#include <math/linalg/decomposition.hpp>
#include <math/linalg/eigenvalues.hpp>
#include <iostream>
using namespace calx;
using namespace calx::algorithms;

int main() {
    Matrix<double> A({{4, 1, 1}, {1, 3, 0}, {1, 0, 2}});

    // SVD 分解
    auto [U, sigma, Vt] = svd_decomposition(A);

    // 対称固有値
    auto [evals, evecs] = eigen_symmetric(A);

    // ガウス消去法 (ピボット戦略選択)
    Vector<double> b({6, 4, 3});
    auto x = gaussian_elimination(A, b, PivotStrategy::Full);

    // Bareiss: 整数行列の行列式 (除算なし)
    Matrix<int> M({{1, 2, 3}, {4, 5, 6}, {7, 8, 10}});
    auto det = bareiss_determinant(M);  // -3
}

ビルド

必要環境

  • 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 ともに無効。全機能は動作するが、多倍長演算のスループットは低下する。

ダウンロード

現在のリリースには Int (多倍長整数)・Float (多倍長浮動小数点)・Rational (有理数)・Vector (数値ベクトル) が含まれる。

プリビルド版 (推奨)

ヘッダファイルとビルド済み DLL のセット。ビルド不要ですぐに使える。

calx-dll-2026.04.10a.zip をダウンロード (DLL版)

動作確認 — 以下の最小プログラム myapp.cpp で DLL が正しくリンクできることを確認する:

// myapp.cpp
#include <math/core/mp/Int.hpp>
#include <iostream>
using namespace calx;

int main() {
    Int a = Int::factorial(100);
    std::cout << "100! = " << a << std::endl;
}

zip を展開後、コマンドプロンプトでコンパイル・実行する:

REM 1. コンパイル (C:\path\to\calx は展開先に読み替え)
cl /std:c++23 /EHsc /utf-8 /I C:\path\to\calx\include myapp.cpp C:\path\to\calx\lib\calx_core.lib

REM 2. DLL を exe と同じフォルダにコピーして実行
copy C:\path\to\calx\lib\calx_core.dll .
myapp.exe

付属サンプルのビルドと実行 (DLL版)

zip にはサンプルプログラムのソースコードと CMakeLists.txt が付属している。まとめてビルドするには:

cd calx
mkdir build
cd build
cmake .. -G "Visual Studio 17 2022" -A x64
cmake --build . --config Release

ビルド後、コンソールからサンプルプログラムを実行できる:

Release\example_int.exe
Release\example_float.exe
Release\example_rational.exe
Release\example_vector.exe
Release\example_matrix.exe
Release\example_linalg.exe
Release\example_precision_showdown.exe
Release\example_mp.exe
Release\example_int_demo.exe
Release\example_float_demo.exe
Release\example_rational_demo.exe
Release\example_vector_demo.exe
Release\example_matrix_demo.exe

ウイルス対策ソフトによる誤検知について (DLL版)

calx_core.dll がウイルス対策ソフト (McAfee, Windows Defender, Norton 等) により誤検知・隔離される場合がある。 DLL には冪剰余 (Montgomery 乗算) や MASM アセンブリカーネルが常に含まれるため、 powMod 等の暗号演算を使用しなくても検知される可能性がある。

zip の展開時点で DLL が隔離されることがあり、隔離は無言で行われ時間差で報告されるため、 DLL が存在しないように見えることがある。

誤検知された場合は calx_core.dll をウイルス対策ソフトの除外リストに追加すること。 この問題は calx のサンプルプログラムだけでなく、 calx をリンクして作成したユーザー自身のアプリケーションでも発生しうる。

GMP や OpenSSL など他の暗号・多倍長演算ライブラリでも同様の問題が発生する。

ソースコード版

自分でビルドしたい場合はソースコードをダウンロードする。

calx-source-2026.04.10a.zip をダウンロード (ソース版)

ソースコード一覧からファイル単位で閲覧することもできる。

ソースからのビルド (ソース版のみ)

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
examples\Release\example-rational.exe
examples\Release\example-vector.exe
examples\Release\example-matrix.exe
examples\Release\example-linalg.exe
examples\Release\example-precision-showdown.exe
examples\Release\example-mp.exe
examples\Release\example-int-demo.exe
examples\Release\example-float-demo.exe
examples\Release\example-rational-demo.exe
examples\Release\example-vector-demo.exe
examples\Release\example-matrix-demo.exe

ウイルス対策ソフトによる誤検知について (ソース版)

ソースからビルドした実行ファイルが、ウイルス対策ソフトにより誤検知・隔離される場合があるcalx_int.lib には冪剰余 (Montgomery 乗算) と MASM アセンブリカーネルが含まれるため、 ビルドした exe にこれらのコードが静的リンクされる。

powMod 等の暗号演算を使用しないプログラムでも、 リンカの未使用コード除去 (/OPT:REF) が適用されない場合は検知される可能性がある。 Release ビルドでは通常除去されるため検知されにくいが、Debug ビルドでは検知されやすい。

隔離は無言で行われ時間差で報告されるため、ビルドに失敗して exe が生成されなかったように見えることがある。 誤検知された場合はビルドディレクトリをウイルス対策ソフトの除外リストに追加すること。

GMP や OpenSSL など他の暗号・多倍長演算ライブラリでも同様の問題が発生する。

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

リリース履歴

2026-04-10Concepts 公開
2026-04-03Matrix · LinAlg 公開
2026-03-27Vector 公開
2026-03-23プリビルド DLL 版の配布開始
2026-03-20Rational 公開
2026-03-13Float 公開
2026-03-02Int 公開 (初回リリース)