===== 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''.