Nueva Orden # 5: donde Fibonacci y Beatty se encuentran en Wythoff

16

Introducción (puede ser ignorado)

Poner todos los números positivos en su orden regular (1, 2, 3, ...) es un poco aburrido, ¿no? Así que aquí hay una serie de desafíos en torno a las permutaciones (reorganizaciones) de todos los números positivos. Este es el quinto desafío de esta serie (enlaces al primer , segundo , tercer y cuarto desafío).

En este desafío, nos encontraremos con la matriz de Wythoff, que es una avalancha entrelazada de secuencias de Fibonacci y secuencias de Beatty.

Los números de Fibonacci son probablemente para la mayoría de ustedes una secuencia bien conocida. Dados dos números iniciales F0 y F1 , los siguientes Fn están dados por: Fn=F(n1)+F(n2) para n>2 .

La secuencia Beatty , dado un parámetro r es: Bnr=rn para n1 . Una de las propiedades de la secuencia de Beatty es que para cada parámetro r , hay exactamente un parámetro s=r/(r1) , de modo que las secuencias de Beatty para esos parámetros están disjuntas y unidas, abarcan todos los números naturales, excluyendo 0 (p. Ej .: BrBr/(r1)=N{0}).

Ahora viene la parte alucinante: puede crear una matriz, donde cada fila es una secuencia de Fibonacci y cada columna es una secuencia de Beatty. Esta matriz es la matriz de Wythoff . La mejor parte es: ¡cada número positivo aparece exactamente una vez en esta matriz! La matriz se ve así:

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

Un elemento en la fila metro columna n se define como:

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

donde φ es la proporción áurea: φ=1+52 .

Si seguimos los anti-diagonales de esta matriz, obtenemos A035513 , que es la secuencia objetivo para este desafío (¡tenga en cuenta que esta secuencia se agrega al OEIS por el propio Neil Sloane !). Como se trata de un desafío de "secuencia pura", la tarea es generar a(n) para un n dado como entrada, donde a(n) es A035513 .

Hay diferentes estrategias que puede seguir para llegar a a(n) , lo que hace que este desafío (en mi opinión) sea realmente interesante.

Tarea

Dada una entrada entera n , salida a(n) en formato entero, donde a(n) es A035513 .

Nota: aquí se supone una indexación basada en 1; puede usar indexación basada en 0, entonces a(0)=1;a(1)=2 , etc. Mencione esto en su respuesta si elige usar esto.

Casos de prueba

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

Puede ser divertido saber que el a(n) más grande para 1n32767 es a(32642)=512653048485188394162163283930413917147479973138989971=F(256)2φ+F(255).

Reglas

  • Entrada y salida son enteros
  • Su programa debe al menos admitir entradas en el rango de 1 hasta 32767). Tenga en cuenta que a(n) sube a números de 30 dígitos en este rango ...
  • La entrada no válida (0, flotantes, cadenas, valores negativos, etc.) puede generar salidas imprevistas, errores o un comportamiento (no) definido.
  • Se aplican las reglas de E / S predeterminadas .
  • Las lagunas predeterminadas están prohibidas.
  • Este es el , por lo que las respuestas más cortas en bytes ganan
en cualquier lugar
fuente
2
Entonces, ¿cuál es la referencia de New Order aquí?
Luis Mendo
2
@LuisMendo: la avalancha de secuencias de Fibonacci y Beatty, que forman la matriz de Wythoff ...
hasta el
¡Ah, me lo perdí por completo! Ahora me arrepiento ...
Luis Mendo
1
¿Una representación de coma flotante de phi (o rt (5)) y la aplicación de la recurrencia va a satisfacer el requisito de rango?
Jonathan Allan
1
Por favor, corrija el caso de prueba noveno: es 999no9999
J42161217

Respuestas:

4

Jalea , 27 24 bytes

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

Pruébalo en línea!

Enlace monádico mediante indexación basada en 1. Gracias a @JonathanAllan por una mejor manera de obtener la fila y las columnas ny guardar 3 bytes. En su forma más corta, es demasiado lento para n más grande en TIO, por lo que lo siguiente ¡ Pruébelo en línea! reduce el tamaño de la lista inicial de filas y columnas a costa de tres bytes.

Explicación

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

Tenga en cuenta que esto se basa en la descripción del código de Python en la página OEIS.

Nick Kennedy
fuente
1
...×⁹r‘ÆḞ¤Sð/guarda uno en tu versión de amalgamación ( TIO )
Jonathan Allan
6

R , 143 130 124 123 bytes

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]}

Pruébalo en línea!

T(norte,-1)=norte-1;T(norte,0 0)=norteϕ;T(norte,k)=T(norte,k-1)+T(norte,k-2)splitsksimplemente existe para evitar forzar un drop=Fargumento m[-1:-2,]para el caso n=1.

Gracias a Neil por señalar un golf de 1 byte.

R , 150 138 132 bytes

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]}

Pruébalo en línea!

T(n,k)=Fib(k+1)nϕ+Fib(k)(n1)splitsnth

Gracias a Robin Ryder por el T[2]=1truco para generar la secuencia de Fibonacci.


Ambas soluciones son altamente ineficientes, creando una nxnmatriz de (muy probablemente) doubles, ya que R promueve integer(con signo de 32 bits) doubleautomáticamente cuando se desborda, pero la segunda debería ser mucho más rápida. Tomar ncomo un bignum debería funcionar automáticamente, usando la llamada gmp::as.bigz(n), si la pérdida de precisión bajo doubles fuera preocupante, y entonces el lenguaje sería R + gmp.

Giuseppe
fuente
¿Se puede usar en (1+5^.5)/2lugar de (.5+5^.5/2)?
Neil
@Neil ... sí, puedo. ¡Gracias! Solo voy a editarlo en la parte superior a menos que pueda encontrar una manera de jugar golf en la segunda bastante más.
Giuseppe
2

Jalea , 30 bytes

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

Pruébalo en línea!
Esto es un poco lento, pero se hace una gran mejora con un prefijo deḤ½Ċ(doble, raíz cuadrada, techo) como en este conjunto de pruebas .

Jonathan Allan
fuente
2
¡tienes razón! 740496902es el resultado para999
J42161217
La combinación de la primera parte tuya y la segunda parte mía da 25 bytes . ¡No estoy seguro de cuál de nosotros debería tener la versión combinada!
Nick Kennedy
@NickKennedy - bien, ¡adelante!
Jonathan Allan
2

Carbón , 54 bytes

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

Pruébalo en línea! El enlace es a la versión detallada del código. 0 indexado. Utiliza solo aritmética de enteros, por lo que funciona para valores arbitrarios de gran tamaño. Explicación:

Nθ

Entrada q.

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

Calcule el antidiagonal restando números cada vez mayores de q, lo que termina con el número de la fila objetivo m.

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

Calcule los primeros m+1términos de A019446 , aunque solo estamos interesados ​​en el mth.

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

Calcule los primeros n+4términos de la serie generalizada de Fibonacci que comienza con [a(m), m]. Los términos de esta secuencia son los mtérminos th de A019446 , A001477 , A000201 , A003622 , A035336 ; Estas dos últimas son las dos primeras columnas de la matriz de Wythoff, por lo que esta secuencia continúa con el resto de la mfila de la matriz.

I⊟υ

Salida del término deseado.

Neil
fuente