Новый порядок № 5: где Фибоначчи и Битти встречаются в Витоффе


16

Введение (может быть проигнорировано)

Размещать все положительные числа в обычном порядке (1, 2, 3, ...) немного скучно, не правда ли? Итак, вот серия проблем, связанных с перестановками (перестановками) всех положительных чисел. Это пятая задача в этой серии (ссылки на первый , второй , третий и четвертую задачу).

В этой задаче мы встретим массив Wythoff, который является переплетенной лавиной последовательностей Фибоначчи и последовательностей Битти!

Эти числа Фибоначчи , вероятно , для большинства из вас хорошо известной последовательности. Учитывая два начальных числа F0 и F1 , следующие Fn задаются как: Fn=F(n1)+F(n2) для n>2 .

Последовательность Битти , заданная параметром r : Bnr=rn для n1 . Одним из свойств последовательности Битти является то, что для каждого параметра r существует ровно один параметр s=r/(r1) , так что последовательности Битти для этих параметров не разделены и объединены, они охватывают все натуральные числа, исключая 0 (например: BrBr/(r1)=N{0}).

Теперь пришла поразительная часть: вы можете создать массив, где каждая строка представляет собой последовательность Фибоначчи, а каждый столбец - последовательность Битти. Этот массив является массивом Wythoff . Самое приятное то, что каждое положительное число появляется в этом массиве ровно один раз! Массив выглядит так:

   1    2    3    5    8   13   21   34   55   89  144 ...
   4    7   11   18   29   47   76  123  199  322  521 ...
   6   10   16   26   42   68  110  178  288  466  754 ...
   9   15   24   39   63  102  165  267  432  699 1131 ...
  12   20   32   52   84  136  220  356  576  932 1508 ...
  14   23   37   60   97  157  254  411  665 1076 1741 ...
  17   28   45   73  118  191  309  500  809 1309 2118 ...
  19   31   50   81  131  212  343  555  898 1453 2351 ...
  22   36   58   94  152  246  398  644 1042 1686 2728 ...
  25   41   66  107  173  280  453  733 1186 1919 3105 ...
  27   44   71  115  186  301  487  788 1275 2063 3338 ...
  ...

Элемент в строке m и столбце n определяется как:

Am,n={mφφ if n=1mφφ2 if n=2Am,n2+Am,n1 if n>2

где φ - золотое сечение: φ=1+52 .

Если мы будем следовать антидиагоналам этого массива, мы получим A035513 , который является целевой последовательностью для этого вызова (обратите внимание, что эта последовательность добавлена ​​в OEIS самим Нилом Слоаном !). Поскольку это задача «чистой последовательности», задача состоит в том, чтобы вывести a(n) для заданного n качестве входных данных, где a(n) равно A035513 .

Существуют различные стратегии , которые вы можете следовать , чтобы добраться до a(n) , что делает эту проблему (на мой взгляд) очень интересно.

задача

Учитывая целочисленный ввод n , выведите a(n) в целочисленном формате, где a(n) равноA035513 .

Примечание: здесь предполагается индексирование на основе 1; Вы можете использовать индексирование на основе 0, поэтому a(0)=1;a(1)=2 и т. д. Пожалуйста, укажите это в своем ответе, если вы решите использовать это.

Контрольные примеры

Input | Output
---------------
1     |  1
5     |  7
20    |  20
50    |  136
78    |  30
123   |  3194
1234  |  8212236486
3000  |  814
9999  |  108240
29890 |  637

Это может быть интересно знать , что самый большой ( п ) для 1 N 32767 является ( 32642 ) = 512653048485188394162163283930413917147479973138989971 = F ( 256 ) 2 ф + F ( 255 ) .a(n)1n32767a(32642)=512653048485188394162163283930413917147479973138989971=F(256)2φ+F(255).

правила

  • Вход и выход - целые числа
  • Ваша программа должна как минимум поддерживать ввод в диапазоне от 1 до 32767). Обратите внимание, что a(n) идет до 30 цифр в этом диапазоне ...
  • Неверный ввод (0, значения с плавающей запятой, строки, отрицательные значения и т. Д.) Может привести к непредсказуемому выводу, ошибкам или (не) определенному поведению.
  • Применяются правила ввода / вывода по умолчанию .
  • Лазейки по умолчанию запрещены.
  • Это , поэтому самые короткие ответы в байтах выигрывают

2
Итак, что здесь за ссылка на новый порядок?
Луис Мендо

2
@LuisMendo: лавина последовательностей Фибоначчи и Битти, которые образуют массив
Витоффа

Ах, я полностью пропустил это! Теперь я чувствую сожаление ...
Луис Мендо

1
Удовлетворяет ли представление с плавающей запятой phi (или rt (5)) и применение рекурренции?
Джонатан Аллан

1
Пожалуйста, исправьте 9-й контрольный пример: это 999не так9999
J42161217

Ответы:


4

Желе , 27 24 байта

p`SÞ⁸ịð’;×ØpḞ¥×⁹r‘ÆḞ¤Sð/

Попробуйте онлайн!

Монадическая ссылка с использованием индексации на основе 1. Спасибо @JonathanAllan за лучший способ получить строки и столбцы nи сохранить 3 байта. В самой короткой форме он слишком медленный для больших n на TIO, так что попробуйте следующее ! уменьшает размер исходного списка строк и столбцов за счет трех байтов.

объяснение

p`                       | Cartesian product of the range from 1..input with itself   
  SÞ                     | Sort by sum
    ⁸ị                   | Find the tuple at the position indicated by the input - this is the row and column
      ð               ð/ | Start a new dyadic chain using the row as the left and column as the right argument
       ’                 | Increase the row by 1
        ;    ¥           | Concatenate to:
         ×Øp             |   row × φ
            Ḟ            |   rounded down
              ×     ¤    | Multiply this pair by
                  ÆḞ     |   the Fibonacci numbers at positions
               ⁹         |   column index and
                r‘       |   column index plus one
                     S   | sum

Обратите внимание, что это основано на описании кода Python на странице OEIS.


1
...×⁹r‘ÆḞ¤Sð/сохраняет один в вашей объединенной версии ( TIO )
Джонатан Аллан

6

R , 143 130 124 123 байт

function(n){k=0:n+1
`~`=rbind
m=k-1~(k*(1+5^.5)/2)%/%1
for(i in k)m=m~m[i,]+m[i+1,]
m=m[-1:-2,]
m[order(row(m)+col(m))][n]}

Попробуйте онлайн!

Использует формулу T(N,-1)знак равноN-1;T(N,0)знак равноNφ;T(N,К)знак равноT(N,К-1)+T(N,К-2)построить массив (транспонированный), затем splitsмассив вдоль антидиагоналей. kпросто существует, чтобы предотвратить принуждение drop=Fаргумента в m[-1:-2,]случае n=1.

Спасибо Нейлу за то, что он указал на 1-байтовый гольф.

R , 150 138 132 байт

function(n){T[2]=1
for(j in 2:n-1)T=c(T,T[j]+T[j+1])
m=T[-1]%o%((1:n*(.5+5^.5/2))%/%1)+T[-1-n]%o%(1:n-1)
m[order(row(m)+col(m))][n]}

Попробуйте онлайн!

Реализует формулу T(N,К)знак равноFяб(К+1)Nφ+Fяб(К)(N-1)чтобы получить сгенерируйте массив, затем splitsвдоль антидиагоналей и извлеките nthэлемент.

Спасибо Робину Райдеру за T[2]=1трюк для генерации последовательности Фибоначчи.


Оба решения крайне неэффективны, создавая nxnматрицу (скорее всего) doubles, поскольку R повышает integer(32-битная подпись) doubleавтоматически при переполнении, но второе должно быть намного быстрее. Принятие nв качестве bignum должно работать автоматически, используя вызов gmp::as.bigz(n), если потеря точности при doubles вызывает беспокойство, и тогда язык будет R + gmp.


Вы можете использовать (1+5^.5)/2вместо (.5+5^.5/2)?
Нил

@ Нил ... да, я могу. Спасибо! Только собираюсь отредактировать его в топе, если я не смогу найти способ поиграть во второй, намного больше.
Джузеппе


2

Желе , 30 байт

p`SÞ⁸ịð;Øp,²;\¤×Ḟ¥/;+ƝQƊ⁹¡ị@ð/

Попробуйте онлайн!
Это немного медленно, но огромное улучшение сделано с префиксомḤ½Ċ(двойной, квадратный корень, потолок), как в этом тестовом наборе .


2
вы правы! 740496902это результат для999
J42161217

Объединение первой части моей и второй части дает 25 байтов . Не уверен, кто из нас должен иметь комбинированную версию!
Ник Кеннеди

@NickKennedy - хорошо, дерзай!
Джонатан Аллан

2

Древесный уголь , 54 байта

Nθ≔⁰ηW‹ηθ«≦⊕η≧⁻ηθ»⊞υ¹Fθ⊞υ⁻⁺³ι§υ⊖§υι⊞υθF⁺²⁻θη⊞υΣ…⮌υ²I⊟υ

Попробуйте онлайн! Ссылка на подробную версию кода. 0 индексированные. Использует только целочисленную арифметику, поэтому работает для произвольно больших значений. Объяснение:

Nθ

Вход q.

≔⁰ηW‹ηθ«≦⊕η≧⁻ηθ»

Вычислите антидиагональ путем вычитания постоянно растущих чисел, из qкоторых получается целевое число строк m.

⊞υ¹Fθ⊞υ⁻⁺³ι§υ⊖§υι

Рассчитаем первые m+1члены A019446 , хотя нас интересуют только те m.

⊞υθF⁺²⁻θη⊞υΣ…⮌υ²

Вычислите первые n+4члены обобщенного ряда Фибоначчи, который начинается с [a(m), m]. Термины этой последовательности представляют собой mтермины A019446 , A001477 , A000201 , A003622 , A035336 ; последние два являются первыми двумя столбцами массива Wythoff, и поэтому эта последовательность продолжается с остальной частью mстроки массива.

I⊟υ

Выведите нужный термин.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.