C++で数値が2つの素数の和として表現できるかを判定する方法
はじめに
この記事では、入力された数値が2つの素数の和として表現できるかどうかを判定するC++プログラムを紹介します。このテーマは、有名な「ゴールドバッハ予想」(4以上のすべての偶数は2つの素数の和で表せるという未解決問題)にも関連しており、素数判定の基礎を学ぶのに最適な題材です。
サンプルコード
#include <iostream>
using namespace std;
int func(int num) {
int i;
int flag = 1;
for(i = 2; i <= num/2; ++i) {
if(num % i == 0) {
flag = 0;
break;
}
}
return flag;
}
int main() {
int num , i;
cout << "Enter a number : \n";
cin >> num;
for(i = 2; i <= num/2; ++i) {
if (func(i)) {
if (func(num - i)) {
cout << num << " = " << i << " + " << num-i << endl;
}
}
}
return 0;
}
実行結果
Enter a number : 18
18 = 5 + 13
18 = 7 + 11
この実行例では、18が「5 + 13」と「7 + 11」という2組の素数の組み合わせで表現できたことがわかります。
コードの解説
まず、func()関数は、引数で受け取った数値が素数かどうかを判定する役割を担っています。2からnum/2までの整数で順番に割り算を行い、1つでも割り切れる数が見つかった場合は素数ではないと判断してflagを0にし、そこで処理を打ち切ります。
int func(int num) {
int i;
int flag = 1;
for(i = 2; i <= num/2; ++i) {
if(num % i == 0) {
flag = 0;
break;
}
}
return flag;
}次に、main()関数では、ユーザーから数値を入力として受け取ります。その後、2からnum/2までの各整数iについて、「i自身が素数」であり、かつ「num − i も素数」であるかをfunc()関数で確認します。両方の条件を満たす場合のみ、その組み合わせを画面に出力します。
cout << "Enter a number : \n";
cin >> num;
for(i = 2; i <= num/2; ++i) {
if (func(i)) {
if (func(num - i)) {
cout << num << " = " << i << " + " << num-i << endl;
}
}
}
ループ範囲をnum/2までに限定しているのは、それ以降の組み合わせは単に足す順序が入れ替わっただけの重複になるためです。この工夫によって、無駄のない効率的な探索が可能になります。なお、素数判定の計算量をさらに削減したい場合は、判定範囲を√numまでに狭める方法や、エラトステネスのふるいを活用する方法も検討するとよいでしょう。
-
C++で数値が2つの三角数の和として表現できるか判定する方法
本記事では、ある整数が2つの三角数の和として表現できるかどうかを判定する方法を、C++のコード例とともに分かりやすく解説します。三角数とは三角数とは、1、3、6、10、15…のように、1から順に自然数を加算して得られる数列のことです。点を正三角形の形に並べたときの個数に対応することから「三角数」と呼ばれています。n番目の三角数は次の式で求められます。n × (n + 1) / 2例えば、1、3、6、10などが三角数に該当します。これらを利用すると、16は「6 + 10」という2つの三角数の和として表現できます。判定アルゴリズム判定の手順は非常にシンプルです。N未満のすべての三角数を生成し、セッ
-
Pythonで素数を2つの素数の和として表現できるか判定する方法
素数 n が与えられたとき、それを2つの素数 x と y の和(n = x + y)として表現できるかどうかを判定する問題です。例えば、n = 19 の場合、19 = 17 + 2 と表現できるため、出力は True になります。アルゴリズムの考え方この問題には重要な数学的な性質があります。n が奇数の素数である場合、その和が奇数になる2つの素数の組み合わせでは、必ず片方が偶数になります。偶数の素数は 2 だけ なので、結局「n − 2 が素数かどうか」を確認すればよいことになります。解決の手順素数判定用の関数 isPrime() を定義しますnumber が 1 以下の場合は False を