powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Тяпничный код Фибоначчи
51 сообщений из 51, показаны все 3 страниц
Тяпничный код Фибоначчи
    #39993507
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет котаны!

Числа фибоначчи (Ф) это такая sequence:
Код: plaintext
1,1,2,3,5,8,13....
e.t.c.

Если считать эти числа - весами разрядов в некой позиционной системе - то получаем систему наподобие двоичной.

Табличка.
NumberFiller12358131*12*13*14*115*16*117*118*19*1110*1111*1112*11113*11

Эта система обладает таким свойством. В ней нет двух подряд идущих единичек. Если
есть единички в разрядах 1 и 2 - то они немедленно суммируются и передаются в следующий разряд.

Символ "*" я ввел искусственно. Чуть ниже я объясню зачем.

Можно даже сделать механический счетчик на такой системе который будет делать инкремент
на каждое воздействие.

Задача 1

Необходимо сделать такой кодек чтоб на вход шла последовательность любых целых чисел начиная от 1 а на выходе - последовательность бит в системе Ф.

Здесь символ "*" я спокойно заменил на "1" без потерь свойства различимости этого потока.

Пример.

Input:
Код: sql
1.
1,2,3,4,12,13



Output:
Код: sql
1.
1110110011101101011000001



Здесь первые 2 символа "11" - это филлер и единичка. Тоесть число 1.
Следующее число - "101" - это число 2.

Можно output сделать в виде string и задача формально решена.
Числа могут иметь вобщем любую разрядность.

Задача 2

Сделать обратную задачу. Декодер.

С пятницей всех.
...
Рейтинг: 0 / 0
Тяпничный код Фибоначчи
    #39993532
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

ммм...
а "числа" во входном потоке это кто?

если это что-то похожее на настоящие целые "числа" фиксированной разрядности,
то вроде бы не должно быть больших проблем,
поскольку массив на фиксированное число "разрядов фибоначчи" не требует вычисления и его можно считать бессплатным...
...
Рейтинг: 0 / 0
Тяпничный код Фибоначчи
    #39993539
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот еще пример. Число побольше.

Код: plaintext
1.
1,2,3,4,12,13,5555555555, 99999999999999
...
Рейтинг: 0 / 0
Тяпничный код Фибоначчи
    #39993541
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

а вот это число или что 999999999999999‭999999999999999999‬?
о какой компьютерной математике, оперирующей "числами" идет речь?
...
Рейтинг: 0 / 0
Тяпничный код Фибоначчи
    #39993546
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Буби. С пятницей тебя. Ты чего такой сердитый?
...
Рейтинг: 0 / 0
Тяпничный код Фибоначчи
    #39993552
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Буби. С пятницей тебя. Ты чего такой сердитый?


с чего вдруг сердитый, я пятнице радусь.
я почти совершенно счастлив, а ты про числа рассказать всё не хочешь.
Тебя тоже с пятницей.
...
Рейтинг: 0 / 0
Тяпничный код Фибоначчи
    #39993553
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Твой вопрос касается ограничений?

Ограничение - int64.
...
Рейтинг: 0 / 0
Тяпничный код Фибоначчи
    #39993555
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Твой вопрос касается ограничений?

Ограничение - int64.

во, это дело.
щаз я уже весь в пятнице, но чую, не должно быть там ничего военного.
может вечером или в ночи, освободясь от пятницы...
...
Рейтинг: 0 / 0
Тяпничный код Фибоначчи
    #39993556
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну давай. Декодирование - чуть похитрее будет.
...
Рейтинг: 0 / 0
Тяпничный код Фибоначчи
    #39993558
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поправил табличку.

NumberFiller12358131*12*13*14*115*16*117*118*19*1110*1111*1112*11113*1
...
Рейтинг: 0 / 0
Тяпничный код Фибоначчи
    #39993567
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Правильно ли я понимаю, что выходом кодирования должна являться "бинарная строка" - последовательность байт,
сама по себе "числом" в смысле int64, или даже просто строка,
и оно приходит на вход "декодирования"?
...
Рейтинг: 0 / 0
Тяпничный код Фибоначчи
    #39993568
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да.
...
Рейтинг: 0 / 0
Тяпничный код Фибоначчи
    #39993588
Фотография Имя пользователя1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Ограничение - int64.

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

декодирование ещё проще - обходим наши нули-единицы, и там где 1, добавляем в копилку соответствующее разряду число Ф, беря его из массива по индексу.
...
Рейтинг: 0 / 0
Тяпничный код Фибоначчи
    #39993595
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А нужен-ли нам массив?
...
Рейтинг: 0 / 0
Тяпничный код Фибоначчи
    #39993616
Фотография Имя пользователя1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
А нужен-ли нам массив?
да в принципе нет. Для кодирования ищем число Ф, от меньшего к большему, это можно линейно делать с двумя вспомогательными переменными. Для декодирования опять же, смотрим разряды от младшего, и попутно накручиваем числа Ф, тоже двумя переменными.
...
Рейтинг: 0 / 0
Тяпничный код Фибоначчи
    #39993706
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
А нужен-ли нам массив?

(пятница меня победила, так что кодирования пока не будет)

массив позволит за логарифм от максимального кодируемого числа M найти старший разряд,
после чего спускаться линейно по кодируемуму n к младшему.
Без массива стоит вопрос - какова степень для первого фиб. числа, превышающего кодируемое.
я не знаю, как в таком случае закодировать меньше, чем за 2n по отношению к кодируемуму n

что лучше - зависит от статистики входного потока.
...
Рейтинг: 0 / 0
Тяпничный код Фибоначчи
    #39993711
...
Рейтинг: 0 / 0
Тяпничный код Фибоначчи
    #39993732
Фотография Имя пользователя1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby,

Думаю, не стоит заморачиваться на логарифмический поиск старшего разряда, потому что потом все равно придется заполнять другие разряды, и в сумме у нас всё равно будет линейное время.
...
Рейтинг: 0 / 0
Тяпничный код Фибоначчи
    #39994505
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UP. Пора подводить неутешительные итоги. Никто неосилил. И я неосилил.
...
Рейтинг: 0 / 0
Тяпничный код Фибоначчи
    #39994515
Фотография Имя пользователя1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот, за 5 минут на коленке
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
function encodeF(n) {
    var a = 1, b = 1, t, r, len = 0;
    while (b <= n) {
        t = a + b;
        a = b;
        b = t;
        len++;
    }
    r = new Array(len--);
    while(b) {
        t = b - a;
        b = a;
        a = t;
        if (b <= n) {
            r[len] = 1;
            n -= b;
        } else {
            r[len] = 0;
        }
        len--;
    }
    return r.join('');
}

function decodeF(n) {
    var a = 1, b = 1, t, sum = 0;
    for (var i = 0; i < s.length; ++i) {
        if (s[i] === '1') {
            sum += b;
            t = a + b;
            a = b;
            b = t;
        }
    }
    return sum;
}
...
Рейтинг: 0 / 0
Тяпничный код Фибоначчи
    #39994526
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имя пользователя1, шикарно.

Я протестирую чуть позже.

+Мне еще надо будет реализовать нечто вроде бинарного writer для этой системы.

И придумать как правильно закодировать хвостик. Последние несколько бит кратных WORD (int).

Или не надо кодировать?
...
Рейтинг: 0 / 0
Тяпничный код Фибоначчи
    #39994530
Фотография Имя пользователя1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
И придумать как правильно закодировать хвостик. Последние несколько бит кратных WORD (int).

Или не надо кодировать?
можешь просто дописать нулей в конец, они не повлияют
...
Рейтинг: 0 / 0
Тяпничный код Фибоначчи
    #39994538
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да пожалуй не надо. Это в криптографии всякий Padding нужны. А в нашем случае просто последний единичный бит.
...
Рейтинг: 0 / 0
Тяпничный код Фибоначчи
    #39994716
Фотография Имя пользователя1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имя пользователя1
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
function decodeF(n) {
    var a = 1, b = 1, t, sum = 0;
    for (var i = 0; i < s.length; ++i) {
        if (s[i] === '1') {
            sum += b;
            t = a + b;
            a = b;
            b = t;
        }
    }
    return sum;
}

поправка, не то забрал из консоли браузера)
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
function decodeF(s) {
    var a = 1, b = 1, t, sum = 0;
    for (var i = 0; i < s.length; ++i) {
        if (s[i] === '1') {
            sum += b;
        }
        t = a + b;
        a = b;
        b = t;
    }
    return sum;
}
...
Рейтинг: 0 / 0
Тяпничный код Фибоначчи
    #39994720
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Признак конца битового потока все таки нужен.

Иначе мы не сможем определить " пустой поток "
...
Рейтинг: 0 / 0
Тяпничный код Фибоначчи
    #39995179
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
encodeF() я перевел на Java. Думаю сегодня я покрою его тестами. И включу в состав некого компонента
который работает с файлами типа BitOutputStream.
...
Рейтинг: 0 / 0
Тяпничный код Фибоначчи
    #39995212
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хм... а как нам закодировать 0 ? Получается что никак? Или прибавлять везде +1 ?
...
Рейтинг: 0 / 0
Тяпничный код Фибоначчи
    #39995213
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здесь у меня бажок небольшой. Наверное по дороге от JS до Java я какие-то смыслы потерял.

Код: sql
1.
2.
3.
java.lang.ArrayIndexOutOfBoundsException: Index -1 out of bounds for length 1
	at mayton.compression.encoders.fibonacci.FibonacciUtils.encodeF(FibonacciUtils.java:34)
	at mayton.compression.encoders.fibonacci.FibonacciUtilsTest.test(FibonacciUtilsTest.java:12)



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
    public static String encodeF(long n) {
        int a = 1;
        int b = 1;
        int t;
        int len = 0;
        while (b <= n) {
            t = a + b;
            a = b;
            b = t;
            len++;
        }
        int[] r = new int[len];
        len--;
        while (b != 0) {
            t = b - a;
            b = a;
            a = t;
            if (b <= n) {
                r[len] = 1;
                n -= b;
            } else {
                r[len] = 0;
            }
            len--;
        }
        return Arrays.asList(r).stream().map(x -> String.valueOf(x)).collect(Collectors.joining(""));
    }



Код: java
1.
2.
3.
4.
5.
@Test
    public void test() {
        //assertEquals("", FibonacciUtils.encodeF(0)); // TODO: Hey what about zero?
        assertEquals("11", FibonacciUtils.encodeF(1));
    }
...
Рейтинг: 0 / 0
Тяпничный код Фибоначчи
    #39995224
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Декодер отлично работает

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
 @IntRange(from = 0)
    public static long decodeF(@NotNull String s) {
        long a = 1;
        long b = 1;
        long t;
        long sum = 0;
        for(int i = 0; i < s.length(); i++ ) {
            if (s.charAt(i) == '1') {
                sum += b;
            }
            t = a + b;
            a = b;
            b = t;
        }
        return sum;
    }



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
    @Test
    public void testDecoder() {
        assertEquals(1L, FibonacciUtils.decodeF("1"));
        assertEquals(2L, FibonacciUtils.decodeF("01"));
        assertEquals(3L, FibonacciUtils.decodeF("001"));
        assertEquals(4L, FibonacciUtils.decodeF("101"));
        assertEquals(5L, FibonacciUtils.decodeF("0001"));
        assertEquals(6L, FibonacciUtils.decodeF("1001"));
        assertEquals(7L, FibonacciUtils.decodeF("0101"));
        assertEquals(8L, FibonacciUtils.decodeF("00001"));
        assertEquals(9L, FibonacciUtils.decodeF("10001"));
        assertEquals(10L, FibonacciUtils.decodeF("01001"));
        assertEquals(11L, FibonacciUtils.decodeF("00101"));
        assertEquals(12L, FibonacciUtils.decodeF("10101"));
        assertEquals(13L, FibonacciUtils.decodeF("000001"));
    }
...
Рейтинг: 0 / 0
Тяпничный код Фибоначчи
    #39995228
Фотография Имя пользователя1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
цикл выполнялся чуть дольше. Сделал условие (len > 0), заодно len-- перенес, чтобы не дублировалось

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
function encodeF(n) {
    var a = 1, b = 1, t, r, len = 0;
    while (b <= n) {
        t = a + b;
        a = b;
        b = t;
        len++;
    }
    r = new Array(len);
    while(len > 0) {
        t = b - a;
        b = a;
        a = t;
        len--;
        if (b <= n) {
            r[len] = 1;
            n -= b;
        } else {
            r[len] = 0;
        }
    }
    return r.join();
}
...
Рейтинг: 0 / 0
Тяпничный код Фибоначчи
    #39995233
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

Без массива сократить время подъема можно
воспользовавшись тем, что для знакового int64
вычисление далее 106 числа (считая за первое - 1) не требуется.

Тогда -
106е - 6 356 306 993 006 846 248 183
105е - 3 928 413 764 606 871 165 730
--
69е - 117 669 030 460 994
68е - 72 723 460 248 141
--
46е - 1 836 311 903
45е - 1 134 903 170
--
13е - 233
12е - 144
--
За максимум 4 3 сравнения можно заметно сократить число шагов цикла вверх
...
Рейтинг: 0 / 0
Тяпничный код Фибоначчи
    #39995243
Фотография Имя пользователя1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С массивом, разумеется, всё проще (но полное время всё равно линейное).

А вот отдельный интересный вопрос: можно ли найти количество разрядов за логарифмическое время без массива? Как известно, за О(ln N) можно найти N-е число (алгоритм fast-doubling), а здесь обратная задача - найти наименьшее число Ф., которое превосходит N
...
Рейтинг: 0 / 0
Тяпничный код Фибоначчи
    #39995246
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имя пользователя1
С массивом, разумеется, всё проще (но полное время всё равно линейное).

А вот отдельный интересный вопрос: можно ли найти количество разрядов за логарифмическое время без массива? Как известно, за О(ln N) можно найти N-е число (алгоритм fast-doubling), а здесь обратная задача - найти наименьшее число Ф., которое превосходит N


Вообще, есть Pesano Method определения длины циклической последовательности остатков числел фибоначчи по модулю M,
но я не вижу, как его к данной задаче прикрутить...

Но может быть, примерно из оттуда, что-то и найдется руководящее...
...
Рейтинг: 0 / 0
Тяпничный код Фибоначчи
    #39995263
Фотография Имя пользователя1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby
определения длины циклической последовательности остатков числел фибоначчи по модулю M,
да, это совсем в непонятно куда)

в общем, если брать формулы из фастдаблинга

F 2k = F k * (2*F k+1 - F k )

F 2k+1 = F k+1 2 + F k 2

то мы за время ln(k) находим отрезок, на котором спрятался искомый номер числа, отрезок между номерами k+1 и 2k

разумеется, можно пойти от чисел k и k+1, но тогда время будет линейным

как бы замутить на этом отрезке деление пополам, то есть, имея на руках числа F i , F i+1 , F j , F j+1 , где, например, j > i+3, найти числа F k , F k+1 , такие что k = (i + j)/2
...
Рейтинг: 0 / 0
Тяпничный код Фибоначчи
    #39995275
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имя пользователя1,

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

Грубо говоря, надо всего лишь знать максимальную разрядность результата в фибоначчиевом представлении.
Это дает верхнюю границу степени, выше которой подниматься не надо.
Дальше логариффм от деления пополам надо умножить на логарифм вычисления n-го числа фибоначчи и ожидать квадратно-логарифмического результата...
...
Рейтинг: 0 / 0
Тяпничный код Фибоначчи
    #39995281
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby,

хотя, манипуляцией с показателями степени, вроде можно выйти на
Log(M)*Log(Log(M)) вместо Log 2 (M) ...
...
Рейтинг: 0 / 0
Тяпничный код Фибоначчи
    #39995282
Фотография Имя пользователя1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby
Грубо говоря, надо всего лишь знать максимальную разрядность результата в фибоначчиевом представлении.
Это дает верхнюю границу степени, выше которой подниматься не надо.
Дальше логариффм от деления пополам надо умножить на логарифм вычисления n-го числа фибоначчи и ожидать квадратно-логарифмического результата...
иными словам, ты просто находишь F (i+j)/2 тем же фастдаблингом?
это да, очевидный вариант с квадратом логарифма)
...
Рейтинг: 0 / 0
Тяпничный код Фибоначчи
    #39995283
Фотография Имя пользователя1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby
но в конкретном случае 64-битных числе это будет по асимпотике равным секторному старту с линейным продолжением.
Хотя, чем больше размерность, тем больше смысла в этом варианте.
абстрагируемся от размерности, просто формулы
...
Рейтинг: 0 / 0
Тяпничный код Фибоначчи
    #39995285
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имя пользователя1,

я когда-то, может года два назад (не помню точно), выкладывал Кнуто-Степанов код логарифмического нахождения n-го
числа фибоначчи путем возведения в n-ю степень порождающей матрицы (есть вариант с порождающей парой вместо матрицы)
на pl/sql в оракловой ветке сайта.

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

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

Как-то так пока думаю.
Можно тупо получать фисло фибоначчи на каждый исследуемый разряд.
Тогда просто квадрат логарифма ждем...

PS
Могу поискать ссылку на тот код, если интересно.
...
Рейтинг: 0 / 0
Тяпничный код Фибоначчи
    #39995287
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не согласен. Я ищу идеальное кодирование (компактное) целых чисел в потоке бит.
Действующее ограничение в 64 бит выбрано сознательно чтоб не уходить в оценки
пределов. Это конешно интересно для математики но у меня прикладная задача.

Я просто сам для себя решил что 64 бит - это те самые границы файла (современной
файловой системы) в рамках которой я буду кодировать offsets, length e.t.c.

Что еще я не рассмотрел но хотел бы добавить к сравнению.

BCD - арифметика. Все знают. 4 бита на десятичный символ.
Variable-Int - кажется Google protobuf ее использует.
Коды Левинштейна и им подобные.

Мне по сути надо решить что на диапазоне 64х бит компактнее и легче к кодированию.
...
Рейтинг: 0 / 0
Тяпничный код Фибоначчи
    #39995293
Фотография Имя пользователя1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

я чуть выше выложил encodeF с поправками
...
Рейтинг: 0 / 0
Тяпничный код Фибоначчи
    #39995299
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имя пользователя1
mayton,

я чуть выше выложил encodeF с поправками


Благодарю. Работает. Вот моя адаптация. Где-то я схитрил со StringBuilder. Чуть позже я уйду от строк вообще.
Или просто оставлю их как техническое демо.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
    @IntRange(from = 0)
    public static long decodeF(@NotNull String s) {
        if (s.length() == 0) {
            throw new IllegalArgumentException("Unable to decode empty string!");
        }
        // TODO: Check for maximum possible value for s
        long a = 1;
        long b = 1;
        long t;
        long sum = 0;
        char prevChar = '*';
        for(int i = 0; i < s.length(); i++ ) {
            char c = s.charAt(i);
            if (c == '1') {
                sum += b;
            } else if (c != '0') {
                throw new IllegalArgumentException("Unexpected symbol found " + Character.toString(c));
            }
            t = a + b;
            a = b;
            b = t;
            if (prevChar == '1' && c == '1') {
                throw new IllegalArgumentException("Illegal Fibonaccy notation. Impossible to have '11' sequence in " + s);
            }
            prevChar = c;
        }
        return sum;
    }

    @NotNull
    public static String encodeF(@IntRange(from = 0) long n) {
        int a = 1;
        int b = 1;
        int t;
        int len = 0;
        while (b <= n) {
              t = a + b;
              a = b;
              b = t;
              len++;
        }
        StringBuilder s = new StringBuilder();
        while(len > 0) {
              t = b - a;
              b = a;
              a = t;
              len--;
              if (b <= n) {
                  s.append("1");
                  n -= b;
              } else {
                  s.append("0");
              }
        }
        return StringUtils.reverse(s.toString());
    }
...
Рейтинг: 0 / 0
Тяпничный код Фибоначчи
    #39995311
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
код вычисления числа фибоначчи на pl/sql за логарифм, который я упоминал в своём посте лежит здесь:
https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=461297&msg=20638199
...
Рейтинг: 0 / 0
Тяпничный код Фибоначчи
    #39995314
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чорт. Некрофильский топик я поднял. Ладно. Репостну сюда.

Золотое сечение такой точности можно задать в PLSQL/number.

А как быть с double?
...
Рейтинг: 0 / 0
Тяпничный код Фибоначчи
    #39995319
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

в чем точно вопрос?
...
Рейтинг: 0 / 0
Тяпничный код Фибоначчи
    #39995322
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Wiki пишет о формуле Бине которая приближенно вычисляет n-е число Фибоначчи.
Можем-ли мы использовать эту формулу для сокращения числа итераций?
...
Рейтинг: 0 / 0
Тяпничный код Фибоначчи
    #39995328
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Wiki пишет о формуле Бине которая приближенно вычисляет n-е число Фибоначчи.
Можем-ли мы использовать эту формулу для сокращения числа итераций?

мой код под спойлером, а в ремарке перед спойлером я задаю вопрос по поводу именно вычисления на базе формулы Бине.
Автор лишь немного подкрутил прямую формулу.
Меня интересовал ход мысли, как точно человек дошел до показанного им варианта.

"быстрое" вычисление в любом случае основано на вычислении степени,
и под спойлером оно (вычисление) целиком стоит на целых числах.

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

Особенность на паре такая - вычисляется всегда два числа фибоначчи, а в качестве результата отдается одно из них.
Матричный вариант вычисляет четыре числа фибоначчи, это может быть полезно в каких-то алгоритмах.

У Степанова, в обеих книжках кажется, матричный вариант подробно разобран.
...
Рейтинг: 0 / 0
Тяпничный код Фибоначчи
    #39995329
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
этот пост создан ошибочным движение руки, случайно.
...
Рейтинг: 0 / 0
Тяпничный код Фибоначчи
    #39995330
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По поводу Степанова - спасибо. И ведь есть эта книжка.
...
Рейтинг: 0 / 0
Тяпничный код Фибоначчи
    #39995877
Фотография Имя пользователя1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Где-то я схитрил со StringBuilder. Чуть позже я уйду от строк вообще.
ты можешь в encodeF передавать второй параметр - интерфейс с методами setLength(len) и setBit(i, bit), первый вызывается когда посчитали длину, второй для каждого разряда. Будет более красиво и орхетектурно:)
...
Рейтинг: 0 / 0
Тяпничный код Фибоначчи
    #39996147
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имя пользователя1
mayton
Где-то я схитрил со StringBuilder. Чуть позже я уйду от строк вообще.
ты можешь в encodeF передавать второй параметр - интерфейс с методами setLength(len) и setBit(i, bit), первый вызывается когда посчитали длину, второй для каждого разряда. Будет более красиво и орхетектурно:)

Я щас немножко заблокирован другой задачей. Стрим из чисел Фибоначчи в любом случае надо
писать в некий бинарный bitstream который я еще не разработал. Этот bitstream должен содержать
хвостик в формате PKCS7 padding. Это мне надо впоследствии для корректного декодирования
стримов не кратных одному int. И этот битстрим будет шапкой для Фибоначчи и Левенштейна
и прочих кодов плавающей длины.
...
Рейтинг: 0 / 0
51 сообщений из 51, показаны все 3 страниц
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Тяпничный код Фибоначчи
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]