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,…

|pq−log2⁡(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.