anwior,
предъявленные алгоритмы основаны на итерационном способе нахождения квадратного корня, известном еще древним грекам. А именно: последовательность
![$x_0=a$ $x_0=a$](https://dxdy-04.korotkov.co.uk/f/7/9/c/79cfea173938f2996f89ed56e362c8f482.png)
,
![$x_{n+1}=\frac 12(x_n+\frac{a}{x_n})$ $x_{n+1}=\frac 12(x_n+\frac{a}{x_n})$](https://dxdy-02.korotkov.co.uk/f/9/0/2/902bd2597b37c5559583ace7981b1c4882.png)
очень быстро сходится к величине
![$\sqrt a$ $\sqrt a$](https://dxdy-03.korotkov.co.uk/f/6/0/d/60da33c603a1b2bec1fd6ea99dcd370782.png)
. Для обоснования этого метода можно заметить, что это есть не что иное, как метод Ньютона нахождения корня уравнения
![$x^2-a=0$ $x^2-a=0$](https://dxdy-04.korotkov.co.uk/f/7/f/7/7f723165ab6c377ae48143ca0ddde9c182.png)
.
Метод Ньютона имеет квадратичную скорость сходимости, или же, грубо говоря, порядок расхождения с искомым результатом каждого следующего значения уменьшается примерно в два раза. Т.е. для числа порядка
![$10^{600}$ $10^{600}$](https://dxdy-04.korotkov.co.uk/f/7/5/7/757083852934f10fe53b18509d20942282.png)
потребуется около ... 10-15 итераций (начальное приближение требуется, правда, поточнее). В общем случае, если нам дано
![$N$ $N$](https://dxdy-04.korotkov.co.uk/f/f/9/c/f9c4988898e7f532b9f826a75014ed3c82.png)
-значное число, то число итераций будет порядка
![$O(\log N)$ $O(\log N)$](https://dxdy-04.korotkov.co.uk/f/7/5/f/75ff77642a7a68c66eacceb8a0740bba82.png)
.
Далее рассмотрим насколько трудоемка одна итерация. У нас используется одна операция сложения, одна операция деления и одна операция деления пополам. Операции сложения и деления пополам (сдвиг на 1 бит) практически бесплатны, а вот операция деления достаточно трудоемка. Например, классический алгоритм
деление уголком требует порядка
![$N^2$ $N^2$](https://dxdy-01.korotkov.co.uk/f/4/c/8/4c87ee198ded31321f89b44a38a0ad5a82.png)
операций. Но и здесь придумано множество быстрых алгоритмов со сложностью порядка
![$N\log N$ $N\log N$](https://dxdy-01.korotkov.co.uk/f/8/1/e/81e1fec71a991a3cd8b7e8037ece4cfc82.png)
. Любопытно, что одним из способов вычисления
![$a/b$ $a/b$](https://dxdy-01.korotkov.co.uk/f/0/b/6/0b699c6f175bd507e131ac94cf69c1c882.png)
является поиск всё тем же методом Ньютона корня уравнения
![$\frac 1x= b$ $\frac 1x= b$](https://dxdy-02.korotkov.co.uk/f/1/9/1/191332bf26e8ee274e04b19321705bc282.png)
с последующим "быстрым" умножением на
![$a$ $a$](https://dxdy-01.korotkov.co.uk/f/4/4/b/44bc9d542a92714cac84e01cbbb7fd6182.png)
. Исследование показывает, что данный алгоритм требует всего лишь в 3 раза больше времени, затрачиваемого на умножение.
Итого на поиск квадратного корня из
![$N$ $N$](https://dxdy-04.korotkov.co.uk/f/f/9/c/f9c4988898e7f532b9f826a75014ed3c82.png)
-значного числа требуется порядка
![$O(N \log^2 N)$ $O(N \log^2 N)$](https://dxdy-04.korotkov.co.uk/f/3/a/1/3a1fcef880c72c7db00f27817fd1dd0882.png)
элементарных операций (сложение, умножение однозначных чисел).
Стоит также отметить, что современное ПО работает с 64-битовой арифметикой, то бишь в системе счисления по основанию
![$2^{64}$ $2^{64}$](https://dxdy-04.korotkov.co.uk/f/f/5/4/f54c544f103d398bf9c036ff710d936182.png)
, где ваше страшное
![$10^{650}$ $10^{650}$](https://dxdy-04.korotkov.co.uk/f/7/2/9/7290bf9bc58f10d53cad494b1235e79982.png)
имеет всего 34 знака. И проблем с извлечением корня у чисел порядка
![$10^{1000000}$ $10^{1000000}$](https://dxdy-04.korotkov.co.uk/f/b/e/a/bea5f14e9e2d71ee12b2f8a1ebd1a90682.png)
нет никаких.