Aproximado do quinto perfeito


10

Começando no 1-TET, forneça temperamentos iguais que tenham uma melhor e melhor aproximação do quinto perfeito (apenas proporção 3/2). ( Sequência OEIS A060528 )

A descrição formal da sequência, copiada do OEIS:

Uma lista de temperamentos iguais (divisões iguais da oitava) cujos passos de escala mais próximos são aproximações cada vez mais próximas das proporções de dois tons de harmonia musical: o 4º perfeito, 4/3 e seu complemento, o 5º perfeito, 3/2.

Observe que, por simetria, o quarto perfeito não importa.

Digamos que sabemos que 3 está na sequência. As frequências no 3-TET são:

2^0, 2^⅓, 2^⅔

Onde 2^⅔é a aproximação logarítmica mais próxima de 3/2.

É 4 na sequência? As frequências no 4-TET são:

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

Onde 2^½é a aproximação mais próxima de 3/2. Isso não é melhor do que 2^⅔, então 4 não está na sequência.

Por método semelhante, confirmamos que 5 está na sequência e assim por diante.

Quando um número inteiro é fornecido ncomo entrada, a saída deve ser os primeiros N números da sequência em ordem. Por exemplo, quando n = 7, a saída deve ser:

1 2 3 5 7 12 29

Descrição da sequência por xnor

A constante irracional log2(3)1.5849625007211563 pode ser aproximada por uma sequência de frações racionais

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

|pqlog2(3) |

n

Regras:

  1. Não importe a sequência A060528 diretamente.
  2. O formato não importa, desde que os números sejam distinguíveis. No exemplo acima, a saída também pode ser:

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

  3. Como este é um código-golfe, o código mais curto em bytes vence.


5
Olá e bem-vindo ao Code Golf SE! Exigimos que todos os desafios sejam independentes; portanto, uma descrição aqui da sequência seria uma grande ajuda.
AdmBorkBork 24/09/19

5
Estou confuso com a descrição do OEIS. Também menciona a 4ª perfeita (relação 4/3), mas o desafio é sobre a 5ª perfeita (relação 3/2). Eu acho que também precisa ser explicado que os valores de sequência são os denominadores das aproximações racionais.
xnor

5
Gosto do desafio, mas acho as coisas adicionadas à descrição ainda confusas, sem saber muito sobre música. Por exemplo, não sei o que é 1-TET ou 4-TET e nada parece aparecer no Google. Vou tentar escrever uma explicação de como descreveria essa sequência.
xnor

3
@DannyuNDos Ah sim, o temperamento de 12 tons iguais. Esse é o meu instrumento favorito
Jo rei

2
@DannyuNDos Thanks. Portanto, a comparação é entre 1/2 e log2 (1,5), não entre 2 ^ (1/2) e 1,5. Isso deve ficar mais claro no texto
Luis Mendo

Respostas:


5

05AB1E , 19 18 bytes

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

Experimente online!

µ                      # 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

11
Resposta agradável, mas tudo o que eu estou querendo saber agora é por que o laço while tem 1 baseados em índices ..: S
Kevin Cruijssen

4

Wolfram Language (Mathematica) , 62 60 bytes

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

Experimente online!


Quanta precisão?
Dannyu NDos 25/09/19

@DannyuNDos Esta função usa valores exatos, para que os cálculos possam ser feitos com precisão arbitrária.
attinat 25/09/19

Você vence o desafio.
Dannyu NDos 25/09/19

5
@DannyuNDos por que aceitar uma resposta tão rapidamente? É também, sem dúvida, melhor não aceitar uma resposta em tudo ..
attinat

Com relação aos erros de ponto flutuante que outros idiomas estão sofrendo, eu gostaria de apresentar um método alternativo de atribuição de pontuação. Então espere.
Dannyu NDos 25/09/19


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

Experimente online!

3.1699250014423122log2(3)2 * numpy.log2(3)


11
Isso dá dois termos extras após o 665: ..., 665, (1995), (4655), 8286, ... Experimente online!
Οurous

@ Οurous Sim, isso é inevitável, mais cedo ou mais tarde, para qualquer idioma sem precisão infinita, embora eu esteja surpreso que ele tenha aparecido tão cedo com flutuadores de 32 bits, como o Python usa. Vou esperar que o escritor do desafio esclareça até que ponto as respostas precisam funcionar.
xnor

não haveria menos caracteres para usar 2 * numpy.log2(3)do que o número totalmente escrito? (Ou melhor ainda numpy.log2(9))
JDL

@JDL que exigiria este código: from numpy import*e log2(9).
Jonathan Allan

ah, é o que recebo ao assumir que o python funciona como R e você pode escrever package::functionsem carregar packageprimeiro!
JDL

2

Limpo , 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)

Experimente online!

Deve funcionar até os limites do Realtipo de precisão dupla de 64 bits.


2

MATL , 27 25 bytes

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

Experimente online!

Explicação

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.