プログラミング
 Computer >> コンピューター >  >> プログラミング >> プログラミング

任意の偶数を2つの素数の和で表現するアルゴリズムの解説

偶数と素数の和の関係

4以上のすべての偶数は、2つの素数の和として表すことができます。これは有名な「ゴールドバッハ予想」に関連する性質で、1つの偶数に対して複数の素数の組み合わせが存在する場合もあります。

例えば、10という数値は次のように表せます。

  • 10 = 5 + 5
  • 10 = 7 + 3

本記事で紹介するアルゴリズムは、与えられた偶数に対して、その数を構成できるすべての素数の和の組み合わせを見つけ出します。基本的な考え方はシンプルで、ある数 x が素数であるときに限り、(対象の数 − x) も素数かどうかを判定します。両方が素数であれば、「x + (対象の数 − x)」がその偶数を表す組み合わせとなります。

入力と出力の例

Input:
Even number: 70
Output:
Prime sums
70 = 3 + 67
70 = 11 + 59
70 = 17 + 53
70 = 23 + 47
70 = 29 + 41

アルゴリズム

dispPrimeSum(num)

入力: 偶数。

出力: 素数の和として表現された結果を表示します。

処理の手順

Begin
    if num is odd, then
        exit
    for i := 3 to num/2, do
        if i is prime, then
            if (num - i) is prime, then
                display ''num = i + (num – i)''
    done
End

まず、入力された数が奇数の場合は処理を終了します。次に、3から対象の数の半分まで順番に i を走査し、i が素数であり、かつ (num − i) も素数である場合に、その組み合わせを出力します。探索範囲を半分までに限定することで、重複した組み合わせ(順序が入れ替わっただけのもの)を避けることができます。

C++による実装例

#include<iostream>
using namespace std;

int isPrime(int number) {         //numberが素数かどうかを判定
    int lim;
    lim = number/2;

    for(int i = 2; i<=lim; i++) {
        if(number % i == 0)
            return 0;             //素数ではない
    }
    return 1;                     //素数である
}

void displayPrimeSum(int num) {
    string res;
    if(num%2 != 0) {              //奇数の場合
        cout << "Invalid Number";
        exit(1);
    }

    for(int i = 3; i <= num/2; i++) {
        if(isPrime(i)) {          //iが素数ならば
            if(isPrime(num-i)) {  //num - iも素数であれば
                cout << num <<"= "<<i << " + "<<(num-i)<<endl;
            }
        }
    }
}

main() {
    int num;
    cout << "Enter an even number: "; cin >> num;
    displayPrimeSum(num);
}

コードのポイント

  • isPrime関数: 2から number/2 までの整数で割り切れるかを確認し、素数判定を行います。
  • displayPrimeSum関数: 奇数が入力された場合は「Invalid Number」と表示して終了し、偶数であれば3から num/2 までの範囲で素数のペアを探します。

実行結果

Enter an even number: 70
70 = 3 + 67
70 = 11 + 59
70 = 17 + 53
70 = 23 + 47
70 = 29 + 41

このように、70を2つの素数の和で表す組み合わせがすべて出力されます。計算量は素数判定の部分で O(n) となり、全体としては O(n²) 程度ですが、小〜中規模の数値であれば十分に実用的な速度で動作します。より大きな数を扱う場合は、エラトステネスの篩などを用いて事前に素数表を作成すると効率化できます。

  1. Pythonでサイコロの出目の合計がターゲットと一致する組み合わせの数を求める

    d個のサイコロがあり、それぞれのサイコロには1からfまでの数字が書かれた面があるとします。このとき、出た目の合計がターゲットの値と一致するような振り方(全 fd 通りのうち)の数を、10^9 + 7 で割った余りとして求めます。 例えば、d = 2、f = 6、target = 7 の場合、答えは6になります。6面のサイコロ2つを振って合計が7になる組み合わせは、「1+6」「2+5」「3+4」「4+3」「5+2」「6+1」の6通り存在するためです。 解法のアプローチ この問題は動的計画法(DP)を使うことで効率的に解けます。手順は以下の通りです。 m := 10^9 + 7(剰余を取るため

  2. Pythonプログラムで数の偶数の約数の合計を求める方法

    この記事では、以下の問題文に対する解決策について詳しく解説します。 問題文:ある数が与えられたとき、その数のすべての偶数の約数(因子)の合計を求めて表示します。 アプローチ まず、与えられた数が奇数であるかどうかを確認します。奇数には偶数の約数が存在しないため、その場合は 0 を返します。 数が偶数である場合は、実際の計算に進みます。ここでのポイントは、20(つまり1)以外のすべての項を掛け合わせることで、偶数の約数の合計が得られるという点です。 偶数の約数からすべての奇数を取り除くために、20 に相当する「1」を無視します。この処理を行うことで、残るのは偶数の約数のみとなります。なお、2 は