// Copyright (C) 2026 Kiyotsugu Arai
// SPDX-License-Identifier: LGPL-3.0-or-later

// RationalConstants.hpp
// 有理数定数: Bernoulli 数, Stirling 係数
//
// 移植元: lib++20 Bernoulli数.cpp, Stirling係数.cpp

#ifndef CALX_RATIONAL_CONSTANTS_HPP
#define CALX_RATIONAL_CONSTANTS_HPP

#include <math/core/mp/Rational/RationalBase.hpp>

namespace calx {

    /**
     * @brief Bernoulli 数 B(n) を計算
     *
     * 標準再帰式: B(n) = -1/(n+1) * Σ C(n+1,k) * B(k)。
     * B(0) = 1, B(1) = -1/2, B(odd > 1) = 0。
     * 計算済みの値は静的キャッシュに保存される (スレッドセーフ)。
     *
     * @param n Bernoulli 数の添字 (n >= 0)
     * @return B(n) を Rational で返す
     */
    [[nodiscard]] Rational bernoulli(int n);

    /**
     * @brief Stirling 係数 c[k] を計算
     *
     * Stirling 近似 n! ~ sqrt(2*pi*n) * (n/e)^n * (1 + c[1]/n + c[2]/n^2 + ...)
     * の係数。c[0] = 1。Bernoulli 数を用いた漸化式で計算。
     * 計算済みの値は静的キャッシュに保存される (スレッドセーフ)。
     *
     * 【出典】
     *   "Concerning Two Series for the Gamma Function" p618
     *   "A New Derivation of Stirling's Approximation to n!" p828
     *
     * @param k 係数の添字 (k >= 0)
     * @return c[k] を Rational で返す
     */
    [[nodiscard]] Rational stirlingCoefficient(int k);

} // namespace calx

#endif // CALX_RATIONAL_CONSTANTS_HPP
