L'un des problèmes de la méthode de Newton est qu'elle nécessite une opération de division à chaque itération, qui est l'opération de base la plus lente.
Cependant, la méthode de Newton pour la racine carrée réciproque ne le fait pas. Si est le nombre pour lequel vous voulez trouver 1x , itérer:1x√
ri+1=12ri(3−xr2i)
Cela s'exprime souvent comme suit:
d i = 1 - w i x r i + 1 = r i + r i d i
wi=r2i
di=1−wix
ri+1=ri+ridi2
C'est trois opérations de multiplication. La division par deux peut être implémentée comme un décalage vers la droite.
Maintenant, le problème est que n'est pas un entier. Cependant, vous pouvez le manipuler en tant que tel en implémentant manuellement la virgule flottante et en effectuant un tas d'opérations de décalage pour compenser le cas échéant.r
Tout d'abord, redimensionnons :x
x′=2−2ex
où nous aimerions que soit supérieur, mais proche de . Si nous exécutons l'algorithme ci-dessus sur au lieu de , nous trouvons . Ensuite, .x′1x′xr=1x√′x−−√=2erx′
Maintenant, divisons en une mantisse et un exposant:r
ri=2−eir′i
où est un entier. Intuitivement, représente la précision de la réponse.r′iei
Nous savons que la méthode de Newton double à peu près le nombre de chiffres significatifs précis. Nous pouvons donc choisir:
ei+1=2ei
Avec un peu de manipulation, on retrouve:
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
A chaque itération:
x−−√≈r′ix2e+ei
À titre d'exemple, essayons de calculer la racine carrée de . Nous savons que la réponse est . La racine carrée réciproque est , nous allons donc définir (c'est l'échelle du problème) et pour notre première estimation, nous choisirons et . (Autrement dit, nous choisissons pour notre estimation initiale à .)x=2632312–√12√2−31e=31r′0=3e0=23412√
Alors:
e1=4,r′1=11
e2=8,r′2=180
e3=16,r′3=46338
e4=32,r′4=3037000481
Nous pouvons déterminer quand arrêter l'itération en comparant à ; si j'ai calculé correctement, devrait être suffisant. Nous nous arrêterons ici, cependant, et trouverons:eieei>2e
263−−−√≈3037000481×263231+32=3037000481
La racine carrée entière correcte est , nous sommes donc assez proches. Nous pourrions faire une autre itération, ou faire une itération finale optimisée qui ne double pas . Les détails sont laissés en exercice.3037000499ei
Pour analyser la complexité de cette méthode, notez que la multiplication de deux entiers bits nécessite des opérations . Cependant, nous avons arrangé les choses pour que . Ainsi, la multiplication pour calculer multiplie deux nombres bits pour produire un nombre bits, et les deux autres multiplications multiplient deux nombres bits pour produire un -bit nombre.bO(blogb)r′i<2eiwieiei+1ei+12ei+1
Dans chaque cas, le nombre d'opérations par itération est , et il y a itérations requises. La multiplication finale est de l'ordre des opérations . La complexité globale est donc les opérations , qui est sub-quadratique en nombre de bits en . Cela coche toutes les cases.O ( log e ) O ( 2 e log 2 e ) O ( e log 2 e ) xO(eilogei)O(loge)O(2elog2e)O(elog2e)x
Cependant, cette analyse cache un principe important que tous ceux qui travaillent avec de grands entiers doivent garder à l'esprit: parce que la multiplication est superlinéaire en nombre de bits, toutes les opérations de multiplication ne doivent être effectuées que sur des entiers qui ont à peu près l'ampleur de la précision actuelle (et , Je pourrais ajouter, vous devriez essayer de multiplier les nombres qui ont un ordre de grandeur similaire). L'utilisation d'entiers plus grands que cela est une perte d'effort. Les facteurs constants comptent, et pour les grands nombres entiers, ils importent beaucoup.
Enfin, deux des multiplications sont de la forme . De toute évidence, il est inutile de calculer tous les bits de uniquement pour en jeter avec un décalage à droite. La mise en œuvre d'une méthode de multiplication intelligente qui en tient compte est également laissée en exercice. abcab2cabc