課題#
組み合わせ: ピタゴラス音律を生成する#
ピタゴラスは次の式を満たす \(m, n \geq 0 \) を探して \(7\) 音階を定めた:
または $\( 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つの主要な部分で構成されています:
数学的表現:
(2/3)**m * (2)**n
この部分は、2つの引数m
とn
を取り、それらをそれぞれ(2/3)
と2
の指数として使用します。組み合わせ生成:
itertools.product(range(7), repeat=2)
この部分は、組み合わせのすべての可能なペアを生成します。この場合、それぞれのm
とn
の範囲は 0 から 6 までです(range(7)
は0から6までの整数を生成するため)。フィルタリングと結果のフォーマット:
Fraction(x).limit_denominator(1000)
andif 1.0 <= x <= 2.0
最後に、結果の数値はFraction
オブジェクトとして表現され(分母が1000以下に制限され)、その値が1.0から2.0の範囲内にあるものだけが選択されます。
したがって、このプログラムは (2/3)**m * (2)**n
のすべての m
と n
の組み合わせを生成し(ここで m
と n
は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つの主要な部分で構成されています:
数学的表現:
(3/2)**m * (1/2)**n
この部分は、2つの引数m
とn
を取り、それらをそれぞれ(3/2)
と(1/2)
の指数として使用します。組み合わせ生成:
itertools.product(range(7), repeat=2)
この部分は、組み合わせのすべての可能なペアを生成します。この場合、それぞれのm
とn
の範囲は 0 から 6 までです(range(7)
は0から6までの整数を生成するため)。フィルタリングと結果のフォーマット:
Fraction(x).limit_denominator(1000)
andif 1.0 <= x <= 2.0
最後に、結果の数値はFraction
オブジェクトとして表現され(分母が1000以下に制限され)、その値が1.0から2.0の範囲内にあるものだけが選択されます。
したがって、このプログラムは (3/2)**m * (1/2)**n
のすべての m
と n
の組み合わせを生成し(ここで m
と n
は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$で調整したもので、これは全音を表しています。
このように、この数列は音楽の調和と数学の美を結びつける素晴らしい例です。