C++でn番目のエルミート数を求める方法
この記事では、整数 N が与えられたときに、n番目のエルミート数(Hermite Number) を求めるプログラムをC++で作成する方法を解説します。
エルミート数とは
エルミート数とは、引数が0の場合におけるエルミート多項式の値のことです。
n番目のエルミート数は、以下の漸化式で定義されます。
HN = (-2) × (N − 1) × H(N−2)
初期値は H₀ = 1、H₁ = 0 です。
エルミート数列は次のように続きます。
1, 0, -2, 0, 12, 0, -120, 0, 1680, 0 …
入出力例
入力:
N = 7
出力:
0
入力:
N = 6
出力:
-120
奇数番目のエルミート数はすべて 0 になり、偶数番目のみが値を持つことが例からも分かります。
解法1:再帰を使ったシンプルなアプローチ
最もシンプルな解決策は、エルミート数の漸化式をそのまま再帰関数として実装する方法です。これにより、N番目の項を直接求めることができます。
実装例
#include <iostream>
using namespace std;
int calcNHermiteNumber(int N) {
if (N == 0)
return 1;
if (N % 2 == 1)
return 0;
else
return -2 * (N - 1) * calcNHermiteNumber(N - 2);
}
int main() {
int N = 10;
cout << "The " << N << "th hermite Number is " << calcNHermiteNumber(N);
return 0;
}
出力
The 10th hermite Number is -30240
解法2:効率的なアプローチ
より効率的に解くには、漸化式から導かれる一般公式を使用します。
- N が奇数の場合、エルミート数は必ず 0 になります。
- N が偶数の場合、次の公式によって値が定義されます。
HN = ((-1)^(N/2)) × (2^(N/2)) × (N−1)!!
ここで (N−1)!! は半階乗(semi-factorial)と呼ばれ、(n−1) × (n−3) × … × 3 × 1 のように計算されます。
実装例
#include <iostream>
#include <math.h>
using namespace std;
int calcSemiFact(int n) {
int factVal = 1;
for (int i = 1; i <= n; i = i + 2) {
factVal *= i;
}
return factVal;
}
int calcNHermiteNumber(int n) {
if (n % 2 == 1)
return 0;
int HermiteNumber = (pow(2, n / 2)) * calcSemiFact(n - 1);
if ((n / 2) % 2 == 1)
HermiteNumber *= -1;
return HermiteNumber;
}
int main() {
int N = 10;
cout << "The " << N << "th hermite Number is " << calcNHermiteNumber(N);
return 0;
}
出力
The 10th hermite Number is -30240
このように、再帰による実装は直感的で分かりやすい一方、一般公式を用いた実装はループ処理のみで計算できるため、大きなNに対しても安定して動作するという利点があります。
-
C++で有理数の最小公倍数(LCM)を求める方法
本記事では、有理数(分数)の最小公倍数(LCM)を求める方法を解説します。例えば、{2/7, 3/14, 5/3} という有理数のリストが与えられた場合、そのLCMは 30/1 となります。 有理数のLCMを求める公式 この問題を解くには、まずすべての分子のLCM(最小公倍数)を計算し、次にすべての分母のGCD(最大公約数)を計算します。有理数のLCMは、次の式で表されます。 $$LCM = \frac{すべての分子のLCM}{すべての分母のGCD}$$ 各分数の倍数となる有理数は、分子がすべての分子の公倍数であり、かつ分母がすべての分母の公約数である必要があります。その中で最小のものが「分子
-
C++のCHAR_BITとは?意味と使い方を解説
CHAR_BITは、char型が持つビット数を表すマクロです。C++では「limits.h」ヘッダーファイル(C++では<climits>)で宣言されており、一般的な環境では1バイトが8ビットであることを示します。このマクロを利用することで、移植性の高いコードを書くことができます。環境に依存せずにchar型のビット数を取得できるため、ビット演算やデータサイズの計算に役立ちます。CHAR_BITの使用例以下は、C++でCHAR_BITを使用したサンプルコードです。CHAR_BITとsizeofを組み合わせてint型の全ビット数を求め、整数値を2進数形式で出力しています。#includ