【发布时间】:2021-09-20 08:03:03
【问题描述】:
我在 c 中探索素数算法,直到我偶然发现了这个,哦,天哪,算法真的很快,知道它在 2 之后实现素数的 6n-+1 属性以找到下一个最近的素数,但是代码的某些部分我仍然没有得到,首先为什么考虑到他从 2,3 开始,如果它们分别出现则返回 true,下一个条件 if (nb % 2 == 0 || nb % 3 == 0) return FALSE; 的用途是什么?,每个其他素数都不可整除除了 2 和 3 之外的 2 和 3 并且应该同时进行检查,那么 if 条件有什么用?其次,我所说的 while 循环应该实现 6n-+1 属性,但我真的没有看到循环中的数学表达式和测试表达式之间的相关性?最后,while 中的两个条件似乎是可爱的和数学的,但我没有那么多使用它们,请你澄清一下。非常感谢。
#include <stdio.h>
#define TRUE 1
#define FALSE 0
int is_prime(int nb)
{
int divisor;
if (nb == 2 || nb == 3)
return TRUE;
if (nb % 2 == 0 || nb % 3 == 0)
return FALSE;
divisor = 6;
while (divisor * divisor - 2 * divisor + 1 <= nb)
{
if (nb % (divisor - 1) == 0)
return FALSE;
if (nb % (divisor + 1) == 0)
return FALSE;
divisor += 6;
}
return (1);
}
int find_next_prime(int nb)
{
while (!is_prime(++nb))
{};
return nb;
}
int main()
{
printf("%i", find_next_prime(78314683));
return (0);
}
【问题讨论】:
-
那个属性是用来skip 2和3的倍数尽可能divisors,但是函数还是需要知道这个数是否经过是这样的倍数。
-
@Bob_ 确实如此,请大声说为什么它会跳过 3 和 2 的倍数?
-
试试铅笔和纸,写下所有的数字,检查所有 2 和 3 的倍数,看看剩下的数字在哪里。现在进入代码并计算
divisor的所有值。我会从 5 开始,然后添加 2,然后添加 4,然后添加 2,依此类推,但这就是我。
标签: c algorithm performance primes