Algorithm 有没有其他算法可以确定一个数是否为素数

Algorithm 有没有其他算法可以确定一个数是否为素数,algorithm,Algorithm,我总是使用该代码来控制一个数字是否为素数: #include <stdio.h> int main() { unsigned long long i, n; int s; printf("Enter the number: "); scanf("%llu", &n); if (n != 2) { for (i = 2; i < n; i++) { if (n%i == 0) {

我总是使用该代码来控制一个数字是否为素数:

#include <stdio.h>

int main() {
    unsigned long long i, n;
    int s;
    printf("Enter the number: ");
    scanf("%llu", &n);

    if (n != 2) {
        for (i = 2; i < n; i++) {
            if (n%i == 0) {
                s = 0;
                break;
            }
            else {
                s = 1;
            }
        }
    }
    else {
        s = 1;
    }

    if (s == 1) {
        printf("Prime.");
    }
    else {
        printf("Not prime.");
    }

    return 0;
}
#包括
int main(){
无符号长i,n;
int-s;
printf(“输入数字:”);
scanf(“%llu”、&n);
如果(n!=2){
对于(i=2;i
但是,当我输入一个非常大的数字,如1365165888711511,它需要很长的时间。(我等了一个小时。(CPU:2.90GHz*4,RAM:8GB))


我的问题;有没有其他方法比上述算法更快地检查数字?

这应该将执行时间减少到几分钟而不是几小时,至少对于素数的数字:

 for (i=3; i*i <= n; i += 2){
    if (n % i == 0) {
        s=0;
        break;
    }
请注意,对于许多值,这可能是确定的:

当要测试的数量n很小时,不需要尝试所有a<2(ln n)^2,因为已知更小的潜在证人组就足够了。例如,Pomerance、Selfridge和Wagstaff[8]以及Jaeschke[9]已经证实

如果n<2047,测试a=2就足够了;
如果n<1373653,测试a=2和3就足够了;
如果n<9080191,测试a=31和73就足够了;
如果n<25326001,测试a=2、3和5就足够了;
如果n<4759123141,则测试a=2、7和61就足够了;
如果n<1122004669633,则测试a=2、13、23和1662803就足够了;
如果n<2152302898747,测试a=2、3、5、7和11就足够了;
如果n<34749660383,则测试a=2、3、5、7、11和13就足够了;
如果n<341550071728321,则测试a=2、3、5、7、11、13和17就足够了。
利用Feitsma和Galway在2010年枚举所有基2伪素数的工作,这一点得到了扩展(见OEIS) A014233),第一个结果后来在蒋和邓中使用不同的方法显示:[10]

如果n<382512356546413051,测试a=2、3、5、7、11、13、17、19和23就足够了。
如果n<2^64,测试a=2、3、5、7、11、13、17、19、23、29、31和37就足够了。
Sorenson和Webster[11]验证上述内容,并计算这些大于64位结果的精确结果:

如果n<31866585734031151167461,测试a=2、3、5、7、11、13、17、19、23、29、31和37就足够了。
如果n<3317044064679887385961981,则测试a=2、3、5、7、11、13、17、19、23、29、31、37和41就足够了。

这应该将执行时间减少到几分钟而不是几小时,至少对于素数:

 for (i=3; i*i <= n; i += 2){
    if (n % i == 0) {
        s=0;
        break;
    }
请注意,对于许多值,这可能是确定的:

当要测试的数量n很小时,不需要尝试所有a<2(ln n)^2,因为已知更小的潜在证人组就足够了。例如,Pomerance、Selfridge和Wagstaff[8]以及Jaeschke[9]已经证实

如果n<2047,测试a=2就足够了;
如果n<1373653,测试a=2和3就足够了;
如果n<9080191,测试a=31和73就足够了;
如果n<25326001,测试a=2、3和5就足够了;
如果n<4759123141,则测试a=2、7和61就足够了;
如果n<1122004669633,则测试a=2、13、23和1662803就足够了;
如果n<2152302898747,测试a=2、3、5、7和11就足够了;
如果n<34749660383,则测试a=2、3、5、7、11和13就足够了;
如果n<341550071728321,则测试a=2、3、5、7、11、13和17就足够了。
利用Feitsma和Galway在2010年枚举所有基2伪素数的工作,这一点得到了扩展(见OEIS) A014233),第一个结果后来在蒋和邓中使用不同的方法显示:[10]

如果n<382512356546413051,测试a=2、3、5、7、11、13、17、19和23就足够了。
如果n<2^64,测试a=2、3、5、7、11、13、17、19、23、29、31和37就足够了。
Sorenson和Webster[11]验证上述结果,并计算这些大于64位结果的精确结果:

如果n<31866585734031151167461,测试a=2、3、5、7、11、13、17、19、23、29、31和37就足够了。
如果n<3317044064679887385961981,则测试a=2、3、5、7、11、13、17、19、23、29、31、37和41就足够了。

加快算法速度的一个非常快速的方法是只增加n的平方根,然后增加2,以避免尝试除以偶数,如果2失败,偶数总是会失败。但是一些谷歌搜索会发现一些更复杂的算法,因为这是密码学中非常关键的一部分。在搜索过程中有以下几点可以帮助您: 幸运的是,在实践中,有更复杂的算法来寻找素数。例如Euler、Atkin和Sundaram的筛子 摘自本网站:
请注意,这不是我的链接

加快算法速度的一个非常快速的方法是只增加n的平方根,然后增加2,以避免尝试除以偶数,如果2失败,那么偶数总是会失败。但是一些谷歌搜索会发现一些更复杂的算法,因为这是密码学中非常关键的一部分。在搜索过程中有以下几点可以帮助您: 幸运的是,在实践中,有更复杂的算法来寻找素数。例如Euler、Atkin和Sundaram的筛子 摘自本网站:
请注意,这不是我的链接

这实际上是一个与代码相对的数学/算法问题——Fermat的小定理是第一个要检查的地方,它将引导您了解Carmichael数和数学的一个可爱分支。你可以在mathematics overflow(数学溢出)网站上提问,但这样一个基本的主题应该首先研究——有很多资料。这不是编程,这是“找到更好的方法”,在你决定更好的方法是什么之前,这不会是编程。我要去厕所
if n < 2,047, it is enough to test a = 2;
if n < 1,373,653, it is enough to test a = 2 and 3;
if n < 9,080,191, it is enough to test a = 31 and 73;
if n < 25,326,001, it is enough to test a = 2, 3, and 5;
if n < 4,759,123,141, it is enough to test a = 2, 7, and 61;
if n < 1,122,004,669,633, it is enough to test a = 2, 13, 23, and 1662803;
if n < 2,152,302,898,747, it is enough to test a = 2, 3, 5, 7, and 11;
if n < 3,474,749,660,383, it is enough to test a = 2, 3, 5, 7, 11, and 13;
if n < 341,550,071,728,321, it is enough to test a = 2, 3, 5, 7, 11, 13, and 17.
if n < 3,825,123,056,546,413,051, it is enough to test a = 2, 3, 5, 7, 11, 13, 17, 19, and 23.
if n < 2^64, it is enough to test a = 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, and 37.
if n < 318,665,857,834,031,151,167,461, it is enough to test a = 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, and 37.
if n < 3,317,044,064,679,887,385,961,981, it is enough to test a = 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, and 41.