C++で実装するニューマン・シャンクス・ウィリアムズ素数の求め方
ニューマン・シャンクス・ウィリアムズ素数(NSW素数)は、数学者ニューマン、シャンクス、ウィリアムズによって研究された特別な数列に現れる素数の系列です。この数列は以下のように始まります。
1, 1, 3, 7, 17, 41...
このうち素数となる項が「NSW素数」と呼ばれます(例:7, 41, 239 など)。数列の各項を一般化すると、次の漸化式で定義することができます。
a0 = 1
a1 = 1
an = 2 × a(n-1) + a(n-2)
アルゴリズム
- 求めたい項の番号 n を初期化します。
- 数列の最初の2項として「1」と「1」を設定します。
- n の項に達するまでループ処理を行います。
- 直前の2項を使って次の項を計算します。
- 直前の2項の値を新しい値で更新します。
- 最終的に得られた項を返します。
C++での実装例
以下は、上記のアルゴリズムをC++で実装したコードです。
#include <bits/stdc++.h>
using namespace std;
int getNthTerm(int n) {
if(n == 0 || n == 1) {
return 1;
}
int a = 1, b = 1;
for(int i = 3; i <= n; ++i) {
int c = 2 * b + a;
a = b;
b = c;
}
return b;
}
int main() {
int n = 5;
cout << getNthTerm(n) << endl;
return 0;
}
実行結果
上記のコードを実行すると、次の出力が得られます。
17
-
C++でn番目の平衡素数(バランス素数)を求める方法
平衡素数とは 平衡素数(Balanced Prime)とは、直前の素数と直後の素数までの距離(差)が等しい素数のことです。言い換えれば、前後にある最も近い素数の平均値に一致する素数を指します。 ある素数が平衡素数であるためには、次の式を満たす必要があります。 Pn = (Pn-1 + Pn+1) / 2 ここで、nは順序付けられた素数列におけるPnのインデックス(順位)を表します。 素数の順序付き集合:2, 3, 5, 7, 11, 13, … 最初のいくつかの平衡素数は、5, 53, 157, 173, … です。 問題の概要 この問題では、数値nが与えられ、n番目の平衡素数を求めることが
-
C++で数値が完全素数(フルプライム)かどうかを判定する方法
完全素数(フルプライム)とは?本記事では、ある数値が「完全素数(フルプライム)」であるかどうかを判定する方法を解説します。完全素数とは、その数値自体が素数であり、かつ各桁の数字もすべて素数である数のことです。例えば、37は2桁とも素数の数字(3と7)で構成され、数値全体も素数であるため、完全素数です。一方、97は数値自体は素数ですが、各桁に9という素数でない数字が含まれているため、完全素数ではありません。判定のアプローチ効率的な判定方法は以下の2段階で行います。まず、素数でない桁が含まれていないかを確認します。各桁の数字は0から9の範囲に収まるため、この範囲で素数となるのは2、3、5、7の4つ