Approximativement le cinquième parfait


10

À partir de 1-TET, donnez des tempéraments égaux qui ont une meilleure et meilleure approximation du cinquième parfait (juste un rapport 3/2). ( Séquence OEIS A060528 )

La description officielle de la séquence, copiée de l'OEIS:

Une liste de tempéraments égaux (divisions égales de l'octave) dont les pas d'échelle les plus proches sont de plus en plus proches des rapports de deux tons d'harmonie musicale: le 4e parfait, 4/3 et son complément le 5e parfait, 3/2.

Notez que par symétrie, le quatrième parfait n'a pas d'importance.

Disons que nous savons que 3 est dans la séquence. Les fréquences en 3-TET sont:

2^0, 2^⅓, 2^⅔

2^⅔est l' approximation logarithmique la plus proche de 3/2.

Est-ce que 4 dans la séquence? Les fréquences en 4-TET sont:

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

2^½est l'approximation la plus proche de 3/2. Ce n'est pas mieux que 2^⅔, donc 4 n'est pas dans la séquence.

Par une méthode similaire, nous confirmons que 5 est dans la séquence, etc.

Lorsqu'on lui donne un entier nen entrée, la sortie doit être les premiers N nombres de la séquence dans l'ordre. Par exemple, lorsque n = 7la sortie doit être:

1 2 3 5 7 12 29

Description de la séquence par xnor

La constante irrationnelle Journal2(3)1.5849625007211563 peut être approximé par une séquence de fractions rationnelles

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

Une fraction est incluse dans la séquence s'il s'agit de la nouvelle plus proche par distance absolue |pq-Journal2(3) |, c'est-à-dire plus proche que toute autre fraction ayant un dénominateur plus petit ou égal.

Votre objectif est de sortir le premier ndénominateurs dans l'ordre. Il s'agit de la séquence A060528 ( tableau ). Les numérateurs (non requis) sont donnés par A254351 ( tableau )

Règles:

  1. N'importez pas directement la séquence A060528.
  2. Le format n'a pas d'importance tant que les chiffres peuvent être distingués. Dans l'exemple ci-dessus, la sortie peut également être:

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

  3. Comme il s'agit d'un code-golf, le code le plus court en octets l'emporte.


5
Bonjour et bienvenue sur Code Golf SE! Nous exigeons que tous les défis soient autonomes, donc une description ici de la séquence serait d'une grande aide.
AdmBorkBork

5
Je suis confus par la description d'OEIS. Il mentionne également la 4e parfaite (ratio 4/3), mais le défi concerne les quintes parfaites (ratio 3/2). Je pense qu'il faut aussi expliquer que les valeurs de séquence sont les dénominateurs des approximations rationnelles.
xnor

5
J'aime le défi, mais je trouve les choses ajoutées à la description encore confuses, ne connaissant pas grand-chose à la musique. Par exemple, je ne sais pas ce que sont les 1-TET ou 4-TET, et rien ne semble apparaître sur Google. Je vais essayer d'écrire une explication de la façon dont je décrirais cette séquence.
xnor

3
@DannyuNDos Ah oui, le tempérament égal à 12 tons. C'est mon instrument préféré
Jo King le

2
@DannyuNDos Merci. La comparaison est donc entre 1/2 et log2 (1,5), pas entre 2 ^ (1/2) et 1,5. Cela devrait être précisé dans le texte
Luis Mendo

Réponses:


5

05AB1E , 19 18 octets

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

Essayez-le en ligne!

µ                      # 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
Bonne réponse, mais tout ce que je me demande en ce moment, c'est pourquoi la boucle while a des indices basés sur 1 ..: S
Kevin Cruijssen

4

Wolfram Language (Mathematica) , 62 60 octets

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

Essayez-le en ligne!


Combien de précision?
Dannyu NDos

@DannyuNDos Cette fonction utilise des valeurs exactes, de sorte que les calculs peuvent être effectués avec une précision arbitraire.
attinat

Vous gagnez le défi.
Dannyu NDos

5
@DannyuNDos pourquoi accepter une réponse aussi rapidement? Il est également préférable de ne pas accepter une réponse du tout ..
attinat

En ce qui concerne les erreurs en virgule flottante dont souffrent d'autres langues, je voudrais présenter une méthode alternative d'attribution de score. Alors attendez.
Dannyu NDos


2

Python 2 , 92 octets

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

Essayez-le en ligne!

Utilise la constante 3.169925001442312pour2Journal2(3). Je ne savais pas combien de chiffres de précision sont nécessaires, car l'inexactitude rompra éventuellement la séquence, j'ai donc utilisé la précision flottante complète de 2 * numpy.log2(3).


1
Cela donne deux termes supplémentaires après 665: ..., 665, (1995), (4655), 8286, ... Essayez-le en ligne!
Οurous

@ Οurous Ouais, c'est à peu près inévitable tôt ou tard pour n'importe quelle langue sans précision infinie, bien que je sois surpris qu'elle apparaisse si tôt avec des flottants 32 bits que Python utilise. J'attendrai que l'auteur du défi clarifie dans quelle mesure les réponses doivent fonctionner.
xnor

ne serait-ce pas moins de caractères à utiliser 2 * numpy.log2(3)que le nombre complet? (Ou encore mieux, numpy.log2(9))
JDL

@JDL qui nécessiterait ce code: from numpy import*et log2(9).
Jonathan Allan

ah, c'est ce que j'obtiens en supposant que python fonctionne comme R et vous pouvez écrire package::functionsans charger d' packageabord!
JDL

2

Propre , 128 111 108 octets

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)

Essayez-le en ligne!

Devrait fonctionner jusqu'aux limites du Realtype double précision 64 bits de.


2

MATL , 27 25 octets

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

Essayez-le en ligne!

Explication

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.