|
204 | 204 |
|
205 | 205 | <p class="text-right"><small>
|
206 | 206 | 最終更新日時(UTC):
|
207 |
| - <span itemprop="datePublished" content="2024-06-11T13:45:38"> |
208 |
| - 2024年06月11日 13時45分38秒 |
| 207 | + <span itemprop="datePublished" content="2025-02-09T06:38:35"> |
| 208 | + 2025年02月09日 06時38分35秒 |
209 | 209 | </span>
|
210 | 210 | <br/>
|
211 | 211 | <span itemprop="author" itemscope itemtype="http://schema.org/Person">
|
212 |
| - <span itemprop="name">Akira Takahashi</span> |
| 212 | + <span itemprop="name">Koichi Murase</span> |
213 | 213 | </span>
|
214 | 214 | が更新
|
215 | 215 | </small></p>
|
@@ -280,6 +280,26 @@ <h2>備考</h2>
|
280 | 280 | <li><code>l >= 128</code> の場合、この関数の呼び出しの効果は<a class="cpprefjp-defined-word" data-desc="処理系定義の動作。処理系によって事前に定めた動作をする" href="../../implementation-compliance.html#dfn-implementation-defined-behavior">実装定義</a>である</li>
|
281 | 281 | <li>(1) : C++23では、<a class="cpprefjp-defined-word" data-desc="<stdfloat>で定義される内部表現の規定された浮動小数点数型" href="../stdfloat.html">拡張浮動小数点数型</a>を含む浮動小数点数型への<a class="cpprefjp-defined-word" data-desc="同名の関数を異なる引数・テンプレート・制約などで複数定義すること。または同名の関数の集合">オーバーロード</a>として定義された</li>
|
282 | 282 | </ul>
|
| 283 | +<h3>負の m の対応</h3> |
| 284 | +<p>この標準関数は $m$ が正の場合にしか対応していない。 |
| 285 | +一方でルジャンドル陪関数はロドリゲスの公式を用いて負の $m$ に対して自然に拡張され、 |
| 286 | +このことは球面調和関数を定義する上でも使われる。 |
| 287 | +負の $m$ に対してもルジャンドル陪関数を計算する必要がある場合は、関係式 |
| 288 | +$$ P_l^{-m}(x) = (-1)^m \frac{(l-m)!}{(l+m)!} P_l^m(x) $$ |
| 289 | +を用いる必要がある。</p> |
| 290 | +<p><div class="codehilite"><pre><span></span><code><span class="cp">#include</span> <span class="cpf"><a href="../cmath.html"><cmath></a></span><span class="cp"></span> |
| 291 | + |
| 292 | +<span class="c1">// 負の m にも対応した実装例</span> |
| 293 | +<span class="kt">double</span> <span class="nf">assoc_legendre</span><span class="p">(</span><span class="kt">unsigned</span> <span class="n">l</span><span class="p">,</span> <span class="kt">int</span> <span class="n">m</span><span class="p">,</span> <span class="kt">double</span> <span class="n">x</span><span class="p">)</span> <span class="p">{</span> |
| 294 | + <span class="k">if</span> <span class="p">(</span><span class="n">m</span> <span class="o">>=</span> <span class="mi">0</span><span class="p">)</span> |
| 295 | + <span class="k">return</span> <span class="n"><span style="color:#ff0000">std::assoc_legendre</span></span><span class="p">(</span><span class="n">l</span><span class="p">,</span> <span class="p">(</span><span class="kt">unsigned</span><span class="p">)</span> <span class="n">m</span><span class="p">,</span> <span class="n">x</span><span class="p">);</span> |
| 296 | + <span class="k">else</span> |
| 297 | + <span class="k">return</span> <span class="n">std</span><span class="o">::</span><span class="n">pow</span><span class="p">(</span><span class="o">-</span><span class="mf">1.0</span><span class="p">,</span> <span class="n">m</span><span class="p">)</span> <span class="o">*</span> <span class="p">(</span><span class="n"><a href="tgamma.html">std::tgamma</a></span><span class="p">(</span><span class="mf">1.0</span> <span class="o">+</span> <span class="n">l</span> <span class="o">+</span> <span class="n">m</span><span class="p">)</span> <span class="o">/</span> <span class="n"><a href="tgamma.html">std::tgamma</a></span><span class="p">(</span><span class="mf">1.0</span> <span class="o">+</span> <span class="n">l</span> <span class="o">-</span> <span class="n">m</span><span class="p">))</span> <span class="o">*</span> <span class="n"><span style="color:#ff0000">std::assoc_legendre</span></span><span class="p">(</span><span class="n">l</span><span class="p">,</span> <span class="p">(</span><span class="kt">unsigned</span><span class="p">)</span> <span class="o">-</span><span class="n">m</span><span class="p">,</span> <span class="n">x</span><span class="p">);</span> |
| 298 | +<span class="p">}</span> |
| 299 | +</code></pre></div> |
| 300 | +</p> |
| 301 | +<p>上記の例では簡単のために階乗をガンマ関数 $n! = \Gamma(n + 1)$ (<code><a href="tgamma.html">tgamma</a></code>) で計算しているが、 |
| 302 | +計算効率やオーバーフローなどを考えると、直接 $(l + |m|)\cdots(l - |m| + 1)$ で割り算したり、係数を事前計算しておくなど工夫すると良い。</p> |
283 | 303 | <h2>例</h2>
|
284 | 304 | <p><div class="yata" id="4bde9e4a053a47145ca32e2a37f10cc67fdbb210"><div class="codehilite"><pre><span></span><code><span class="cp">#include</span> <span class="cpf"><a href="../cmath.html"><cmath></a></span><span class="cp"></span>
|
285 | 305 | <span class="cp">#include</span> <span class="cpf"><a href="../iostream.html"><iostream></a></span><span class="cp"></span>
|
|
0 commit comments