在程序开始时,进行一些预先过滤以加快运算速度,过滤掉显而易见的非平方数,包括负数、尾4位为0的数以及尾2位满足特定条件(十进制为5或8)的数。对于0,认为它是平方数。
下一步,利用按位技巧检查模255 = 3 5 17的余数是否是平方数,数组 bad255 记录了每个余数是否是平方数,直接查表即可。
对于通过预过滤的数,除以所有2的幂(以二分搜索的方式),直到商数为奇数。
最后的步骤是使用类似于亨泽尔引理的方法近似计算平方根。内循环从一个由 start 数组给出的初始值开始,该数组提供了sqrt(mod 8192)的近似值。这个近似值不断通过逐次计算来改进,使用按位技巧来提高速度。
这个方法的大致构造如下:
值得注意的是,这个算法的作者声称它的运行速度比其他方法快35%。
以上是我们如何有效地确定一个大数是否是完全平方数?的详细内容。更多信息请关注PHP中文网其他相关文章!