【发布时间】:2021-01-03 16:00:22
【问题描述】:
我在下面发现了一个新的素数测试,它可以确定 1000000007 是否为素数。
它的速度与其他现有的素数算法相比如何?
它是否赢得了最“毫无计算价值”的素性测试奖?
谢谢。
编辑
使用此处描述的这种方法能够提高速度:
https://math.stackexchange.com/questions/3979118/speedup-primality-test
“所以从 x=n/2 到 n/2+√n/2 就足够了。有了这个改进,你的算法仍然会比你的 isPrimeNumber 例程慢一些——只是因为计算 gcd 比较慢而不是计算除数。这对于测试可能有 15-20 位数字的数字是可行的,但是您需要完全不同的方法来测试更大的数字,例如您提到的 183 位数字。”
// Primality Test
// Every n is prime if all lattice points on x+y=n are visible from the origin.
#include <stdio.h>
#include <stdint.h>
#include <math.h>
uint64_t gcd(uint64_t a, uint64_t b)
{
return (b != 0) ? gcd(b, a % b) : a;
}
int isPrimeNumber(uint64_t n)
{
if (n == 1) return 0;
if (n == 2 || n == 3) return 1;
if (n % 2 == 0) return 0;
// Start near line x=y.
uint64_t x = (n / 2) + 2;
uint64_t y = n - x;
uint64_t count = sqrt(n) / 2;
for (uint64_t i = 0; i < count; ++i) {
// Check lattice point visibility...
if (gcd(x, y) != 1) return 0;
x++; y--;
}
return 1;
}
int main(int argc, char* argv)
{
uint64_t n = 1000000007;
if (isPrimeNumber(n) == 1)
{
printf("%llu prime.", n);
}
else
{
printf("%llu not prime.", n);
}
return 0;
}
【问题讨论】:
-
你说的是计算复杂度吗?正确性?还有什么?
-
对于素数,它必须测试
x,y的大约n/2值,但对于合数,您可能会很幸运并找到早期结果。 -
程序报告
1000000007不是素数,但它是。 -
仅在 [2, sqrt(n)] 范围内检查
gcd(x,y)中的x。改进!</sarcasm>
标签: c primes primality-test