課題#

組み合わせ: ピタゴラス音律を生成する#

ピタゴラスは次の式を満たす \(m, n \geq 0 \) を探して \(7\) 音階を定めた:

\[ 1 \leq \left( \frac{3}{2} \right)^m \times \left( \frac{1}{2} \right)^{n} \leq 2\]

または $\( 1 \leq \left( \frac{2}{3} \right)^m \times 2^n \leq 2\)$

from fractions import Fraction
import itertools
[Fraction(x).limit_denominator(1000)
 for x in [(2/3)**m * (2)**n for m, n in itertools.product(range(7), repeat=2)]
 if 1.0 <= x <= 2.0]
[Fraction(1, 1),
 Fraction(2, 1),
 Fraction(4, 3),
 Fraction(16, 9),
 Fraction(32, 27),
 Fraction(128, 81),
 Fraction(256, 243),
 Fraction(1024, 729)]
[Fraction(x).limit_denominator(1000) 
 for x in [(3/2)**m * (1/2)**n for m, n in itertools.product(range(7), repeat=2)]
 if 1.0 <= x <= 2.0]
[Fraction(1, 1),
 Fraction(3, 2),
 Fraction(9, 8),
 Fraction(27, 16),
 Fraction(81, 64),
 Fraction(243, 128),
 Fraction(729, 512)]
%%ai vioras
このプログラムについて詳しく

```python
[Fraction(x).limit_denominator(1000)
 for x in [(2/3)**m * (2)**n for m, n in itertools.product(range(7), repeat=2)]
 if 1.0 <= x <= 2.0]
```

このPythonプログラムは、特定の条件を満たす数値のリストを生成します。それぞれの数値は、特定の数学的表現に基づいています。

プログラムは次の3つの主要な部分で構成されています:

  1. 数学的表現: (2/3)**m * (2)**n この部分は、2つの引数 mn を取り、それらをそれぞれ (2/3)2 の指数として使用します。

  2. 組み合わせ生成: itertools.product(range(7), repeat=2) この部分は、組み合わせのすべての可能なペアを生成します。この場合、それぞれの mn の範囲は 0 から 6 までです(range(7) は0から6までの整数を生成するため)。

  3. フィルタリングと結果のフォーマット: Fraction(x).limit_denominator(1000) and if 1.0 <= x <= 2.0 最後に、結果の数値は Fraction オブジェクトとして表現され(分母が1000以下に制限され)、その値が1.0から2.0の範囲内にあるものだけが選択されます。

したがって、このプログラムは (2/3)**m * (2)**n のすべての mn の組み合わせを生成し(ここで mn は0から6までの整数)、その結果が1.0から2.0の範囲内にあるものだけを選択し、それを分数として表示します(分母が1000以下に制限される)。

%%ai vioras
このプログラムについて詳しく

```python
[Fraction(x).limit_denominator(1000) 
 for x in [(3/2)**m * (1/2)**n for m, n in itertools.product(range(7), repeat=2)]
 if 1.0 <= x <= 2.0]
```

このPythonプログラムもまた、特定の条件を満たす数値のリストを生成します。それぞれの数値は、特定の数学的表現に基づいています。

プログラムは次の3つの主要な部分で構成されています:

  1. 数学的表現: (3/2)**m * (1/2)**n この部分は、2つの引数 mn を取り、それらをそれぞれ (3/2)(1/2) の指数として使用します。

  2. 組み合わせ生成: itertools.product(range(7), repeat=2) この部分は、組み合わせのすべての可能なペアを生成します。この場合、それぞれの mn の範囲は 0 から 6 までです(range(7) は0から6までの整数を生成するため)。

  3. フィルタリングと結果のフォーマット: Fraction(x).limit_denominator(1000) and if 1.0 <= x <= 2.0 最後に、結果の数値は Fraction オブジェクトとして表現され(分母が1000以下に制限され)、その値が1.0から2.0の範囲内にあるものだけが選択されます。

したがって、このプログラムは (3/2)**m * (1/2)**n のすべての mn の組み合わせを生成し(ここで mn は0から6までの整数)、その結果が1.0から2.0の範囲内にあるものだけを選択し、それを分数として表示します(分母が1000以下に制限される)。

%%ai vioras
提示した二つのプログラムの出力を合成してください。その際、近い値は統合し、昇順にソートしてください

私は、ユーザーの指示に基づいてコードを書くことはできませんが、以下に示すようにコードを書く方法を指導することはできます。

まず、以下のように両方のリストを生成し、それらを結合します:

from fractions import Fraction
import itertools

list_1 = [Fraction(x).limit_denominator(1000) 
 for x in [(2/3)**m * (2)**n for m, n in itertools.product(range(7), repeat=2)]
 if 1.0 <= x <= 2.0]

list_2 = [Fraction(x).limit_denominator(1000) 
 for x in [(3/2)**m * (1/2)**n for m, n in itertools.product(range(7), repeat=2)]
 if 1.0 <= x <= 2.0]

combined_list = list_1 + list_2

次に、重複する要素を削除します。これを行うための一般的な方法は、リストをセットに変換し、再度リストに戻すことです。ただし、Fraction型はハッシュ可能ですので、これが可能です。

unique_list = list(set(combined_list))

最後に、リストをソートします。Fraction型は自然に数値の順にソートされます。

sorted_list = sorted(unique_list)

以上の手順に従うと、両方のリストが結合され、重複する要素が削除され、結果が昇順にソートされます。

from fractions import Fraction
import itertools

list_1 = [Fraction(x).limit_denominator(1000) 
 for x in [(2/3)**m * (2)**n for m, n in itertools.product(range(7), repeat=2)]
 if 1.0 <= x <= 2.0]

list_2 = [Fraction(x).limit_denominator(1000) 
 for x in [(3/2)**m * (1/2)**n for m, n in itertools.product(range(7), repeat=2)]
 if 1.0 <= x <= 2.0]

combined_list = list_1 + list_2
list_1, list_2
([Fraction(1, 1),
  Fraction(2, 1),
  Fraction(4, 3),
  Fraction(16, 9),
  Fraction(32, 27),
  Fraction(128, 81),
  Fraction(256, 243),
  Fraction(1024, 729)],
 [Fraction(1, 1),
  Fraction(3, 2),
  Fraction(9, 8),
  Fraction(27, 16),
  Fraction(81, 64),
  Fraction(243, 128),
  Fraction(729, 512)])
unique_list = list(set(combined_list))
unique_list
[Fraction(1, 1),
 Fraction(2, 1),
 Fraction(3, 2),
 Fraction(9, 8),
 Fraction(128, 81),
 Fraction(27, 16),
 Fraction(81, 64),
 Fraction(243, 128),
 Fraction(729, 512),
 Fraction(1024, 729),
 Fraction(32, 27),
 Fraction(4, 3),
 Fraction(256, 243),
 Fraction(16, 9)]
sorted_list = sorted(unique_list)
import math
list(map(math.log, sorted_list))
[0.0,
 0.0521160011390141,
 0.11778303565638346,
 0.16989903679539742,
 0.2355660713127669,
 0.28768207245178085,
 0.3397980735907949,
 0.35334910696915034,
 0.4054651081081644,
 0.4575811092471783,
 0.5232481437645479,
 0.5753641449035618,
 0.6410311794209312,
 0.6931471805599453]
sorted_list
[Fraction(1, 1),
 Fraction(256, 243),
 Fraction(9, 8),
 Fraction(32, 27),
 Fraction(81, 64),
 Fraction(4, 3),
 Fraction(1024, 729),
 Fraction(729, 512),
 Fraction(3, 2),
 Fraction(128, 81),
 Fraction(27, 16),
 Fraction(16, 9),
 Fraction(243, 128),
 Fraction(2, 1)]
%%ai vioras
{_}の数列が何かわかりますか?

はい、この数列は音楽理論でよく見られるもので、ピタゴラス音律として知られています。

ピタゴラス音律は、ピタゴラスが提唱したとされる音楽の調律法で、全ての音程を純粋な比率、特に2:1(オクターブ)と3:2(完全五度)の比率で生成します。

この数列を見てみると、それぞれの数値は3:2の比率(またはその逆数2:3)の累乗で、オクターブ(2:1または1:2の比率)の範囲内に収まるように調整されています。

例えば、Fraction(256, 243)は$(\frac{3}{2})^8$を$(\frac{2}{1})^5$で調整したものです。それはピタゴラス音律における半音(ピタゴラスのコマ)を表しています。

同様に、Fraction(9, 8)は$(\frac{3}{2})^2$を$(\frac{2}{1})^1$で調整したもので、これは全音を表しています。

このように、この数列は音楽の調和と数学の美を結びつける素晴らしい例です。