Я знаю, что этот ответ опоздал на вечеринку на 1.75 года, но, поскольку никто другой не пытался ответить на него, и я сам изучал связь между числами Фибоначчи, представлением Цекендорфа и базисом золотого сечения, я продолжу и опубликовать то, что я нашел в связанных исследованиях и мой лучший ответ на вопрос:
С сегодняшнего дня я буду ссылаться на золотое сечение как на базовую фи или финарную для краткости.
Базовое фи более тесно связано с числами Лукаса , чем числами Фибоначчи , что объясняет некоторые трудности, с которыми вы столкнулись при их непосредственном преобразовании. Но числа Лукаса связаны с числами Фибоначчи:
L[n] = F[n-1] + F[n+1]
и
5 * F(n) = (L[n-1] + L[n+1])
Числа Лукаса относятся к базовой фи следующим образом:
L[n] = phi^n + (-1/phi)^n
поэтому для каждого номера Лукаса будут установлены n-тая и -нная цифры в базовом фи.
Прямое представление числа Фибоначчи F[n]
в терминах степеней фи:
F[n] = ( phi^n - (-1/phi)^n )/sqrt(5)
(обратите внимание на знак минус вместо знака плюс)
Что переводится в двоичном виде:
F[n] = ( 10^n - (-0.1)^n )/10.1
Теперь sprt(5)
прямо представляется в phinary как 10.1, но оно только равномерно разделит число Фибоначчи, если целое число имеет коэффициент 5, потому что 5 и его кратные - единственные целые числа, которые делит sqrt(5)
. Это означает, что в базовой фи 5 не является простым, но sqrt(5)
- это (технически это примитивный простой идеал). sqrt(5)
ведет себя очень целочисленным образом. Фактически, любое число, конечно представимое в базовой фи, называется целым числом Дирихле из-за его целочисленного поведения.
Я нашел вышеупомянутые формулы на этой веб-странице , которая содержит больше информации о связи между числами Фибоначчи, числами Лукаса и phi.
Итак, вот моя попытка алгоритма. Я прошу сообщество помочь мне определить и исправить любые ошибки. Я предполагаю, что представления Zeckendorf и base phi хранятся в массиве с массивом Zeckendorf от 0 до n и массивом Phinary от -n до n, и я использую C-подобный псевдокод:
for (int n = 0; n < length(Zeckendorf); n++) {
if (Zeckendorf[n] == 1) {
Phinary[n] = 1;
/* in a real array, the negative n needs to be offset like fixed point */
Phinary[-n] = -1; /* negative phinary digits
can be converted to positive ones later
(see Golden Ratio Base article on wikipedia) */
}
}
Standardize(Phinary); /* Change -1's to 1's with 0,-1,0 -> -1,0,1
negatives will eventually cancel with their positive 1 neighbors to the left. */
/* Divide by sqrt 5 = 10.1 in phinary */
Sqrt5[-1 .. 1] = {1, 0, 1}
PhinalNumber = PhiDivide(Phinary, Sqrt5);
Методы стандартизации до минимальной формы описаны в статье в википедии для золотое сечение , и деление может быть выполнено с использованием алгоритма евклидова деления .
Еще лучшим подходом может быть использование Сбалансированной троичной системы Тау , чтобы свойство «довольно симметрично относительно радиуса» стало свойством «полностью симметрично относительно 0-й цифры» (так называемое зеркальное симметричное свойство) , Документ, описывающий его, - « троичный принцип Броусенцова, система счисления Бергмана и троичная зеркально-симметричная арифметика » Алексея Стахова.