fibonacci.htm

fibref.htm

fibonacci.zip

Последовательность Фибоначчи

 

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

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

      Суперкомпилятор благополучно разбирается, что вычисленное совпадает с имеющимся. Все умножения на 0 и на 1 упрощаются, сумма с 0 - тоже.

     Ничего, в общем-то сверхестесственного, ответ понятен и ожидаем, приятно, что ожидания исполняются.

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

     Результат суперкомпиляции.


$ENTRY Fibonacci {
 e.41 (e.102 ) (e.101 )
  , <Add (e.102 ) e.101 >:e.122
  = e.41 (e.102 ) (e.101 ) (e.122 ) ;
 }

  After elementary transformation 

$ENTRY Fibonacci {
 e.41 (e.102) (e.101) = e.41 (e.102) (e.101) (<Add (e.102) e.101>) ;
}

     Дополнение по первому курсу университета, предмет "линейная алгебра".

     Каждая последующая пара элементов последовательности Фибоначчи вычисляется через предыдущую пару путем умножения на соответствующую матрицу. В результате получается что-то похожее на геометрическую прогрессию - произвольная пара элементов выражается через первую пару

( F(k) , F(k+1) ) = ( F(0) , F(1) ) * A^k

     Для возведения матрицы в произвольную степень существуют свои способы. Это является примером применения матриц к рекуррентным последовательностям, таким способом можно выводить формулы для общих членов последовательностей. Начальные значения могут быть любыми и в любом количество, матрица может быть любого размера, т.е. последующий элемент может выражаться через три или четыре и т.д. предыдущих элементов (не обязательно сумма). Таким образом происходит разделение начальных значений рекуррентной последовательности (они в начальном векторе) и закона образования последовательности (он в матрице).

    При  пуске на счет исходной программы получается 35 шагов, в результирующей программе будем считать, что 1 шаг. Таким образом, коэффициент ускорения по шагам - 35. Ясно, что для большей матрицы А коэффициент будет еще больше.

     Почему суперкомпиляция просто примера умножения матрицы на вектор не представляет интереса, а этот пример - представляет.Причем как для суперкомпилятора рефала, так и для суперкомпилятора Явы одновременно.

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

     Более того, этот пример демонстрирует основную идею суперкомпиляции. Специализация общих методов по частным случаям. Я взял общий метод задания рекуррентных последовательностей матричным способом - отсюда получил обычную формулу суммы двух предыдущих членов.

     Фиксированная матрица в остаточной программе отсутствует.

     Возможные продолжения примера.

      1. Менять последовательность путем изменения матрицы. Например, матрицами три на три можно задать последовательность кубов натуральных чисел.

      2. В примере рассматривается суперкомпиляция вычисления одного очередного члена последовательности. Организовать дополнительный цикл вычисления заданного количества элементов.

     3. Матрица А вычисляет очередной элемент, матрица А^2 - следующий, матрица A^2000 вычислит 2000-ый элемент исходя из первых элементов. Попробовать специализировать по степеням матрицы.

     4. При специализации учитывать начальные элементы последовательности. Начальные значения - в начальном векторе, а закон образования последовательности заложен в матрице.

     5. Рассматривая обратную матрицу, мы можем продолжать последовательность влево.

     6. Имеются сходящиеся последовательности, например,

a ( k+2 ) = ( a ( k ) + a ( k+1) ) / 2

0, 1, 1/2 , 3/4 , ... сходится к 1/3 .

Что здесь можно получить суперкомпиляцией ?

     7. Наконец, так как матрицы много где применяются, то что еще можно получить идя по этой дорожке ?