V Pythonu jsem taky jednou napsal sqrt() pomoci Newtonovy metody:
def sqrt(x):
eps = 1e-10
x = float(x)
r = x/2
residual = r**2 - x
while abs(residual) > eps:
r -= residual/(2*r)
residual = r**2 - x
return r
Pro predstavu, je potreba radove 5 iteraci pro presnost 1e-10 pro cisla kolem 10.
Pro integery jsem udelal tuto verzi pomoci Newtonovy metody:
def prep2(a, b):
x = a**2 + b**2
r = x/2
residual = r**2 - x
r_old = r+1
while 1:
r -= residual/(2*r)
residual = r**2 - x
if r == r_old:
break
r_old = r
return r
Pouziva se jen integer division. Melo by to byt presny +-1 (integer). Porad to ale vypada pomalejsi nez ten trik v blogu.