为了补充 Eric Postpischil 的回答:是的,然后又不是。这取决于我们在非常大floor(sqrt(n))
的情况下将如何解释。n
正如在 Eric 的回答中,让我们假设 IEEE 754 binary64 格式浮点和正确舍入sqrt
的 ,通常的舍入到偶数舍入模式有效。我还假设可以访问任意精度的整数类型n
。
第一种解释:假设n
可以取任何整数值,那floor(sqrt(n))
将被解释为floor(sqrt(convert_to_double(n)))
。然后立即出现问题n >= 2^1024 - 2^970
,因为convert_to_double
此时会溢出。(我假设它convert_to_double
也是正确四舍五入的。)从另一端开始,Eric 的回答已经表明我们擅长但不包括n = (2^53 + 1)^2
,正如他所建议的那样,n = (2^53 + 1)^2
这是一个问题案例:有convert_to_double(n)
value 2^106 + 2^54
,小于真实值,并将sqrt(convert_to_double(n))
向下舍入为2^53
,这意味着您的试用除法函数将错过因子2^53 + 1
。但是,鉴于它2^53 + 1
可以被3
和整除107
,到那时,审判部门可能已经发现了其他因素,因此失踪2^53+1
可能不是问题。在那种情况下,n = (2^53 + 5)^2
应该被认为是第一个问题案例。(2^53 + 5
是素数。)
第二种解释:假设它n
被限制为一个正整数,可以精确地表示为双精度数。那么一个简洁的事实是,任何除数n
也必须精确地表示为双精度: n
可以写成m•2^e
一些非负指数e
和奇整数m
的形式m < 2^53
,并且任何除数n
都可以写成d•2^f
一些除数和指数d
的形式. 但是现在 if的除数小于 的精确平方根,完全可以表示为双精度数,因此最接近的可表示双精度数 的平方根m
f
0 <= f <= e
x
n
n
x
n
必须大于或等于x
。所以上来的试师套路floor(sqrt(n))
不能错过x
。
只是为了好玩:这里我们只担心n
for whichfloor(sqrt(n))
给出的值太小。如果您还对floor(sqrt(n))
给出的值太大的情况感兴趣,第一个示例出现得更早,在n = (2^26 + 1)^2 - 1
. (证明留作练习。)
当然,这都是相当学术性的:如果你正在用大于 的数字进行试除法2^106
,那么你将等待很长时间才能得到任何结果......