与えられた範囲の間で素数を生成するためにアトキンのふるいを実装するC++プログラム
これは、指定された範囲間で素数を生成するためにSieveofAtkinを実装するC++プログラムです。アトキンのふるいは、指定された整数までのすべての素数を見つけるための最新のアルゴリズムです。
アルゴリズム
Begin Create a results list, filled with 2, 3, and 5. Initialize the sieve array with false values Mark siev[n] is true if one of the following is true: a) n = (4*x*x) + (y*y) has odd number of solutions n % 12 = 1 or n % 12 = 5. b) n = (3*x*x) + (y*y) has odd number of solutions and n % 12 = 7 c) n = (3*x*x) - (y*y) has odd number of solutions, x > y and n % 12 = 11 Mark all multiples of squares as non-prime Print primes using sieve[] End
サンプルコード
#include <bits/stdc++.h> using namespace std; int SieveOfAtkin(int lmt) { if (lmt > 2) cout << 2 << " "; if (lmt > 3) cout << 3 << " "; bool sieve[lmt]; for (int i = 0; i < lmt; i++) sieve[i] = false; for (int a = 1; a * a < lmt; a++) { for (int b = 1; b * b < lmt; b++) { // Main part of Sieve of Atkin int n = (4 * a* a) + (b * b); if (n <= lmt && (n % 12 == 1 || n % 12 == 5)) sieve[n] ^= true; n = (3 * a * a) + (b * b); if (n <= lmt && n % 12 == 7) sieve[n] ^= true; n = (3 * a * a) - (b * b); if (a > b && n <= lmt && n % 12 == 11) sieve[n] ^= true; } } for (int r = 5; r * r < lmt; r++) { if (sieve[r]) { for (int i = r * r; i < lmt; i += r * r) sieve[i] = false; } } for (int x = 5; x < lmt; x++) if (sieve[x]) cout << x << " "; } int main(void) { int lmt = 30; SieveOfAtkin(lmt); return 0; }
出力
2 3 5 7 11 13 17 19 23 29
-
関数を使用して2つの区間の間の素数を表示するC++プログラム
素数は1より大きい整数であり、素数の唯一の要素は1とそれ自体でなければなりません。最初の素数のいくつかは2、3、5、7、11、13、17などです。 2つの区間の間に多くの素数が存在する可能性があります。たとえば、区間5と20の間の素数は、5、7、11、13、17、19です。 2つの区間の間で素数を見つけて表示するプログラムは次のとおりです。 例 #include <iostream> using namespace std; void primeNumbers (int lbound, int ubound) { int flag, i;
-
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,