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