使用 N 的平方根与 N/2 相比,检查 N 是否为素数有何优势?
What are the advantages of checking if N is a prime number using square root of N versus N/2?
检查一个数是否为素数是否需要减少迭代次数?
例如。 37 是素数,检查 18.5(37 的一半)与 6.08(平方根)之间的关系可以省去很多工作,但两者遵循相同的原则?
抱歉提问,我正在尝试巩固我使用数字的平方根来确定它是否是质数的逻辑,并试图向其他人解释它
之所以有效,是因为如果 n
可以被 2 整除,那么它也可以被 n / 2
整除,如果它不能被一个整除,它也不会被另一个整除。所以查一个就够了,2
查起来更方便
同样的逻辑适用于 3
:(不能)被 3
整除意味着(不能)被 n / 3
整除,所以只检查 3
.
同样适用于 4, 5, ..., x
。什么是 x
?它是 sqrt(n)
,因为 n / sqrt(n) = sqrt(n)
,所以事情会在这个阈值之后开始重复。
检查到 floor(sqrt(n))
就足够了。我们可以证明这一点:
floor(sqrt(n)) <= ceil(sqrt(n))
For the "=" part, it's obvious both work.
floor(sqrt(n)) < ceil(sqrt(n)) <=> floor(sqrt(n)) + 1 = ceil(sqrt(n))
if n divisible by floor(sqrt(n)) + 1 =>
=> n divisible by n / (floor(sqrt(n)) + 1) < n / floor(sqrt(n))
由于我们检查了所有小于或等于 floor(sqrt(n))
的数字,我们会找到除数 n / (floor(sqrt(n) + 1))
,因此检查上限没有意义。
首选平方根,因为它可以显着缩短大数的执行时间。
为什么可以用平方根作为极限?
如果 N 不是质数,我们可以将其表示为 N = p1*p2,其中 p1 和 p2 的因数大于 1。显然,p1 或 p2(或两者)都小于或等于 N 的平方根。因此,它毫无意义进一步检查。
请注意,确实存在更高级的检查数字素数的方法。例如:Miller-Rabin 素性检验。虽然此测试是概率性的,但通过某些设置,它可以为小于最大 64 位整数的所有素数生成正确答案。
检查一个数是否为素数是否需要减少迭代次数?
例如。 37 是素数,检查 18.5(37 的一半)与 6.08(平方根)之间的关系可以省去很多工作,但两者遵循相同的原则?
抱歉提问,我正在尝试巩固我使用数字的平方根来确定它是否是质数的逻辑,并试图向其他人解释它
之所以有效,是因为如果 n
可以被 2 整除,那么它也可以被 n / 2
整除,如果它不能被一个整除,它也不会被另一个整除。所以查一个就够了,2
查起来更方便
同样的逻辑适用于 3
:(不能)被 3
整除意味着(不能)被 n / 3
整除,所以只检查 3
.
同样适用于 4, 5, ..., x
。什么是 x
?它是 sqrt(n)
,因为 n / sqrt(n) = sqrt(n)
,所以事情会在这个阈值之后开始重复。
检查到 floor(sqrt(n))
就足够了。我们可以证明这一点:
floor(sqrt(n)) <= ceil(sqrt(n))
For the "=" part, it's obvious both work.
floor(sqrt(n)) < ceil(sqrt(n)) <=> floor(sqrt(n)) + 1 = ceil(sqrt(n))
if n divisible by floor(sqrt(n)) + 1 =>
=> n divisible by n / (floor(sqrt(n)) + 1) < n / floor(sqrt(n))
由于我们检查了所有小于或等于 floor(sqrt(n))
的数字,我们会找到除数 n / (floor(sqrt(n) + 1))
,因此检查上限没有意义。
首选平方根,因为它可以显着缩短大数的执行时间。
为什么可以用平方根作为极限? 如果 N 不是质数,我们可以将其表示为 N = p1*p2,其中 p1 和 p2 的因数大于 1。显然,p1 或 p2(或两者)都小于或等于 N 的平方根。因此,它毫无意义进一步检查。
请注意,确实存在更高级的检查数字素数的方法。例如:Miller-Rabin 素性检验。虽然此测试是概率性的,但通过某些设置,它可以为小于最大 64 位整数的所有素数生成正确答案。