Jednym z problemów związanych z metodą Newtona jest to, że wymaga ona operacji dzielenia w każdej iteracji, która jest najwolniejszą podstawową operacją na liczbach całkowitych.
Jednak metoda Newtona dla odwrotnego pierwiastka kwadratowego nie. Gdybyx to numer, dla którego chcesz znaleźć 1x√, iteruj:
ri+1=12ri(3−xr2i)
Jest to często wyrażane jako:
wi=r2i
di=1−wix
ri+1=ri+ridi2
To trzy operacje mnożenia. Podział na dwa można zastosować jako przesunięcie w prawo.
Problem w tym, że rnie jest liczbą całkowitą. Można jednak nim manipulować, wprowadzając ręcznie zmiennoprzecinkowe i wykonując kilka operacji przesunięcia, aby skompensować w razie potrzeby.
Najpierw przeskalujmy x:
x′=2−2ex
gdzie chcielibyśmy x′ być większym, ale blisko, 1. Jeśli uruchomimy powyższy algorytmx′ zamiast x, znaleźliśmy r=1x√′. Następnie,x−−√=2erx′.
Teraz podzielmy się r w mantysę i wykładnik potęgi:
ri=2−eir′i
gdzie r′ijest liczbą całkowitą. Intuicyjnie,ei reprezentują precyzję odpowiedzi.
Wiemy, że metoda Newtona z grubsza podwaja liczbę dokładnych cyfr znaczących. Możemy więc wybrać:
ei+1=2ei
Przy odrobinie manipulacji znajdujemy:
ei+1=2ei
wi=r′i2
x′i=x22e−ei+1
di=2ei+1−w′ix′i2ei+1
r′i+1=2eir′i−r′idi2ei+1
Przy każdej iteracji:
x−−√≈r′ix2e+ei
Jako przykład spróbujmy obliczyć pierwiastek kwadratowy z x=263. Wiemy, że odpowiedź brzmi2312–√. Odwrotnym pierwiastkiem kwadratowym jest12√2−31, więc ustawimy e=31 (to jest skala problemu) i na nasze początkowe przypuszczenia wybierzemy r′0=3 i e0=2. (To znaczy, wybieramy34 dla naszego wstępnego oszacowania na 12√.)
Następnie:
e1=4,r′1=11
e2=8,r′2=180
e3=16,r′3=46338
e4=32,r′4=3037000481
Możemy ustalić, kiedy przerwać iterację, porównując ei do e; jeśli poprawnie obliczyłem,ei>2epowinno być wystarczająco dobre. Zatrzymamy się tutaj i znajdziemy:
263−−−√≈3037000481×263231+32=3037000481
Prawidłowy pierwiastek kwadratowy z liczby całkowitej to 3037000499, więc jesteśmy bardzo blisko. Możemy wykonać kolejną iterację lub zoptymalizować iterację końcową, która się nie podwajaei. Szczegóły pozostawia się jako ćwiczenie.
Aby przeanalizować złożoność tej metody, zwróć uwagę, że pomnożenie dwóch b-bit liczba całkowita bierze O(blogb)operacje. Jednak tak to ułożyliśmyr′i<2ei. Więc mnożenie do obliczeniawi mnoży dwa ei-bitowe liczby, aby wygenerować ei+1-bit liczba, a pozostałe dwa mnożenia mnożą dwa ei+1-bitowe liczby, aby wygenerować 2ei+1-bitowa liczba.
W każdym przypadku liczba operacji na iterację wynosi O(eilogei), i tu są O(loge)wymagane iteracje. Ostateczne pomnożenie jest rzęduO(2elog2e)operacje. Ogólna złożoność jestO(elog2e) operacje, które są podkwadratowe pod względem liczby bitów w x. To zaznacza wszystkie pola.
W tej analizie kryje się jednak ważna zasada, o której powinni pamiętać wszyscy pracujący z dużymi liczbami całkowitymi: ponieważ mnożenie jest liczbą superliniową pod względem liczby bitów, wszelkie operacje mnożenia należy wykonywać tylko na liczbach całkowitych o przybliżonej wielkości bieżącej precyzji (i , Mógłbym dodać, powinieneś spróbować pomnożyć razem liczby, które mają podobny rząd wielkości). Używanie liczb całkowitych większych niż to strata wysiłku. Czynniki stałe są ważne, a dla dużych liczb całkowitych mają one duże znaczenie.
W końcowej obserwacji dwa z mnożenia mają formę ab2c. Najwyraźniej nie ma sensu obliczać wszystkich bitówab tylko rzucić cz nich z przesunięciem w prawo. Wdrożenie inteligentnej metody mnożenia, która bierze to pod uwagę, również pozostawia się jako ćwiczenie.