3. (Вычисление последовательных приближений к 1/v.) Выполнить шаг 4 для i = 1, 2, …, j − 1.
4. (Вычисление приближения из 2i битов.) Присвоить [2i+1, d] значение
23·2i [2i−1 + 1, a] − [2i−1 + 1, a]2 ([k, v]/2k−2i)
Деление в скобках (фактически сдвиг вправо) должно выполняться до умножения; идея состоит в том, чтобы ускорить умножение, отбросив лишние биты v, ненужные в данном приближения. Хотя кажется, что результат d может содержать больше 2i+1 битов, этого никогда не произойдет. Затем присвоить [2i + 1, а] значение [2i+1, d]/2i−1.
5. (Улучшение окончательной оценки.) Присвоить [3k, d] значение
22k[k + 1, а] − [k + 1, а]2·[k, v].
Затем присвоить [k + 1, а] значение
([Зk, d] + 22k−2)/22k−1.
6. (Окончательное деление.) Выдать в качестве результата
([k + 1, a] · [m, u] + 2k+n−2)/22+k−1[33].
Для нахождения π надо будет провести вычисления по одной из формул, выписанных ранее в этом пункте, с использованием ряда для арктангенса. Фактически для страховки следует использовать две формулы и затем сравнить результаты бит за битом. Значением π будет общая начальная часть этих двух результатов.
Все еще остается открытым вопрос, как с помощью алгоритмов, работающих только с целыми числами, получить очевидно дробные значения членов ряда. Пусть мы хотим вычислить я, скажем, с точностью 1000 битов. Вычислим тогда 21000π, умножив все числители на 21000. Эта процедура делает также все делимые много больше делителей (как предполагалось выше) и позволяет прекратить вычисления, когда частные станут нулевыми.
Выберем теперь (не обязательно наилучший) ряд для вычислений, скажем
π = 16 arctg(1/5) − 4 arctg(1/239).
Мы фактически будем вычислять 21000π, поэтому хотелось бы вычислить 21000·16 arctg (1/5). Первым членом соответствующего ряда будет 21000·16/5; назовем его a1 (отметим, что a1 складывается с суммой). Теперь, чтобы получить следующий член ai+1 из ai, поделим a1 на 5·5·(2i − 1)[34]. Если ai добавлялся к сумме, то вычтем ai+1 из суммы, если ai вычитался, прибавим ai+i. Будем поделим a1 на 5·5·(2i − 1). Если ai добавлялся к сумме, то вычисления заканчиваются, когда члены обоих рядов станут нулевыми. В результате получим примерно тысячу битов числа π. Результат, конечно, надо будет перевести в десятичную систему.
Итак, в конечном итоге нам нужны кроме алгоритма умножения и деления следующие вспомогательные подпрограммы:
Выделение памяти. Получая величину
Возврат памяти. Исходными данными для этой подпрограммы служит пара