• Class / Function / Type

      std::
    • Header file

      <>
    • Other / All

    最終更新日時(UTC):
    が更新

    履歴 編集

    function
    <cmath>

    std::legendre

    namespace std {
      double
        legendre(unsigned int n,
                 double x);              // (1) C++17
      floating-point-type
        legendre(unsigned int n,
                 floating-point-type x); // (1) C++23
    
      Promoted
        legendre(unsigned int n,
                 Arithmetic x);          // (2) C++17
    
      float
        legendref(unsigned int n,
                  float x);              // (3) C++17
    
      long double
        legendrel(unsigned int n,
                  long double x);        // (4) C++17
    }
    

    概要

    ルジャンドル多項式 (Legendre polynomials) を求める。

    戻り値

    引数 l, x のルジャンドル多項式 Pl(x)=12ll!dldxl(x21)lfor |x|1 を返す。

    備考

    #include <cmath>
    #include <iostream>
    
    void p(unsigned n) {
      for (double x : {-1., 0., 1.})
        std::cout << "legendre(" << n << ", " << x << ") = " << std::legendre(n, x) << "\n";
      std::cout << "\n";
    }
    
    int main() {
      p(0); // P0(x) = 1
      p(1); // P1(x) = x
      p(2); // P2(x) = (3x^2 - 1) / 2
      p(3); // P3(x) = (5x^3 - 3x) / 2
    }
    

    出力例

    legendre(0, -1) = 1
    legendre(0, 0) = 1
    legendre(0, 1) = 1
    
    legendre(1, -1) = -1
    legendre(1, 0) = 0
    legendre(1, 1) = 1
    
    legendre(2, -1) = 1
    legendre(2, 0) = -0.5
    legendre(2, 1) = 1
    
    legendre(3, -1) = -1
    legendre(3, 0) = 0
    legendre(3, 1) = 1
    
    

    バージョン

    言語

    • C++17

    処理系

    備考

    • GCC 7, 8 には x として [-1.0, 1.0] の範囲外の値を渡した時に、std::domain_error を投げるバグがあった (GCC 7.5, 8.2, 8.4 )。 GCC 9 以降では直っている (GCC 9.3, 10.5, 11.4, 12.3, 13.2, 15.0 )。

    実装例

    閉形式

    Pl(x)=12ll!j=0l/2(1)jl!(2l2j)!j!(lj)!(l2j)!xl2j

    漸化式

    Pl(x)=(2l1)xPl1(x)(l1)Pl2(x)l;P0(x)=1,P1(x)=x

    関連項目

    参照