Approssima il quinto perfetto


10

A partire da 1-TET, dai uguali temperamenti che abbiano una migliore e migliore approssimazione del quinto perfetto (solo rapporto 3/2). ( Sequenza OEIS A060528 )

La descrizione formale della sequenza, copiata dall'OEIS:

Un elenco di temperamenti uguali (pari divisioni dell'ottava) i cui gradini di scala più vicini sono approssimazioni sempre più vicine ai rapporti di due toni di armonia musicale: il perfetto 4 °, 4/3 e il suo complemento perfetto 5 °, 3/2.

Si noti che per simmetria, il quarto perfetto non ha importanza.

Diciamo che sappiamo che 3 è nella sequenza. Le frequenze in 3-TET sono:

2^0, 2^⅓, 2^⅔

Dov'è 2^⅔l' approssimazione logaritmica più vicina a 3/2.

4 è nella sequenza? Le frequenze in 4-TET sono:

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

Dov'è 2^½l'approssimazione più vicina a 3/2. Questo non è meglio di 2^⅔, quindi 4 non è nella sequenza.

Con un metodo simile, confermiamo che 5 è nella sequenza e così via.

Quando viene dato un numero intero ncome input, l'output deve essere i primi N numeri della sequenza in ordine. Ad esempio, quando n = 7, l'output dovrebbe essere:

1 2 3 5 7 12 29

Descrizione della sequenza di xnor

La costante irrazionale può essere approssimata da una sequenza di frazioni razionalilog2(3)1.5849625007211563

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

Una frazione è inclusa nella sequenza se è la nuova più vicina per distanza assoluta, cioè più vicino di qualsiasi altra frazione con un denominatore più piccolo o uguale.|pqlog2(3) |

Il tuo obiettivo è produrre i primi denominatori in ordine. Queste sono la sequenza A060528 ( tabella ). I numeratori (non richiesti) sono indicati da A254351 ( tabella )n

Regole:

  1. Non importare direttamente la sequenza A060528.
  2. Il formato non ha importanza finché i numeri sono distinguibili. Nell'esempio sopra, l'output può anche essere:

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

  3. Poiché si tratta di un codice-golf, vince il codice più breve in byte.


5
Ciao e benvenuto su Code Golf SE! Richiediamo che tutte le sfide siano autonome, quindi una descrizione qui della sequenza sarebbe di grande aiuto.
AdmBorkBork,

5
Sono confuso dalla descrizione di OEIS. Indica anche il 4 ° perfetto (rapporto 4/3), ma la sfida riguarda il 5 ° perfetto (rapporto 3/2). Penso che occorra anche spiegare che i valori della sequenza sono i denominatori delle approssimazioni razionali.
xnor

5
Mi piace la sfida, ma trovo che le cose aggiunte alla descrizione siano ancora confuse, non conoscendo molto la musica. Ad esempio, non so cosa siano 1-TET o 4-TET e nulla sembra apparire su Google. Proverò a scrivere una spiegazione di come descriverei questa sequenza.
xnor

3
@DannyuNDos Ah sì, il temperamento uguale a 12 toni. Questo è il mio strumento preferito
Jo King,

2
@DannyuNDos Grazie. Quindi il confronto è tra 1/2 e log2 (1.5), non tra 2 ^ (1/2) e 1.5. Ciò dovrebbe essere chiarito nel testo
Luis Mendo,

Risposte:


5

05AB1E , 19 18 byte

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

Provalo 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

1
Bella risposta, ma tutto ciò che mi chiedo in questo momento è perché il ciclo while ha indici basati su 1 ..: S
Kevin Cruijssen

4

Wolfram Language (Mathematica) , 62 60 byte

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

Provalo online!


Quanta precisione?
Dannyu NDos,

@DannyuNDos Questa funzione utilizza valori esatti, quindi i calcoli possono essere eseguiti con precisione arbitraria.
attinat

Hai vinto la sfida.
Dannyu NDos,

5
@DannyuNDos perché accettare una risposta così velocemente? Probabilmente è anche meglio non accettare affatto una risposta ...
attinat

Per quanto riguarda gli errori in virgola mobile che altre lingue soffrono, vorrei presentare un metodo alternativo di assegnazione del punteggio. Quindi aspetta.
Dannyu NDos,


2

Python 2 , 92 byte

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

Provalo online!

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


1
Ciò ..., 665, (1995), (4655), 8286, ... comporta
Οuroso

@ Οurous Sì, prima o poi è praticamente inevitabile per qualsiasi lingua senza una precisione infinita, anche se sono sorpreso che sia spuntato così presto con float a 32 bit come usa Python. Aspetterò che l'autore della sfida chiarisca in che misura devono funzionare le risposte.
xnor

non ci sarebbero meno personaggi da usare 2 * numpy.log2(3)piuttosto che il numero completamente spiegato? (O meglio, numpy.log2(9))
JDL

@JDL che richiederebbe questo codice: from numpy import*e log2(9).
Jonathan Allan,

ah, questo è quello che ottengo assumendo che Python funzioni come R e puoi scrivere package::functionsenza caricare packageprima!
JDL,

2

Puliti , 128 111 108 byte

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)

Provalo online!

Dovrebbe funzionare fino ai limiti del Realtipo a doppia precisione a 64 bit.


2

MATL , 27 25 byte

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

Provalo online!

Spiegazione

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.