Научная статья на тему 'Приближение вещественного числа рациональным в аппроксимирующем k-арном алгоритме'

Приближение вещественного числа рациональным в аппроксимирующем k-арном алгоритме Текст научной статьи по специальности «Математика»

CC BY
271
28
i Надоели баннеры? Вы всегда можете отключить рекламу.
Ключевые слова
АППРОКСИМИРУЮЩИЙ K-АРНЫЙ АЛГОРИТМ / РЯДЫ ФАРЕЯ / ЦЕПНЫЕ ДРОБИ / APPROXIMATING K-ARY ALGORITHM / FAREY SEQUENCE / CONTINUED FRACTIONS

Аннотация научной статьи по математике, автор научной работы — Еникеев Разиль Радикович

Исследована задача нахождения наилучшего приближения вещественного числа несократимой дробью, знаменатель которой не превосходит заданного значения n . Цель работы состояла в нахождении самого быстрого метода аппроксимации, что позволит ускорить сходимость аппроксимирующего k -арного алгоритма вычисления наибольшего общего делителя. Описано приближение с помощью рядов Фарея, рассмотрены методы ускорения этого алгоритма с использованием условия быстрого выхода из цикла, предвычисления начальных шагов алгоритма и поиска по заранее построенному ряду. Рассмотрена также аппроксимация цепными дробями и разработан метод, который использует их и предвычисленные начальные шаги, полученные с помощью рядов Фарея. Получены оценки сложности этих методов и проведено сравнение алгоритмов по количеству итераций и времени выполнения. В результате сравнения показано, что приближение с помощью рядов Фарея и предвычислением показывает лучшее время, а среди алгоритмов, не использующих дополнительную память, метод, основанный на цепных дробях. Полученные результаты позволяют выбрать подходящий алгоритм в зависимости от требований, предъявляемых к программному продукту, реализующему приближение вещественного числа.

i Надоели баннеры? Вы всегда можете отключить рекламу.
iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

Real Number Approximation by a Rational Number in the Approximating k-ary Algorithm

The best approximation by the irreducible fraction with the denominator not exceeding some specified value n was investigated. The aim of this study was to find the fastest approximation algorithm that enables to accelerate the convergence of the k -ary algorithm for computing the greatest common divisor. The approximation based on Farey sequences was described; this method was considered using a quick exit condition, precomputation of the initial steps, and search in the Farey sequence built in advance. We also discussed the approximation with continued fractions and proposed an algorithm using a precomputation and continued fractions. The time and memory complexity of these algorithms were shown; these methods were compared with respect to running time and iterations amount. It was concluded that the approximation with the help of Farey sequences and precomputation is the fastest method, but the approximation with continued fractions has no additional memory demands.

Текст научной работы на тему «Приближение вещественного числа рациональным в аппроксимирующем k-арном алгоритме»

УЧЕНЫЕ ЗАПИСКИ КАЗАНСКОГО УНИВЕРСИТЕТА. СЕРИЯ ФИЗИКО-МАТЕМАТИЧЕСКИЕ НАУКИ

2019, Т. 161, кн. 2 С. 250-262

ISSN 2541-7746 (Print) ISSN 2500-2198 (Online)

УДК 511.41:511.42

doi: 10.26907/2541-7746.2019.2.250-262

ПРИБЛИЖЕНИЕ ВЕЩЕСТВЕННОГО ЧИСЛА РАЦИОНАЛЬНЫМ В АППРОКСИМИРУЮЩЕМ k-АРНОМ АЛГОРИТМЕ

Р.Р. Еникеев

Казанский (Приволжский) федеральный университет, г. Казань, 420008, Россия

Исследована задача нахождения наилучшего приближения вещественного числа несократимой дробью, знаменатель которой не превосходит заданного значения п. Цель работы состояла в нахождении самого быстрого метода аппроксимации, что позволит ускорить сходимость аппроксимирующего к-арного алгоритма вычисления наибольшего общего делителя. Описано приближение с помощью рядов Фарея, рассмотрены методы ускорения этого алгоритма с использованием условия быстрого выхода из цикла, предвы-числения начальных шагов алгоритма и поиска по заранее построенному ряду. Рассмотрена также аппроксимация цепными дробями и разработан метод, который использует их и предвычисленные начальные шаги, полученные с помощью рядов Фарея. Получены оценки сложности этих методов и проведено сравнение алгоритмов по количеству итераций и времени выполнения. В результате сравнения показано, что приближение с помощью рядов Фарея и предвычислением показывает лучшее время, а среди алгоритмов, не использующих дополнительную память, - метод, основанный на цепных дробях. Полученные результаты позволяют выбрать подходящий алгоритм в зависимости от требований, предъявляемых к программному продукту, реализующему приближение вещественного числа.

Ключевые слова: аппроксимирующий к-арный алгоритм, ряды Фарея, цепные дроби

Введение

Известно, что к-арный алгоритм для нахождения НОД чисел u и v (u > v > 0) вычисляет целочисленные коэффициенты a, b, которые удовлетворяют условиям 0 < a, \b\ < л/к и ua + vb = 0 (mod к) [1-3]. При этом вычисляется значение t = = \ua + vb\/k и с помощью к-арного алгоритма продолжается поиск НОД чисел v и t. Нахождение значений коэффициентов a, b, вычисление числа t и переход к новой паре v, t называется шагом редукции. В качестве к обычно выбирается степень двойки, то есть к = 22m, чтобы заменить операцию деления на битовый сдвиг. При данном значении к длина числа t меньше длины u почти на m бит, так как \ua + vbl/к < (\u\\a\ + \v\\b\)/к < (u\fh + ^у/к)/к < 2^\/~к/к = 2u/2m . Таким образом, к -арный алгоритм за два шага редукции позволяет сократить значения обоих чисел u , v на m бит.

Аппроксимирующий к-арный алгоритм на каждом шаге редукции для нахождения коэффициентов a, b использует аппроксимацию отношения u/v такую, что величина \ua + vb\ минимальна, что позволяет ускорить обычный к-арный алгоритм [4]. Для этого выбираем малое a и большее отрицательное значение b «

Аннотация

« —па/у, что позволяет в двустороннем порядке уменьшить иа и уЬ . Таким образом, эффективное приближение вещественного числа приводит к ускорению аппроксимирующего к-арного алгоритма.

Дробь о/! является наилучшим приближением для вещественного числа г, если для любой дроби а/Ь = о/! такой, что 0 < Ь < !, выполняется неравенство \г — а/Ь\ > \г — о/!\.

Задача состоит в том, что для заданного вещественного числа г в интервале [0,1] и целого числа п необходимо найти наилучшую аппроксимацию г несократимой дробью, знаменатель которой не превосходит п. Мы будем рассматривать приближение с помощью рядов Фарея и цепных дробей, метод же решения этой задачи с помощью геометрического подхода предложен в статье [5].

1. Аппроксимация с помощью рядов Фарея

Ряд (или дроби, или последовательность) Фарея порядка п, обозначаемый через Еп, — возрастающая последовательность несократимых дробей между 0 и 1, имеющих знаменатель, меньший или равный п [6]. Например, ряд Фарея при п = 5

(01112132341 имеет вид Ь5 = < —,—,—,—,—,—,—,—,—,—,—

5 \ 1 5 4 3 5 2 5 3 4 5 1 ^ Количество дробей порядка п, \Еп\, имеет асимптотический предел 3п2/п2 [7]. Две дроби а/Ь и о/! называются близкими, если Ьо—а! = 1. Если дроби близки, тогда из соотношения Безу следует, что они обе несократимы [8].

Рассмотрим важные свойства соседних элементов рядов Фарея. Если а/Ь и о/! - соседние дроби в ряде Фарея и а/Ь < о/!, то они являются близкими. Обратное тоже верно, то есть если Ьо — а! =1, то дроби являются соседями в ряде Фарея порядка тах(Ь, !). Разница между дробями а/Ь и о/! будет равна

о/! — а/Ь =1/(Ы). (1)

Пусть а/Ь, р/д и о/! - три соседних дроби и выполняется а/Ь < р/д < о/!,

то р/д является медиантой, то есть — = + . Таким образом, если а/Ь и о/! -

д Ь + а

соседние дроби, то медианта является первой дробью, которая появится в ряде Фарея порядка Ь, и она будет иметь наименьший знаменатель внутри интервала [а/Ь, о/!]. При этом медианта соседних дробей будет несократима.

1.1. Аппроксимация с помощью вычисления медианты. Чтобы найти аппроксимацию вещественного числа с использованием рядов Фарея [4], мы выбираем интервал, границами которого являются две близкие дроби а/Ь и о/!. Пусть аппроксимируемое число г находится внутри данного интервала. Вычисляем медианту дробей а/Ь и о/!, относительно которой можно разбить интервал

на две части

а а + о

а + о о Ь + ! !

, , . . Затем из двух этих интервалов выбирается

Ь Ь + я] \_Ь + ! о,\

тот, внутри которого находится г, после чего описанная выше процедура продолжается для выбранного интервала. Эта процедура завершается, когда знаменатель медианты дробей а/Ь и о/! станет больше п, а в качестве результата аппроксимации г принимается ближайшая дробь к г из дробей а/Ь и о/! (если расстояния равны, тогда выбирается дробь с наименьшим знаменателем). В рассматриваемом методе используется свойство медианты, согласно которому она является дробью с

наименьшим знаменателем в интервале

что гарантирует нахождение наи-

1Ь'

лучшего приближения. Так как в нашей задаче вещественное число лежит внутри [0,1], то в качестве начальных а/Ь и о/! выберем 0/1 и 1/1 (элементы ^ ) соответственно. Данная процедура описана в алгоритме 1, который будем обозначать Ф1.

ао

Алгоритм 1 Аппроксимация с помощью последовательного вычисления медианты a := 0,b := 1 // задаем начальную левую границу

c := 1,d := 1 // задаем начальную правую границу

while b + d <= n do

(p, q) := (a + c,b + d) if p == q * r then

return (p, q) if p < q * r then

(a, b) := (p, q) // выбираем правую часть интервала

else

(c,d) := (p, q) // выбираем левую часть интервала

return Выбрать ближайшую дробь к r из a/b и c/d

Алгоритм Ф1 можно улучшить с помощью следующих рассуждений (А и В).

р а + с

А. В алгоритме Ф1 номер итерации, на которой вычисляется дробь - = ---,

q Ь + а

зависит от самой дроби: чем больше знаменатель, тем больше итераций потребуется для ее нахождения. Проанализировав количество итераций, необходимых для вычисления всех дробей ряда Фарея, мы установили, что самое большое количество итераций алгоритма для ряда Фарея порядка п приходится на п/2 самых крайних дробей слева и справа. Они имеют вид 1/г слева, если находятся в интервале в1 = ——^ , и (1 — 1/1) — справа, если содержатся в интервале

e.

n ' n/l n/2 - 1 n - 1

,..., . Специфический вид этих дробей позволяет упростить

п/2 п \

нахождение нужной дроби. Ее вычисление можно выполнить по простой формуле без цикла, например, если г попадает в в1, тогда дробью, представляющей аппроксимацию г , будет та дробь -—-—- или -——, которая ближе к г . Это дает

[—/г\ \1/г\

нам выигрыш по скорости. Таким образом, мы модифицируем алгоритм Ф1, сначала проверяя, какому из диапазонов в( или вг принадлежит аппроксимируемое вещественное число г . Установив это, мы без цикла можем легко вычислить подходящую дробь за O(1) операций, так как не требуется выполнение цикла. Если г не принадлежит в1 и вг, тогда запускаем метод Ф1. Обозначим данную модификацию алгоритма через Ф2.

В. Рассмотрим теперь следующую проблему. Пусть наилучшим приближением к г является 1/2. Алгоритм Ф1 будет выполняться до тех пор, пока не будет найдена соседняя дробь 1 /2. Эти вычисления соседней дроби являются напрасными, так как аппроксимация г в качестве 1/2 уже была найдена. При этом чем больше п , тем будет больше ненужных вычислений, необходимых для нахождения соседней дроби. Для решения этой проблемы определим условие выхода из цикла, если мы уже получили наилучшую аппроксимацию на текущем шаге итерации.

Пусть на определенном шаге Ф1 мы вычислили медианту a/Ь. Согласно формуле (1) расстояние между этой дробью и ее соседней c/d, значение которой мы еще не вычислили, равно 1/(Ьd). Отсюда и из того, что соседние дроби a/Ь не могут иметь знаменатель, больший, чем п, следует, что минимальное расстояние от дроби a/Ь до ее соседней дроби составляет 1/(Ьп) . Таким образом, если г находится к a/Ь ближе, чем 1/(2Ьп) (половина расстояния до соседней дроби), то a/Ь является к г ближайшей дробью, чей знаменатель не превосходит п. Следовательно, при выполнении условия \г — a/Ь\ < 1/(2Ьп) необходимо прекратить алгоритм аппроксимации, результатом которого будет дробь a/Ь. В данном алгоритме также

используется быстрая аппроксимация крайних дробей (интервалы ei и er), как в Ф2. Обозначим эту модификацию алгоритма Ф2 через Ф3.

Вычислим временную сложность описанных выше алгоритмов. Знаменатель в них вычисляется по формуле q = b + d. Оценим сверху это значение: q = b + d < 2max(b, d) < • • • < 2k, где к — количество итераций. Таким образом, оценка снизу для количества итераций в Ф1 составляет О (log n). Худший случай будет при приближении крайних дробей, и в таком случае сложность будет составлять O(n). Алгоритм Ф2 работает за O(1) итераций при аппроксимации крайних дробей. Как было указано выше, было проведено исследование, которое находит количество итераций, требуемое для вычисления каждой дроби ряда Фарея. В результате такого исследования получено, что в случае приближения вещественного числа, не лежащего в интервалах ei и er, худшей ситуацией является та, при которой аппроксимируемое число r находится рядом с 1/2 .В этом случае потребуется O(n/2) = O(n) итераций. Количество итераций при использовании Ф3 будет полностью зависеть от числа, которое мы аппроксимируем, но в худшем случае, когда быстрое условие выхода из цикла не выполняется, сложность данного метода будет такая же, как и у Ф2. В алгоритмах Ф1-Ф3 количество операций на каждой итерации фиксированно, поэтому сложность этих алгоритмов составляет O(n) .

Во всех вышеперечисленных алгоритмах используется несколько чисел для представления дробей a/b, c/d и их медианты, p/q. Числитель данных дробей меньше знаменателя, который не превосходит n. Следовательно, для хранения каждого числа необходимо O(log n) бит памяти. Количество чисел, которое должно храниться в памяти, постоянное, поэтому в Ф1-Ф3 требуется O(log n) бит памяти.

1.2. Аппроксимация c предвычислением начальных границ. В этом и последующих методах мы пытаемся ускорить аппроксимацию с помощью рядов Фарея, используя дополнительную память и предвычисления.

Предлагаемый метод является улучшением предыдущего. В этом алгоритме сначала выполняем шаг предвычислений, для этого производим разбивку диапазона [0,1] на m равных отрезков. Пусть si = [(г — 1)/m,i/m) - i-й отрезок. Далее для каждого si запускаем модифицированный алгоритм Ф1, чтобы он вернул нам дроби ai/bi и ci/di такие, что ai/bi < (i — 1)/m, i/m < ci/di, а медианта (ai + + ci)/(bi + di) находится внутри si. Дроби ai/bi и ci/di будут левой и правой границами интервала, начиная с которого будет проводиться аппроксимация числа r, если оно принадлежит si. Дроби ai/bi и ci/di сохраняются в массив. Таким образом, мы с помощью предвычислений выполняем начальную часть алгоритма Ф1, заранее приближая границы начального интервала к вещественному числу настолько близко, насколько это возможно для заданного m.

Сам алгоритм приближения заключается в следующем. Находится номер i отрезка, в который попадает аппроксимируемое вещественное число r. Далее извлекаем из массива заранее вычисленные границы ai/bi и ci/di начального интервала аппроксимации r. Затем запускается алгоритм Ф3, только вместо первоначальных границ 0/1 и 1/1 (первый и второй шаг Ф1) используем дроби ai/bi и ci/di соответственно. Обозначим данный метод через Ф4.

В алгоритме Ф4 чем больше m, тем меньше размер отрезков и тем ближе начальные границы интервала ai/bi и ci/di к r, следовательно, чем больше m, тем меньше количество итераций в данном алгоритме будет проводиться и тем быстрее будет он выполняться.

В рассматриваемом алгоритме используется m отрезков, каждый из которых содержит четыре дроби, у которых размер числителя и знаменателя не превосходит n. Следовательно, Ф4 использует O(m log n) бит дополнительной памяти.

Значение m можно задать, следовательно, можно контролировать как размер дополнительной памяти, так и количество итераций в алгоритме аппроксимации.

1.3. Аппроксимация c помощью поиска по ряду Фарея. В следующих двух методах строим весь ряд Фарея заранее. Поскольку в нашей задаче r необходимо аппроксимировать дробью, знаменатель которой не превосходит n, строим ряд Fn. Для построения ряда Фарея был использован метод генерации последующего члена с помощью двух предыдущих, начиная с 0/1 и 1/n. Данный метод описан в [9]. В результате выполнения указанной процедуры будет получен массив, содержащий все дроби ряда Фарея порядка n. Как было показано выше, количество дробей в массиве будет порядка n2/3, а размер каждого элемента (числитель и знаменатель) не превосходит 2 log n. Поэтому в двух алгоритмах, описанных ниже, для хранения ряда Фарея необходимо O(n2 log n) бит памяти.

1.3.1. Аппроксимация c помощью бинарного поиска. Дроби в ряде Фарея по определению являются возрастающими, поэтому можно использовать бинарный поиск для аппроксимации вещественного числа. В этом алгоритме поиск начинается с массива, который содержит весь ряд Фарея. Далее на каждой итерации делим массив пополам и выбираем ту его половину, внутрь которой попадает аппроксимируемое вещественное число, уменьшая размер массива в два раза. Эта процедура продолжается для выбранной половины до тех пор, пока не будет найдена необходимая аппроксимация r. Временная сложность бинарного поиска по всему ряду будет равна O(log n2) = O(2logn) = O(logn). Обозначим рассматриваемый алгоритм через Ф5.

1.3.2. Аппроксимация с помощью интерполяционного поиска. Интерполяционный поиск имитирует поиск имени в телефонной книге [10]. Например, если фамилия начинается на «В», мы откроем телефонную книгу ближе к началу, а не в середине или в конце. Как описано выше, при бинарном поиске всегда происходит сравнение со значением, находящимся в середине интервала, при этом игнорируется искомое значение. При интерполяционном поиске, с другой стороны, искомое значение учитывается.

Использование интерполяционного поиска для аппроксимации r по аналогии с поиском в телефонной книге будет строиться на следующем соображении: если, например, r = 0.235, то число r будет находиться ближе к началу построенного ряда Фарея.

В рассматриваемом алгоритме поиск по массиву, содержащему построенный заранее ряд Фарея, начинается с интервала, чей левый и правый индексы равны первому и последнему индексам массива соответственно. Пусть на текущей итерации левый и правый индексы интервала равны ii и ir соответственно. Тогда индекс i , на основе которого проводится разбиение на две части текущего интервала, вычисляется по формуле [10]

На основе этой формулы в предвычисленном массиве прогнозируется индекс дроби г, который является аппроксимацией г, по расстоянию между г и текущим значением дроби в ряде Фарея. После сравнения г с Еп[г] = а^/Ь^ мы либо прекращаем алгоритм, если г и а^/Ь^ достаточно близки (при выполнении условия \г — ^п[г]\ < 1/(2Ь^п) из Ф3), либо выбираем интервал, внутри которого находится г, продолжая процедуру интерполяционного поиска.

i = ii +

(r — Fn[ii ])(ir — ii) Fn[ir ] — Fn[ii ]

Преимущество данного метода по сравнению с бинарным состоит в уменьшении числа итераций, что влечет за собой сокращение количества запросов на чтение медленной памяти (ОЗУ), если запросы происходят часто.

В этом алгоритме количество операций зависит от равномерности распределения дробей, но в среднем сложность по времени составляет О (log log n2) = = 0(log(llogn)) = 0(loglogn) [10]. Обозначим его через Ф6.

2. Аппроксимация с помощью цепных дробей

В книге [11] подробно описаны цепные дроби и доказательства всех утверждений из этого раздела. Мы же лишь кратко рассмотрим теорию непрерывных дробей, необходимую для аппроксимации.

Простейшая цепная дробь (ЦД) (или непрерывная дробь) - это конечное или бесконечное математическое выражение вида

[ao; ai,a2,a%,... ] = ao +

1

ai +

1

a2 +

a3 + ...

Конечная ЦД записывается как [ао; а\,а2,аз,..., ат], где ai назывется элементом цепной дроби. Мы рассматриваем непрерывные дроби, у которых ао является целым числом, а все остальные элементы — натуральные числа.

Любое вещественное число представимо в виде цепной дроби, при этом рациональное число - с помощью конечной ЦД, а иррациональное число можно представить посредством бесконечной непрерывной дроби, причем единственным способом [11].

1

2.1. Разложение вещественного числа в цепную дробь. Для нахождения представления вещественного числа r цепной дробью [ao; ai,a2,a^,... ] воспользуемся следующим алгоритмом. Сначала вычислим значения ao = |_rj и ro = = r — ao . Пусть на предыдущем шаге были вычислены значения aj_i и rj_i, тогда

для нахождения значений на текущем шаге воспользуемся формулами ai = -

|_ri_i

и ri =--ai. Данный алгоритм завершается, если ri = 0, то есть цепная дробь

ri_i

конечна, так как количество элементов ai конечно. Если цепная дробь бесконечная, то процедура будет выполняться бесконечно, вследствие чего может потребоваться выход из алгоритма после определенного количества итераций.

В данном методе |_rJ означает целую часть r. Можно заметить, что ao является целой частью вещественного числа, а так как мы аппроксимируем вещественные числа внутри [0,1], то ao =0.

2.2. Подходящие дроби. Подходящая дробь порядка k (convergent) pu/qu вычисляется по следующей рекуррентной формуле: p_i = 1, q_i = 0, po = ao, qo = 1, pu = au pu_i + pu_2 , qu = au qu_i + qk_2 , k =1, l,...,n.

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

Поскольку ai, i > 0, —натуральное число, последовательности числителей {pi} и знаменателей {qi} являются возрастающими, при этом pi < qi при i > 0.

Для рационального числа p/q = [ao; ai,a2, a%,..., am], количество подходящих дробей конечно и равняется (m + 1), а вычисление m-й подходящей дроби даст само рациональное число, то есть p/q = pm/qm.

Иррациональному числу а = [ао; 0,1,0,2,0,3,... ] соответствует бесконечное число подходящих дробей, при этом последовательность < — > сходится к а. Таким

Яг ) г>о

образом, каждая следующая подходящая дробь дает лучшую аппроксимацию, чем предыдущая.

Подходящие дроби обладают тем свойством, что любая подходящая дробь Рг/Яг находится ближе к г (наилучшее приближение) среди всех дробей, знаменатель которых меньше или равен .

Каждая подходящая дробь нечетного порядка больше каждой дроби четного порядка, при этом рг/цг > г, если значение г — нечетно, и рг/цг < г, если значение г — четно [11]. Подходящие дроби четных порядков образуют возрастающую последовательность, а нечетные — убывающую. Таким образом, эти две последовательности идут справа и слева и стремятся к г.

Для соседних подходящих дробей выполняется следующее равенство: ЯкРк-1 — — РкЯк-1 = ( — 1)к при к > 0. Из него следует, что подходящие дроби являются несократимыми, что является одним из требований нашей задачи.

2.3. Промежуточные дроби. Рассмотрим при к > 2 последовательность Рк-2 Рк-2 + Рк-1 Рк-2 + 2рк-1 Рк-2 + ОкРк-1 = Рк_ Чк-2^ Як-2 + Як-1' Як-2 + 2цк-1 ' 'Чк-2 + ОкЯк-1 Як Крайними элементами этой последовательности являются подходящие дроби, а элементы между ними (если ак > 1) называются промежуточными дробями (вет1сопуе^еп1). Соседние члены этой последовательности являются близкими дробями, то есть последовательные дроби а/Ъ и с/! обладают свойством а! — Ъс = = ±1, из которого следует, что промежуточные дроби также несократимы.

Поскольку рг > 0 и цг > 0, последовательности числителей {рк-2 + грк-1}к>2 и знаменателей {цк-2 + гЦк-1}к>2 промежуточных дробей, как и у подходящих, являются возрастающими.

тт . г Рк-2 + гРк-1

Нетрудно видеть, что г-я промежуточная дробь - является ме-

Як-2 + гЦк-1

диантой (г — 1) -й промежуточной дроби и подходящей дроби ——1. Медианта

Як-1

й - й - Рк-2 двух дробей всегда находится между ними, а поскольку порядки дробей -

Як-2

Рк-2 + ОкРк-1 Рк

и - = — имеют одинаковую четность, то они находятся по одну

Як-2 + ОкЦк-1 Як

сторону от г, следовательно, и все промежуточные дроби будут находиться с той

же стороны. При этом дробь ——1 располагается по другую сторону от г, так как

Як-1

порядок данной дроби имеет другую четность.

Как было отмечено выше, если к четно, то выполняется неравенство Рк 2 <

Як-2

^ Рк-1 1Я Рк-2 Рк-2 + Рк-1 Рк-1 < -. Из свойства медианты вытекают неравенства - < - < -.

Як-1 Як-2 Як-2 + Як-1 Як-1

Продолжая вычислять медианты, получим неравенства

Рк-2 < Рк-2 + Рк-1 < Рк-2 + 2Рк-1 < < Рк-2 + ОкРк-1 = Рк < Рк-1 Як-2 Як-2 + Як-1 Як-2 + 2Цк-1 Як-2 + ОкЯк-1 Як Як-1

Таким образом, промежуточные дроби при четном к образуют возрастающую последовательность от дроби Рк-2/Як-2 к дроби Рк/Як. А поскольку дробь Рк/Як ближе к г, чем дробь Рк-2/Як-2, то последовательность промежуточных дробей приближается к г . Используя аналогичные рассуждения, можно показать, что при нечетном к последовательность промежуточных дробей убывает, приближаясь к г.

2.4. Аппроксимация с помощью вычисления подходящих и промежуточных дробей. Если дробь является наилучшим приближением, то она является либо подходящей, либо промежуточной. В п. 2.2 было установлено, что, если дробь подходящая, то она будет наилучшим приближением к г . Однако для промежуточной дроби обратное неверно, то есть если дробь является промежуточной, то из этого не следует, что она есть наилучшее приближение.

На основе приведенных соображений можно построить следующий алгоритм для аппроксимации г . Находим подходящую дробь с максимальным знаменателем, не превосходящим п. Эта дробь будет наилучшим приближением среди подходящих дробей. Промежуточная дробь может быть ближе к г , чем найденная подходящая дробь, поэтому далее, используя найденную подходящую дробь, вычисляем промежуточную дробь с максимальным знаменателем, не превосходящим п , если такая промежуточная дробь существует. В конце из полученных дробей выбираем ту дробь, которая находится ближе к числу г . Если расстояния равны, то выбираем подходящую дробь, так как ее знаменатель меньше. Если промежуточной дроби со знаменателем, не превосходящим п, не существует, то возвращаем подходящую дробь.

Пусть мы нашли подходящие дроби Рк-1/дк-1, Рк/Чк и Рк+1/Чк+1, для которых выполнено неравенство Чк < п < дк+1. Тогда вычислить промежуточную дробь с максимальным знаменателем, не превосходящим п, можно найдя максимальное 2, удовлетворяющее неравенству Чк-1 + 2Чк < п. Из этого неравенства

,( )7 | л „ . Рк-2 +ЗРк-1 находим 2 = I (п — Чк-1 )/Чк\ . Далее, подставив найденное ] в -, полу-

Чк-2 +2Чк-1

чим необходимое значение промежуточной дроби. Алгоритм 2 позволяет провести аппроксимацию с помощью цепных дробей; операция "/" возвращает вещественное число в результате деления. Как было описано в п. 2.2., строка "Рг+1/Чг+1 == г" в алгоритме 2 истинна тогда и только тогда, когда г является рациональным числом.

В [11] дана следующая оценка для подходящих дробей для точности приближения, полученного с помощью цепных дробей: \г — рк/чк \ < 1/ч1 . Оценим время выполнения алгоритма 2. Обозначим подходящую дробь с максимальным знаменателем, не превосходящим п, через рт/дт. Эта дробь вычисляется в цикле алгоритма 2. Знаменатель подходящей дроби удовлетворяет неравенству Чк > 2(к-1)/2 при к > 2. Используя это неравенство и тот факт, что знаменатель результирующей дроби не должен превосходить п, то есть дт < п, получим верхнюю оценку для количества итераций, необходимых для вычисления подходящей дроби, т < 2п +1. Нахождение промежуточной дроби в алгоритме 2 после цикла требует 0(1) операций. Таким образом, верхняя оценка сложности всего алгоритма составляет 0(1og п). Значение дп целиком и полностью зависит от величины коэффициентов аг, так как дп > апдп-1 > ■ ■ ■ > ап ■ ... ■ а1. Таким образом, количество итераций для конкретного аппроксимируемого числа г зависит от коэффициентов его разложения в цепную дробь, и чем больше значения коэффициентов, тем быстрее завершится алгоритм. Наихудший случай возникает, если при разложении некоторого г получим аг = 1 (напомним, что аг = 0 для г > 0), что соответствует золотому сечению. В этом алгоритме используется 0(1og п) бит памяти, как и в Ф1. Обозначим данный метод как Ц1.

2.5. Аппроксимация с помощью цепных дробей и предвычислением.

Можно заметить связь между вычислением дробей ряда Фарея с помощью медианты и нахождением подходящих и промежуточных дробей, особенно если установить начальную правую границу в рядах Фарея на 1/0 вместо 1/1. Тогда вычисленные медианты будут полностью совпадать либо с подходящими, либо с промежуточными дробями. Таким образом, можно сказать, что при вычислениях подходящих дробей пропускаются некоторые дроби, которые были бы вычислены

Алгоритм 2 Аппроксимация с помощью цепных дробей Pi := 1,qi := 0 // p-i и q-i

Pi+i := 0,qi+i := 1 // po и q0

x := r

while true do // Вычисляем подходящую дробь

x := 1/x ai := |_xj

if ai * qi+i + qi > n then

break // Если знаменатель след-ей подходящей дроби > n (Pi,Pi+i) := (Pi+i,ai * Pi+i + Pi) (qi, qi+i) := (qi+i, ai * qi+i + qi) if Pi+i/qi+i == r then return (Pi+i, qi+i) //в Pi+i, qi+i хранится подходящая дробь с максимальным знаменателем

j = L(n - qi)/qi+ij

if j == 0 then

return (Pi+i, qi+i)// Не существует промежуточной дроби

(p', q') = (Pi + j * Pi+i, qi + j * qi+i) // Вычисляем промежуточную дробь if \r - Pi+i/qi+i | < \r - p'/q'\ then

return (Pi+i, qi+i)

else

return (p' , q')

с помощью медианты и рядов Фарея. Следовательно, можно использовать метод, аналогичный алгоритму Ф4, то есть заранее предвычислить границы начального интервала аппроксимации, насколько это возможно.

Алгоритм предвычисления остается таким же, как и в Ф4. Но с самой аппроксимацией возникают трудности. В алгоритме 2 во время аппроксимации происходит разложение вещественного числа в цепную дробь, на каждой итерации используется значение х, вычисленное на предыдущих этапах приближения. Но значение х зависит от величины конкретного вещественного числа, поэтому алгоритм 2 нельзя будет применить для интервала вещественных чисел . Однако Хинчин в [11] описал алгоритм нахождения подходящих дробей через промежуточные без знания элементов аг цепной дроби.

Пусть мы вычислили Рк-1 /Як-1 и Рк/Як. Имеем, что (к — 1)-я и (к + 1)-я подходящие дроби лежат по одну сторону от г, а к-я - с другой. Тогда, чтобы найти

Рк-1 + гРк

Рк+1/Як+1, последовательно находим промежуточные дроби - до тех пор,

Як-1 + гЯк

пока они располагаются с той же стороны г, что и (к — 1)-я подходящая дробь. Отсюда вытекает новый способ вычисления Ок+1: необходимо найти максимальное 2, удовлетворяющее неравенствам

Рк-1 + ЗРк I < г, если к — четное, Як-1 + 3Як I > г, если к — нечетное.

Заметим, что Рк — гЯк отрицательно при четном к, так как Рк/Як < г, поэтому для нахождения 3 остается одно условие Л — гЯк) < гЯк-1 — Рк-1, выполняю-гг 7 Т/Г ■ гЯк-1 — Рк-1

щееся при любом к. Из последнего неравенства находим з = -

Рк — гЯк

Будем обращаться к этому методу как к Ц2.

Правильность результата, полученного алгоритмом Ц2, следует из того, что наилучшим приближением на каждой итерации будет одна из двух охватывающих дробей.

В Ц2 величина используемой памяти составляет О(т log n) бит, как и в Ф4.

3. Реализация алгоритмов

В этом разделе рассматриваются основные аспекты реализации на компьютере описанных выше алгоритмов. В начале статьи была поставлена математическая задача аппроксимации вещественного числа, в которой предполагалось, что это аппроксимируемое число неограничено. Однако при реализации вещественное число представляется в памяти компьютера конечным количеством бит. Например, мантисса у числа двойной точности с плавающей запятой (double) составляет 53 бита (52 бита хранятся явно). Следовательно, формат "double" позволяет хранить лишь l53 различных вещественных числа из [0,1]. При n = l27 существует l54 различных дробей, тогда из принципа Дирихле следует, что одному вещественному числу будут соответствовать несколько дробей. В связи с этим, возможно, понадобится модификация наших алгоритмов, чтобы соответствовать данному ограничению.

Алгоритм аппроксимации, использующий ряды Фарея для вычисления медианты, остается неизменным, так как если вещественное число находится внутри определенного интервала, то медианта будет обладать наименьшим знаменателем среди всех дробей из заданного интервала.

Алгоритм приближения с помощью цепных дробей, наоборот, нужно будет изменить из-за того, что, как отмечалось ранее, во время вычисления подходящих дробей пропускаются некоторые медианты. Таким образом, при реализации вычисления подходящих дробей на компьютере они не всегда являются наилучшим приближением. На основе проведенных расчетов было установлено, что ошибки в реализации, связанные с ограниченностью представления вещественного числа, при аппроксимации с помощью цепных дробей начинают проявляться при n > l23 . Для решения проблемы, вызванной ограниченным количеством бит для представления вещественного числа с помощью формата "double", используем следующий метод. Для простоты описания модифицированного алгоритма будем считать, что промежуточные дроби включают в себя подходящие дроби. Изменение алгоритма приближения с помощью цепных дробей заключается в том, что для найденного решения с помощью первоначального алгоритма необходимо затем просмотреть предыдущие промежуточные дроби. Если они находятся на таком же расстоянии или даже ближе, то принимаем их в качестве результата.

4. Результаты экспериментов

В табл. 1 приводится количество итераций различных аппроксимирующих алгоритмов в зависимости от n. При вычислении крайних дробей в рядах Фарея мы считали, что количество итераций равно 0. Обозначение Ф4п и Ц2п указывает на то, что при этом использовалось n дополнительной памяти. При использовании алгоритмов Ц1 и Ц2 для вычисления промежуточных дробей после выполнения цикла потребовалась лишь 1 итерация. Символ "—" означает, что мы не проводили расчетов, так как при этом требовалось слишком много дополнительной памяти: порядка сотен мегабайт. Во время расчетов в качестве аппроксимируемого числа r мы выбирали числа вида ls — 1, чтобы ограничить бинарную длину знаменателя s битами.

Самый интересный результат получается для алгоритма Ф4п2/з: среднее количество итераций меньше 1 (мы полагали, что аппроксимация крайних дробей выполняется за 0 итераций, так как в этом случае не происходит выполнения

Табл. 1

Среднее количество итераций аппроксимирующих алгоритмов

n Ф1 Ф2 Ф3 Ф4П Ф4„2/з Ф5 Ф6 Ц1 Ц2П Ц2п2/3

24—1 7.63 4.57 3.78 1.93 0.65 4.66 1.35 4.35 2.38 1.98

28—1 25.7 22.3 19.9 9.27 0.92 14.12 2.69 6.72 4.39 2.64

212—1 52.7 49.5 45.4 20.9 0.93 22.33 3.30 9.06 5.68 2.68

216—1 89.7 86.2 80.4 37.4 - - - 11.40 6.88 -

224—1 189 189 179 84 - - - 16 9.2 -

232—1 294 294 294 - - - - 16.65 - -

Табл. 2

Относительное время работы аппроксимирующих алгоритмов

n Ф1 Ф2 Ф3 Ф4П Ф4„2/з Ф5 Ф6 Ц1 Ц2„ Ц2п2/3

24—1 2.57 1.81 1.78 1.27 1 2.12 1.6 1.88 1.98 1.7

28—1 7.32 6.45 6.45 2.71 1 6.01 2.81 2.7 2.75 1.92

212—1 5.11 4.8 5.0 1.87 1 5.68 1.99 1.26 1.23 1.33

216—1 5.79 5.58 5.95 2.17 - - - 1.06 1 -

224—1 6.92 6.93 7.55 2.98 - - - 1.22 1 -

232—1 9.45 9.44 10.88 - - - - 1 - -

цикла). При увеличении п в 2 раза число итераций в алгоритмах Ф1 —Ф 3, Ф4п, Ф 5 увеличивается более чем в 2 раза, а для алгоритмов, основанных на цепных дробях, и Ф4п2/з - менее чем в два раза.

В табл. 2 приводится время выполнения алгоритмов. Значения в ней представлены относительно наиболее быстрого метода. При этом мы, естественно, не учитывали время, необходимое на предвычисления в Ф4-Ф6 и Ц2.

Как видно из табл. 2, Ц1 является самым быстрым среди алгоритмов, не требующих дополнительной памяти, при этом получаются результаты, близкие или даже лучшие, чем Ф4п и Ц2п с п дополнительной памятью. Среди алгоритмов с п?/3 дополнительной памятью (Ф4п2/з, Ф3, Ф4, Ц2п2/з) метод Ф4п2/3 является быстрейшим, что неудивительно, если учитывать малое количество итераций в данном алгоритме. Если сравнивать Ф5 (бинарный поиск) и Ф1, можно заметить, что хотя Ф5 требуется меньшее количество операций, но по времени получаются схожие результаты, потому что Ф5 обращается гораздо чаще к оперативной памяти. Интересный результат также получается относительно времени выполнения Ф3: оно больше чем у Ф1, начиная с некоторого п, хотя количество итераций меньше. Это является следствием того, что в Ф3 в условии быстрого выхода используется более «дорогостоящие» операции.

Литература

1. Sorenson J. Two fast GCD algorithms //J. Algorithms. - 1994. - V. 16, No 1. - P. 110144. - doi: 10.1006/jagm.1994.1006.

2. Jebelean T. A generalization of the binary GCD algorithm // Proc. 1993 Int. Symp. on Symbolic and Algebraic Computation. - N. Y.: ACM, 1993. - P. 111-116. - doi: 10.1145/164081.164102.

3. Weber K. The accelerated integer GCD algorithm // ACM Transact. Math. Software. -1995. - V. 21, No 1. - P. 111-122. - doi: 10.1145/200979.201042.

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

4. Ishmukhametov S. An approximating к-ary GCD algorithm // Lobachevskii J. Math. -2016. - V. 37, No 6 - P. 723-729. - doi: 10.1134/S1995080216060147.

5. Charrier E., Buzer L. Approximating a real number by a rational number with a limited denominator: A geometric approach // Discrete Appl. Math. - 2009. - V. 157, No 16 -P. 3473-3484. - doi: 10.1016/j.dam.2009.03.005.

6. Hardy G.H., Wright E.M. An Introduction to the Theory of Numbers. - Oxford: Oxford Univ. Press, 1975. - 433 p.

7. Vardi I. Computational Recreations in Mathematica. - Boston: Addison-Wesley, 1991. -304 p.

8. Фаддеев Д.К. Лекции по алгебре. - М.: Наука, 1984. - 416 с.

9. Routledge N. Computing Farey Series // Math. Gazette. - 2008. - V. 92, No 523. -P. 55-62. - doi: 10.1017/S002555720018252X.

10. Левитин А.В. Алгоритмы. Введение в разработку и анализ. - М.: Вильямс, 2006. -576 с.

11. Хинчин А.Я. Цепные дроби. - М.: ГИФМЛ, 1961. - 112 с.

Поступила в редакцию 07.06.18

Еникеев Разиль Радикович, ассистент кафедры системного анализа и информационных технологий

Казанский (Приволжский) федеральный университет

ул. Кремлевская, д. 18, г. Казань, 420008, Россия E-mail: renikeev@kpfu.ru

ISSN 2541-7746 (Print) ISSN 2500-2198 (Online) UCHENYE ZAPISKI KAZANSKOGO UNIVERSITETA. SERIYA FIZIKO-MATEMATICHESKIE NAUKI (Proceedings of Kazan University. Physics and Mathematics Series)

2019, vol. 161, no. 2, pp. 250-262

doi: 10.26907/2541-7746.2019.2.250-262

Real Number Approximation by a Rational Number in the Approximating k-ary Algorithm

R.R. Enikeev

Kazan Federal University, Kazan, 420008 Russia E-mail: renikeev@kpfu.ru

Received June 7, 2018 Abstract

The best approximation by the irreducible fraction with the denominator not exceeding some specified value n was investigated. The aim of this study was to find the fastest approximation algorithm that enables to accelerate the convergence of the k-ary algorithm for computing the greatest common divisor. The approximation based on Farey sequences was described; this method was considered using a quick exit condition, precomputation of the initial steps, and search in the Farey sequence built in advance. We also discussed the approximation with continued fractions and proposed an algorithm using a precomputation

and continued fractions. The time and memory complexity of these algorithms were shown; these methods were compared with respect to running time and iterations amount. It was concluded that the approximation with the help of Farey sequences and precomputation is the fastest method, but the approximation with continued fractions has no additional memory demands.

Keywords: approximating k -ary algorithm, Farey sequence, continued fractions

References

1. Sorenson J. Two fast GCD algorithms. J. Algorithms, 1994, vol. 16, no. 1, pp. 110-144. doi: 10.1006/jagm.1994.1006.

2. Jebelean T. A generalization of the binary GCD algorithm. Proc. 1993 Int. Symp. on Symbolic and Algebraic Computation. New York, ACM, 1993, pp. 111-116. doi: 10.1145/164081.164102.

3. Weber K. The accelerated integer GCD algorithm. ACM Trans. Math. Software, 1995., vol. 21, no. 1, pp. 111-122. doi: 10.1145/200979.201042.

4. Ishmukhametov S. An approximating k-ary GCD algorithm. Lobachevskii J. Math., 2016, vol. 37, no. 6, pp. 723-729. doi: 10.1134/S1995080216060147.

5. Charrier E., Buzer L. Approximating a real number by a rational number with a limited denominator: A geometric approach. Discrete Appl. Math., 2009, vol. 157, no. 16, pp. 3473-3484. doi: 10.1016/j.dam.2009.03.005.

6. Hardy G.H., Wright E.M. An Introduction to the Theory of Numbers. Oxford, Oxford Univ. Press, 1975. 433 p.

7. Vardi I. Computational Recreations in Mathematica. Boston, Addison-Wesley, 1991. 304 p.

8. Faddeev D.K. Lektsii po algebre [Lectures on Algebra]. Moscow, Nauka, 1984. 416 p. (In Russian)

9. Routledge N. Computing Farey Series. Math. Gazette, 2008, vol. 92, no. 523, pp. 55-62. doi: 10.1017/S002555720018252X.

10. Levitin A.V. Algoritmy. Vvedenie v razrabotku i analiz [Algorithms. Introduction into the Development and Analysis]. Moscow, Vil'yams, 2006. 576 p. (In Russian)

11. Khinchin A.Ya. Tsepnye drobi [Continued Fractions]. Moscow, GIFML, 1961. 112 p. (In Russian)

Для цитирования: Еникеев Р.Р. Приближение вещественного числа рациональ-/ ным в аппроксимирующем к-арном алгоритме // Учен. зап. Казан. ун-та. Сер. Физ.-\ матем. науки. - 2019. - Т. 161, кн. 2. - С. 250-262. - doi: 10.26907/2541-7746.2019.2.250262.

For citation: Enikeev R.R. Real number approximation by a rational number in the approximating к -ary algorithm. Uchenye Zapiski Kazanskogo Universiteta. Seriya \ Fiziko-Matematicheskie Nauki, 2019, vol. 161, no. 2, pp. 250-262. doi: 10.26907/25417746.2019.2.250-262. (In Russian)

i Надоели баннеры? Вы всегда можете отключить рекламу.