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

与えられた範囲の間で素数を生成するためにセグメント化されたふるいを実装するC++プログラム


これは、セグメント化されたふるいを実装して、指定された範囲間で素数を生成するC++プログラムです。セグメント化されたふるいは、最初にSimple Sieveを使用して、√(n)以下の素数を見つけます。このアルゴリズムのアイデアは、範囲[0 ... n-1]を異なるセグメントに分割し、すべてのセグメントの素数を1つずつ計算することです。

アルゴリズム

Begin
   Create function to find all primes smaller than limit
   using simple sieve of eratosthenes.
   Finds all prime numbers in given range using
   segmented sieve
   A) Compute all primes smaller or equal to square root of high using simple sieve
   B) Count of elements in given range
   C) Declaring boolean only for [low, high]
   D) Find the minimum number in [low ... high] that is a multiple of prime[i] (divisible by prime[i])
   E) Mark multiples of prime[i] in [low … high]
   F) Numbers which are not marked in range, are prime
End

サンプルコード

#include <bits/stdc++.h>
using namespace std;
void simpleSieve(int lmt, vector<int>& prime) {
   bool mark[lmt + 1];
   memset(mark, false, sizeof(mark));
   for (int i = 2; i <= lmt; ++i) {
      if (mark[i] == false) {
         prime.push_back(i);
         for (int j = i; j <= lmt; j += i)
            mark[j] = true;
      }
   }
}
void PrimeInRange(int low, int high) {
   int lmt = floor(sqrt(high)) + 1;
   vector<int> prime;
   simpleSieve(lmt, prime);
   int n = high - low + 1;
   bool mark[n + 1];
   memset(mark, false, sizeof(mark));
   for (int i = 0; i < prime.size(); i++) {
      int lowLim = floor(low / prime[i]) * prime[i];
      if (lowLim < low)
         lowLim += prime[i];
      for (int j = lowLim; j <= high; j += prime[i])
         mark[j - low] = true;
   }
   for (int i = low; i <= high; i++)
      if (!mark[i - low])
         cout << i << " ";
}
int main() {
   int low = 10, high = 50;
   PrimeInRange(low, high);
   return 0;
}

出力

11 13 17 19 23 29 31 37 41 43 47

  1. 与えられた範囲の間で素数を生成するためにホイールシーブを実装するC++プログラム

    Wheel Sieveメソッドは、特定の範囲の間の素数を見つけるために使用されます。ホイール因数分解は、エラトステネスのふるいの予備を手動で実行するためのグラフィカルな方法であり、素数をコンポジットから分離します。 この方法では、最も内側の円の素数は、他の円のそれ自体と同様の位置にそれらの倍数を持ち、素数とその倍数のスポークを形成します。最も内側の円のこれらの素数の倍数は、外側の円の合成数のスポークを形成します。 アルゴリズム Begin    Define max number    gen_sieve_primes()    D

  2. 2つの区間の素数を表示するC++プログラム

    素数は1より大きい整数であり、素数の唯一の要素は1とそれ自体でなければなりません。最初の素数のいくつかは2、3、5、7、11、13、17などです。 2つの区間の間に多くの素数が存在する可能性があります。たとえば、区間5と20の間の素数は-です。 5, 7, 11, 13, 17 and 19. 2つの区間の間で素数を見つけて表示するプログラムは次のとおりです。 例 #include <iostream> using namespace std; void PrimeNumbers (int lbound, int ubound) {    int flag,