为什么使用所有数字来测试素数比仅使用素数更快
Why is using all numbers to test for a prime number faster than using prime numbers only
我做了这个程序来生成质数。我知道有很多公式可以将生成速度提高 100 倍,但这就是我所做的。
-
我试图将 i 与
i
下的所有数字分开。这是最简单的方法,但我认为它效率低下,因为除以 2 后,您不需要除以 4 等等。 -
我列出了一个小于
i
的质数列表,并i
除以该列表的数字。我使用std::iterator
浏览了列表,因为我看到它被用于所有 stackoverflow 答案和其他教程中。结果慢了很多。就像它花了 22 秒而不是 2 秒。 - 我尝试使用 int 浏览列表,又花了 2 秒钟。
接下来,我用 1 000 000 查看方法 1 和 3 之间的区别。令我惊讶的是,方法 1 更快。为什么?只使用质数进行测试不应该比使用所有数字更快吗?
#include <iostream>
#include <vector>
#include <chrono>
int main()
{
std::cout << "how high do you want to generate prime numbers? ";
int x;
// typed 1 000 000
std::cin >> x;
auto starttime = std::chrono::high_resolution_clock::now();
std::vector<unsigned int> primes;
bool isPrime;
for (int i = 2; i <= x; ++i) {
isPrime = true;
// takes 293 seconds
//for (int div{ 2 }; div < i; ++div) {
// if ((i % div) == 0) {
// takes really really long
//for (std::vector<unsigned int>::iterator div = primes.begin(); div != primes.end(); ++div) {
//if ((i % *div) == 0) {
// takes 356 seconds
for (int iter = 0; iter < primes.size(); ++iter) {
if ((i % primes[iter]) == 0) {
isPrime = false;
break;
}
}
if (isPrime) {
primes.push_back(i);
std::cout << i << " ";
}
}
std::cout << "generating prime numbers up to " << x << " took " <<
round(static_cast<std::chrono::duration<double>>((std::chrono::high_resolution_clock::now() - starttime)).count())
<< " seconds.";
}
因为它的用法vector<unsinged int>
用于第三种方法。 特别是primes.push_back导致分配。尝试最初primes.reserve
我想说的主要问题是大多数情况下,一个数字可以被 2 整除,因此它不是素数。我想第一种方法对编译器和缓存更友好。但很难确定。此外,请尝试删除打印并测试所花费的时间。打印往往会减慢代码的速度,具体取决于使用情况。
一种确定所有素数的标准方法(有更有效的方法,但这个相当简单(。
创建布尔值的向量
A
,以指示数字是否为素数。但是在开始时将所有变量设置为 true - 除了A[0]=A[1]=false
.从
i = 2 to x
运行循环。如果A[i]
是假的,则跳过它 -i
不是素数。如果A[i]
为真,则i
为素数,并将所有A[i*k]
设置为假1<k<x/i
。
这应该更有效的任何一种方法。
相关文章:
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 为什么将双精度转换为 int 似乎在第 16 位数字之后将其四舍五入?
- 为什么有时我输入一个整数,程序将第一个输入的数字打印成十进制数?
- 为什么兰德每次都给我几乎相同(但略有不同)的数字
- 当我输入字符类型的数字时,为什么我无法获得整数?
- 为什么当我输入较大的数字时,我的程序会到达文件末尾?
- 为什么使用数组元素查找最大数字的程序不起作用?
- C++ 为什么数字限制不适用于uint8_t和int8_t?
- 为什么strlen(s)与s的大小不同,为什么cout-char显示的是字符而不是数字
- 为什么我C++得到这个随机的奇怪数字
- 为什么当我输入一个被接受的数字时,我的 do-while 循环没有中断?
- 为什么我的程序在读取/写入文件时会删除最重要的数字?
- 为什么我的位移给出不正确的数字
- 为什么 sf::Text 显示点而不是数字?
- 反转一个数字程序不起作用,为什么?
- 为什么这个程序接受整数和字母数字输入并打印它们? C++ 中的 std::string 也采用整数值吗?
- 为什么当我输入一个大数字时,输出会一遍又一遍地重复?
- 为什么断点显示数组的第二个值是一个大数字?额外学分工作
- 为什么我的 while 循环永远不会在 C++ 中的数字猜测游戏中结束?
- 为什么当我在 c++ 中运行函数时,我的代码显示数字 53