Aproxima el quinto perfecto


10

Comenzando en 1-TET, proporcione temperamentos iguales que tengan una aproximación cada vez mejor del quinto perfecto (solo relación 3/2). ( Secuencia OEIS A060528 )

La descripción formal de la secuencia, copiada del OEIS:

Una lista de temperamentos iguales (divisiones iguales de la octava) cuyos pasos de escala más cercanos son aproximaciones cada vez más cercanas a las proporciones de dos tonos de armonía musical: el 4º perfecto, 4/3 y su complemento el 5º, 3/2 perfecto.

Tenga en cuenta que por simetría, el cuarto perfecto no importa.

Digamos que sabemos que 3 está en la secuencia. Las frecuencias en 3-TET son:

2^0, 2^⅓, 2^⅔

¿Dónde 2^⅔está la aproximación logarítmica más cercana de 3/2.

¿Es 4 en la secuencia? Las frecuencias en 4-TET son:

2^0, 2^¼, 2^½, 2^¾

¿Dónde 2^½está la aproximación más cercana de 3/2. Esto no es mejor que 2^⅔, entonces 4 no está en la secuencia.

Por un método similar, confirmamos que 5 está en la secuencia, y así sucesivamente.

Cuando se le da un entero ncomo entrada, la salida debe ser los primeros N números de la secuencia en orden. Por ejemplo, cuándo n = 7, la salida debería ser:

1 2 3 5 7 12 29

Descripción de la secuencia por xnor

La constante irracional se puede aproximar mediante una secuencia de fracciones racionalesIniciar sesión2⁡(3)≈1.5849625007211563…

21,32,53,85,117,1912,4629,…

Se incluye una fracción en la secuencia si es la nueva más cercana por distancia absoluta, es decir, más cerca que cualquier otra fracción con un denominador menor o igual.|pq−log2⁡(3) |

Su objetivo es generar los primeros denominadores en orden. Estas son la secuencia A060528 ( tabla ). Los numeradores (no necesarios) están dados por A254351 ( tabla )n

Reglas:

  1. No importe la secuencia A060528 directamente.
  2. El formato no importa siempre que los números sean distinguibles. En el ejemplo anterior, la salida también puede ser:

    [1,2,3,5,7,12,29]

  3. Como se trata de un código de golf, gana el código más corto en bytes.


55
¡Hola y bienvenido a Code Golf SE! Requerimos que todos los desafíos sean autónomos, por lo que una descripción aquí de la secuencia sería de gran ayuda.
— AdmBorkBork

55
Estoy confundido por la descripción de OEIS. También menciona el 4to perfecto (relación 4/3), pero el desafío se trata de los 5tos perfectos (relación 3/2). Creo que también necesita explicación de que los valores de secuencia son los denominadores de las aproximaciones racionales.
— xnor

55
Me gusta el desafío, pero encuentro que las cosas agregadas a la descripción siguen siendo confusas, sin saber mucho sobre música. Por ejemplo, no sé qué son 1-TET o 4-TET, y nada parece aparecer en Google. Intentaré escribir una explicación de cómo describiría esta secuencia.
— xnor

3
@DannyuNDos Ah sí, el temperamento igual de 12 tonos. Ese es mi instrumento favorito
— Jo King

2
@DannyuNDos Gracias. Entonces, la comparación es entre 1/2 y log2 (1.5), no entre 2 ^ (1/2) y 1.5. Eso debería aclararse en el texto
— Luis Mendo, el

Respuestas:


5

05AB1E , 19 18 bytes

µ¯ßNLN/3.²<αßDˆ›D–

Pruébalo en línea!

µ                      # repeat until counter == input
 ¯                     #  push the global array
  ß                    #  get the minimum (let's call it M)
   N                   #  1-based iteration count
    L                  #  range 1..N
     N/                #  divide each by N
       3.²             #  log2(3)
          <            #  -1
           α           #  absolute difference with each element of the range
            ß          #  get the minimum
             Dˆ        #  add a copy to the global array
               ›       #  is M strictly greater than this new minimum?
                D–     #  if true, print N
                       #  implicit: if true, add 1 to the counter

1
Buena respuesta, pero todo lo que me pregunto ahora es por qué el ciclo while tiene índices basados ​​en 1 ... S
— Kevin Cruijssen

4

Wolfram Language (Mathematica) , 62 60 bytes

Denominator@NestList[Rationalize[r=Log2@3,Abs[#-r]]&,2,#-1]&

Pruébalo en línea!


¿Cuánta precisión?
— Dannyu NDos

@DannyuNDos Esta función utiliza valores exactos, por lo que los cálculos se pueden realizar con precisión arbitraria.
— attinat

Tú ganas el desafío.
— Dannyu NDos

55
@DannyuNDos ¿por qué aceptar una respuesta tan rápido? También es posiblemente mejor no aceptar una respuesta en absoluto ...
— attinat

Con respecto a los errores de coma flotante que sufren otros idiomas, me gustaría presentar un método alternativo de asignación de puntaje. Así que aguanta.
— Dannyu NDos


2

Python 2 , 92 bytes

E=k=input()
n=0
while k:
 n+=1;e=abs((3.169925001442312*n-1)%2-1)/n
 if e<E:print n;E=e;k-=1

Pruébalo en línea!

3.1699250014423122Iniciar sesión2⁡(3)2 * numpy.log2(3)


1
Esto le da dos términos adicionales después del 665: ¡ ..., 665, (1995), (4655), 8286, ... Pruébelo en línea!
— Pesado el

@ Οurous Sí, eso es casi inevitable tarde o temprano para cualquier idioma sin precisión infinita, aunque me sorprende que apareciera tan pronto con flotantes de 32 bits como Python utiliza. Esperaré a que el escritor del desafío aclare hasta qué punto las respuestas deben funcionar.
— xnor

¿no serían menos caracteres para usar en 2 * numpy.log2(3)lugar del número completamente enunciado? (O incluso mejor numpy.log2(9))
— JDL

@JDL que requeriría este código: from numpy import*y log2(9).
— Jonathan Allan

¡Ah, eso es lo que obtengo por suponer que Python funciona como R y puedes escribir package::functionsin cargar packageprimero!
— JDL

2

Limpias , 128 111 108 bytes

import StdEnv
c=ln 3.0/ln 2.0
?d=abs(toReal(toInt(c*d))/d-c)
$i=take i(iterate(\d=until((>)(?d)o?)inc d)1.0)

Pruébalo en línea!

Debería funcionar hasta los límites del Realtipo de doble precisión de 64 bits de.


2

MATL , 27 25 bytes

1`@:@/Q3Zl-|X<hY<tdzG-}df

Pruébalo en línea!

Explicación

1       % Push 1. This initiallizes the vector of distances
  `     % Do...while
  @:    %   Range [1, 2, ..., k], where k is the iteration index, staring at 1
  @/    %   Divide by k, element-wise. Gives [1/k, 2/k, ..., 1]
  Q     %   Add 1, element-wise. Gives [(k+1/k, (k+2)/k, ..., 2]
  3Zl   %   Push log2(3)
  -|    %   Absolute difference, element-wise
  X<    %   Minimum
  h     %   Concatenate with vector of previous distances
  Y<    %   Cumulative minimum
  t     %   Duplicate
  dz    %   Consecutive differences, number of nonzeros. This tells how many
        %   times the cumulative minimum has decreased
  G-    %   Subtract input n. This is the loop condition. 0 means we are done
}       % Finally (execute on loop exit)
  d     %   Consecutive differences (of the vector of cumulative differences)
  f     %   Indices of nonzeros. This is the final result
        % End. A new iteration is executed if the top of the stack is nonzero
        % Implicit display

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.