题面中提及的Heron法就是牛顿法解$x^2-n=0$时的特例,对这一方程而言牛顿法只要初值足够近,牛顿法就具有平方收敛性,因此只需很少的迭代次数就能得到足够近似的结果。
实现时使用深度优先搜索推进迭代的步数和范围,每一步迭代都遍历所有n,注意到$\lceil n/x\rceil$的值对x到$\lceil n/x\rceil x$之间的n都相同,因此在每一步的迭代中咋遍历n时可以不断以x为步长。
最终结果是$4.4474011180$。
注:牛顿法一般在我国《高等数学》、《数学分析》提及、其收敛性一般在《数值分析》等课程中讲授。
注2:计算量较大,以下代码中打印了进度信息。此外,代码为Python 3,因需要使用浮点除法以及需要math.ceil的返回值为整型。
import math
count=0
q=[(1,7000000,10**13,10**14-1)]
i=0
while q:
k,x,a,b=q.pop()
n=a
while n<=b:
t=math.ceil(n/x)
m=min(b,t*x)
y=(t+x)//2
if y==x:
count+=(m-n+1)*k
else:
q.append((k+1,y,n,m))
n=m+1
i+=1
if i%1000000==0:print(i//1000000,"million popped")
print("%.10f" %(count/(10**14-10**13)))
|