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

C++でピアポント素数をすべて出力する方法

この記事では、整数 n が与えられたとき、n 未満にあるすべてのピアポント素数(Pierpont Prime)を求めて出力する方法を解説します。

ピアポント素数とは

ピアポント素数とは、次の形式で表される特殊な素数のことです。

p = 2i × 3k + 1

ここで p は素数、i と k は非負の整数です。つまり「2 のべき乗と 3 のべき乗の積に 1 を加えた数」が素数となるとき、その数をピアポント素数と呼びます。たとえば 13 = 22×31+1、19 = 21×32+1、37 = 22×32+1 であり、これらはすべてピアポント素数です。

入力例と出力例

入力: n = 50

出力: 2, 3, 5, 7, 13, 17, 19, 37

解法の考え方

この問題を解くには、条件を満たすすべての素数を見つける必要があります。そのため、次の手順で処理を進めます。

  1. 2 のべき乗と 3 のべき乗を組み合わせ、2i×3k+1 の形で表され、かつ n 未満となる候補数をすべて列挙します。
  2. エラトステネスの篩を用いて、各候補が素数かどうかを判定します。
  3. 候補の中から素数であるものだけを出力します。

C++での実装例

上記の解法を実装したプログラムは次のとおりです。

#include <bits/stdc++.h>
using namespace std;
void printPierpontPrimes(int n){
    bool arr[n+1];
    memset(arr, false, sizeof arr);
    int two = 1, three = 1;
    while (two + 1 < n) {
        arr[two] = true;
        while (two * three + 1 < n) {
            arr[three] = true;
            arr[two * three] = true;
            three *= 3;
        }
        three = 1;
        two *= 2;
    }
    vector<int> primes;
    for (int i = 0; i < n; i++)
    if (arr[i])
        primes.push_back(i + 1);
    memset(arr, false, sizeof arr);
    for (int p = 2; p * p < n; p++) {
        if (arr[p] == false)
            for (int i = p * 2; i < n; i += p)
                arr[i] = true;
    }
    for (int i = 0; i < primes.size(); i++)
        if (!arr[primes[i]])
        cout<<primes[i]<<"\t";
}
int main(){
    int n = 50;
    cout<<"All Pierpont Prime Numbers less than "<<n<<" :\n";
    printPierpontPrimes(n);
    return 0;
}

実行結果

All Pierpont Prime Numbers less than 50 are :
2    3    5    7    13    17    19    37
  1. C++でn番目の平衡素数(バランス素数)を求める方法

    平衡素数とは 平衡素数(Balanced Prime)とは、直前の素数と直後の素数までの距離(差)が等しい素数のことです。言い換えれば、前後にある最も近い素数の平均値に一致する素数を指します。 ある素数が平衡素数であるためには、次の式を満たす必要があります。 Pn = (Pn-1 + Pn+1) / 2 ここで、nは順序付けられた素数列におけるPnのインデックス(順位)を表します。 素数の順序付き集合:2, 3, 5, 7, 11, 13, … 最初のいくつかの平衡素数は、5, 53, 157, 173, … です。 問題の概要 この問題では、数値nが与えられ、n番目の平衡素数を求めることが

  2. C++で数値が完全素数(フルプライム)かどうかを判定する方法

    完全素数(フルプライム)とは?本記事では、ある数値が「完全素数(フルプライム)」であるかどうかを判定する方法を解説します。完全素数とは、その数値自体が素数であり、かつ各桁の数字もすべて素数である数のことです。例えば、37は2桁とも素数の数字(3と7)で構成され、数値全体も素数であるため、完全素数です。一方、97は数値自体は素数ですが、各桁に9という素数でない数字が含まれているため、完全素数ではありません。判定のアプローチ効率的な判定方法は以下の2段階で行います。まず、素数でない桁が含まれていないかを確認します。各桁の数字は0から9の範囲に収まるため、この範囲で素数となるのは2、3、5、7の4つ