===== 2.3 Свойства чисел Фибоначчи ===== ==== 1. Фибоначчи: гений средневековья ==== [[https://ru.wikipedia.org/wiki/%D0%A4%D0%B8%D0%B1%D0%BE%D0%BD%D0%B0%D1%87%D1%87%D0%B8|Леонардо Бездельник]], видимо, обладал отменным чувством самоиронии. И это отличает людей с высоким интеллектом от задавак. О его познаниях в области счётной арифметики и геометрии, говорит тот факт, что примеры из его учебника (а это 13 век) дошли до нашего времени, и вполне себе употребимы. Более того, от него дошли идеи, которые развиты сейчас не очень полно, и будущее у них впереди. Наш соотечественник [[http://www.trinitas.ru/rus/doc/avtr/00/0195-00.htm|Стахов А. П.]] (( У Стахова Алексея Петровича есть замечательная книга «Коды золотой пропорции». Настоятельно рекомендуется к прочтению.)) разработал умопомрачительную //позиционную систему счисления на иррациональном основании// (на идеях Фибоначчи). Он же предложил создавать компьютеры на //избыточной позиционной системе счисления//, которые обладают мощнейшей устойчивостью к сбоям. И это всё дело будущего. Вот такой он, этот Леонардо Боначчи из 12-го века. ==== 2. Золотая пропорция ==== В эпоху [[https://ru.wikipedia.org/wiki/%D0%92%D0%BE%D0%B7%D1%80%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5|Возрождения ]] Леонардо да Винчи создал очень известный рисунок — [[https://ru.wikipedia.org/wiki/%D0%92%D0%B8%D1%82%D1%80%D1%83%D0%B2%D0%B8%D0%B0%D0%BD%D1%81%D0%BA%D0%B8%D0%B9_%D1%87%D0%B5%D0%BB%D0%BE%D0%B2%D0%B5%D0%BA|«Витрувианский человек»]]. Рисунок на столько совершенен, что потрясает воображение. Как оказалось, чтобы создать такой совершенный рисунок, Леонардо да Винчи воспользовался подсказкой, данной ему Фибоначчи. Например, отношение длины всего тела, к той части, что от пупка до пяток — ''1,6180339887''. А если взять длину части тела от пупка до пяток и сравнить с длиной от пупка до макушки — ''1,6180339887''...??? А если взять длину всей кисти к длине ладони — ''1,6180339887''!!! А если соотнести длину ладони к длине пальцев получится... ''1,6180339887''!!!! И это число преследует человека повсюду. Вот так Леонардо, с помощью математики создал свой шедевр. Мы тоже попробуем сейчас найти это число так точно, на сколько оно того заслуживает. ==== 3. Задача о золотом сечении ==== Чтобы точно вычислить значение золотого сечения, нам необходимо знать, как создать непредельный ряд с основанием "1" ((Непредельный ряд с основанием «1» хорошо известен из задачи Фибоначчи «О кроликах», предельный ряд с основанием «0» известен всем программистам — это классический двоичный ряд «0 1 2 4 8 16 32…». Мало кто знает, что таких рядов множество, и чем выше индекс непредельного ряда — тем больше избыточность такой позиционной системы счисления. И тем более она помехоустойчива. Всем известно, что чем сложнее система — тем выше вероятность отказа. С непредельными позиционными системами счисления — всё с точностью наоборот: чем крупнее система, тем выше надёжность. Это очень необычное свойство. )). В целом, этот метод известен. Достаточно взять сумму двух предыдущих членов ряда, чтобы получить третий. А вот чтобы найти саму золотую пропорцию — необходимо разделить последующий член пропорции, на предыдущий. И здесь есть интересная особенность: чем выше номера членов — тем точнее пропорция. Итак, нам потребуется три переменных. Две хранят предыдущее значение двух членов ряда Фибоначчи, одна — последующее. Также нам потребуется переменная, которая будет отвечать за счётчик цикла. И, собственно, сам цикл. Hello10.odc: MODULE TestHello10; (* это программа на языке Компонентный Паскаль. Она показывает как можно найти точную золотую пропорцию. *) IMPORT Log, Math; PROCEDURE Start*; VAR a0, a1, an: LONGINT; pr: REAL; i: INTEGER; BEGIN a0 := 0; a1 := 1; i := 1; WHILE i < 40 DO an := a0 + a1; Log.Int(i); Log.String(' * '); Log.Real(an / a1); Log.Ln; a0 := a1; a1 := an; INC(i) END; END Start; BEGIN END TestHello10. (*)TestHello10.Start В программе применён простейший метод обмена данными: вычисляется новый член ряда, находится новое значение золотой пропорции, а затем старым членам присваивается новое значение из найденного нового члена. А теперь посмотрим на вывод программы: компилируется "TestHello10" 168 0 старый модуль TestHello10 выгружен 1 * 1.0 2 * 2.0 3 * 1.5 4 * 1.666666666666667 5 * 1.6 6 * 1.625 7 * 1.615384615384615 8 * 1.619047619047619 9 * 1.617647058823529 10 * 1.618181818181818 11 * 1.617977528089888 12 * 1.618055555555556 13 * 1.618025751072961 14 * 1.618037135278515 15 * 1.618032786885246 16 * 1.618034447821682 17 * 1.618033813400125 18 * 1.618034055727554 19 * 1.618033963166706 20 * 1.618033998521803 21 * 1.618033985017358 22 * 1.618033990175597 23 * 1.618033988205325 24 * 1.618033988957902 25 * 1.618033988670443 26 * 1.618033988780243 27 * 1.618033988738303 28 * 1.618033988754322 29 * 1.618033988748204 30 * 1.618033988750541 31 * 1.618033988749648 32 * 1.618033988749989 33 * 1.618033988749859 34 * 1.618033988749909 35 * 1.61803398874989 36 * 1.618033988749897 37 * 1.618033988749894 38 * 1.618033988749895 39 * 1.618033988749895 Обратите внимание на интересную закономерность: нечётный результат — меньше золотой пропорции, чётный — больше. Следующая пара повторяет эту закономерность, но уже гораздо ближе к истинной золотой пропорции. И каждый шаг приближает вычисления к ней (( Точное значение числа золотой пропорции установить невозможно — это число иррационально (не имеет конца). С помощью классического двоичного ряда можно получить только число «2». Кроме того, ряды золотой пропорции обладают признаками //чётности// (если их представлять двоичным кодом). Такое свойство непредельных позиционных систем счисления позволяет проектировать компьютеры с автоматическим частично-гарантированным исправлением одиночных и множественных ошибок. У классического двоичного ряда — такое невозможно. Вообще. Это вообще очень большая и интересная тема. )). На шаге 38 и 39 эти числа уже равны. И здесь нет ошибки: сказывается недостаточная точность вычислений с плавающей запятой. В примере использован цикл ''WHILE'' и это не оптимальное решение. Требуется вручную контролировать переменную ''i''. В качестве самостоятельного задания, предлагается переписать этот цикл использую ''FOR''.