В математике жадный алгоритм для египетских дробей — это жадный алгоритм , впервые описанный Фибоначчи , для преобразования рациональных чисел в египетские дроби . Египетская дробь — это представление несократимой дроби в виде суммы отдельных единичных дробей , таких как 5/6 = 1/2 + 1/3 . Как следует из названия, эти представления использовались еще в Древнем Египте , но первый опубликованный систематический метод построения таких расширений был описан в 1202 году в Liber Abaci Леонардо Пизанского (Фибоначчи). [1] Он называется жадным алгоритмом, потому что на каждом шаге алгоритм жадно выбирает наибольшую возможную единичную дробь , которая может быть использована в любом представлении оставшейся дроби.
Фибоначчи на самом деле перечисляет несколько различных методов построения представлений египетских дробей. [2] Он включает жадный метод как последнее средство для ситуаций, когда несколько более простых методов не срабатывают; см. Египетские дроби для более подробного списка этих методов. Как подробно описывает Зальцер (1948), жадный метод и его расширения для аппроксимации иррациональных чисел были повторно открыты несколько раз современными математиками, самым ранним и наиболее известным из которых был Дж. Дж. Сильвестр (1880) [3] Близкий к нему метод расширения, который производит более близкие аппроксимации на каждом шаге, позволяя некоторым единичным дробям в сумме быть отрицательными, восходит к Ламберту (1770).
Расширение, полученное этим методом для числа, называется жадным египетским расширением , расширением Сильвестра или расширением Фибоначчи–Сильвестра . Однако термин расширение Фибоначчи обычно относится не к этому методу, а к представлению целых чисел в виде сумм чисел Фибоначчи .
Алгоритм Фибоначчи расширяет дробь, которую нужно представить, многократно выполняя замену (упрощая второй член в этой замене по мере необходимости). Например: в этом расширении знаменатель 3 первой единичной дроби является результатом округления 15/7 до следующего большего целого числа, а оставшаяся дробь 2/15 является результатом упрощения −15 мод 7/15 × 3 = 6/45 . Знаменатель второй единичной дроби, 8, является результатом округления 15/2 до следующего большего целого числа, а оставшаяся дробь 1/120 это то, что осталось от 7/15 после вычитания обоих 1/3 и 1/8 .
Поскольку каждый шаг расширения уменьшает числитель оставшейся дроби, подлежащей расширению, этот метод всегда заканчивается конечным расширением; однако, по сравнению с древнеегипетскими расширениями или более современными методами, этот метод может производить расширения, которые довольно длинные, с большими знаменателями. Например, этот метод расширяет, в то время как другие методы приводят к гораздо лучшему расширению . Вагон (1991) предлагает еще более плохо себя ведущий пример, 31/311 . Жадный метод приводит к расширению с десятью членами, последний из которых имеет более 500 цифр в знаменателе; однако, 31/311 имеет гораздо более короткое нежадное представление, 1/12 + 1/63 + 1/2799 + 1/8708 .
Последовательность Сильвестра 2, 3, 7, 43, 1807, ... ( OEIS : A000058 ) можно рассматривать как сгенерированную бесконечным жадным расширением этого типа для числа 1, где на каждом шаге мы выбираем знаменатель ⌊ у/х ⌋ + 1 вместо ⌈ у/х ⌉ . Усечение этой последовательности до k членов и формирование соответствующей египетской дроби, например (для k = 4), приводит к максимально возможной недооценке 1 любой k -членной египетской дробью. [4] То есть, например, любая египетская дробь для числа в открытом интервале ( 1805/1806 , 1) требует по крайней мере пяти членов. Кертисс (1922) описывает применение этих результатов наилучшего приближения для нижней границы числа делителей совершенного числа , в то время как Стонг (1983) описывает приложения в теории групп .
Любая дробь х/у требует максимум x членов в своем жадном расширении. Мэйс (1987) и Фрейтаг и Филлипс (1999) исследуют условия, при которых жадный метод производит расширение х/у с ровно x членами; их можно описать в терминах условий конгруэнтности по y .
В более общем смысле последовательность дробей х/у которые имеют x -членные жадные расширения и которые имеют наименьший возможный знаменатель y для каждого x, есть
Stratemeyer (1930) и Salzer (1947) описывают метод нахождения точного приближения для корней многочлена, основанный на жадном методе. Их алгоритм вычисляет жадное расширение корня; на каждом шаге этого расширения он сохраняет вспомогательный многочлен, имеющий в качестве корня оставшуюся дробь для расширения. Рассмотрим в качестве примера применение этого метода для нахождения жадного расширения золотого сечения , одного из двух решений полиномиального уравнения P 0 ( x ) = x 2 − x − 1 = 0 . Алгоритм Stratemeyer и Salzer выполняет следующую последовательность шагов:
Продолжение этого процесса приближения в конечном итоге приводит к жадному расширению золотого сечения,
Длина, минимальный знаменатель и максимальный знаменатель жадного расширения для всех дробей с малыми числителями и знаменателями могут быть найдены в On-Line Encyclopedia of Integer Sequences как последовательности OEIS : A050205 , OEIS : A050206 и OEIS : A050210 , соответственно. Кроме того, жадное расширение любого иррационального числа приводит к бесконечно возрастающей последовательности целых чисел, и OEIS содержит расширения нескольких хорошо известных констант. Некоторые дополнительные записи в OEIS, хотя и не помечены как созданные жадным алгоритмом, по-видимому, относятся к тому же типу.
В общем случае, если требуется египетское дробное разложение, в котором знаменатели ограничены каким-либо образом, можно определить жадный алгоритм, в котором на каждом шаге выбирается разложение, где выбирается, среди всех возможных значений, удовлетворяющих ограничениям, как можно меньшее, такое что и такое что отличается от всех ранее выбранных знаменателей. Примерами методов, определенных таким образом, являются разложение Энгеля , в котором каждый последующий знаменатель должен быть кратным предыдущему, и нечетное жадное разложение , в котором все знаменатели ограничены нечетными числами.
Однако может быть сложно определить, всегда ли алгоритм такого типа может успешно найти конечное расширение. В частности, неизвестно, заканчивается ли нечетное жадное расширение конечным расширением для всех дробей, для которых нечетно, хотя можно найти конечные нечетные расширения для этих дробей нежадными методами.