1つの抵抗をn個使って作れる抵抗値が何種類あるかを調べるプログラムを作ってみました。
以下の図のように直列は+、並列は|で表すことにします。
![](https://blogimg.goo.ne.jp/user_image/14/16/73aa7ba425e6e0e3fcc542d8e7c6a41a.png)
例えばn = 3、つまり3個のRを使うと、全部で4種類の抵抗値を作ることができます。上の図はn = 2の全通りになります。
![](https://blogimg.goo.ne.jp/user_image/31/0b/e291cd72942d41d1a417c4995595a189.png)
n = 4のときは9通りですが、一つ困ったことが出てきます。(R+R)|(R+R)はRです。この値は抵抗1個でも作れます。何種類か数えるときに、n個ないと作れない抵抗値だけ数えるかどうかを、どうするかという問題です。n = 4については4個ないと作れない抵抗値は8種類で、4個なくても作れるものまで含めると9種類ということになります。とりあえず両方について数えてみることにしました。
![](https://blogimg.goo.ne.jp/user_image/6a/a5/3c4e411285da9039cf00a7cbc18f39ac.png)
結果です。n = 1~12の抵抗値の種類。中欄がn個より少なくても実現できる抵抗値も含んだ数。右欄はn個ないと作れない抵抗値のみを数えたものになります。
n = 1~6の全リストです。n個ないと作れない抵抗値だけです。同じ抵抗値になる別の構成もありますが、そのうちの1つだけになります。また、抵抗値の昇順に並んでいます。
gooのブログは10000文字までらしいので、結果を全て張ることはできません。
プログラムはJavaで書きました。n = 12で2分くらいです。n = 13は時間がかかりそうなので試していません。
どんなプログラムかというと、逆ポーランド記法を使って可能な式のパターンを全て生成して、式を評価することで抵抗値を求めます。今まで現れていない抵抗値だったら新たに登録する、ことを式がなくなるまで繰り返しています。
図はLTSpiceで書きました。プログラムの出力はテキストのみです。
直列と並列を入れ替えると、抵抗値は逆数になります。
一応作るだけは作ってみたんですが、本当に全種類数えているのかどうか不安なところもあります。ネタ自体はオリジナルなつもりですが、たぶん誰か過去に調べてるはずと思ってググっていません。どこかに正解があったりするんでしょうか?
以下の図のように直列は+、並列は|で表すことにします。
![](https://blogimg.goo.ne.jp/user_image/14/16/73aa7ba425e6e0e3fcc542d8e7c6a41a.png)
例えばn = 3、つまり3個のRを使うと、全部で4種類の抵抗値を作ることができます。上の図はn = 2の全通りになります。
![](https://blogimg.goo.ne.jp/user_image/31/0b/e291cd72942d41d1a417c4995595a189.png)
n = 4のときは9通りですが、一つ困ったことが出てきます。(R+R)|(R+R)はRです。この値は抵抗1個でも作れます。何種類か数えるときに、n個ないと作れない抵抗値だけ数えるかどうかを、どうするかという問題です。n = 4については4個ないと作れない抵抗値は8種類で、4個なくても作れるものまで含めると9種類ということになります。とりあえず両方について数えてみることにしました。
![](https://blogimg.goo.ne.jp/user_image/6a/a5/3c4e411285da9039cf00a7cbc18f39ac.png)
結果です。n = 1~12の抵抗値の種類。中欄がn個より少なくても実現できる抵抗値も含んだ数。右欄はn個ないと作れない抵抗値のみを数えたものになります。
n 1 1 1 2 2 2 3 4 4 4 9 8 5 22 20 6 53 42 7 131 102 8 337 250 9 869 610 10 2213 1486 11 5691 3710 12 14517 9228
n = 1~6の全リストです。n個ないと作れない抵抗値だけです。同じ抵抗値になる別の構成もありますが、そのうちの1つだけになります。また、抵抗値の昇順に並んでいます。
n = 1 1 R 1 R = 1.000000R n = 2 1 R|R 1/2 R = 0.500000R 2 R+R 2 R = 2.000000R n = 3 1 R|R|R 1/3 R = 0.333333R 2 R|(R+R) 2/3 R = 0.666667R 3 R+(R|R) 3/2 (=1+1/2) R = 1.500000R 4 R+R+R 3 R = 3.000000R n = 4 1 R|R|R|R 1/4 R = 0.250000R 2 R|R|(R+R) 2/5 R = 0.400000R 3 R|(R+(R|R)) 3/5 R = 0.600000R 4 R|(R+R+R) 3/4 R = 0.750000R 5 R+(R|R|R) 4/3 (=1+1/3) R = 1.333333R 6 R+(R|(R+R)) 5/3 (=1+2/3) R = 1.666667R 7 R+R+(R|R) 5/2 (=2+1/2) R = 2.500000R 8 R+R+R+R 4 R = 4.000000R n = 5 1 R|R|R|R|R 1/5 R = 0.200000R 2 R|R|R|(R+R) 2/7 R = 0.285714R 3 R|R|(R+(R|R)) 3/8 R = 0.375000R 4 R|R|(R+R+R) 3/7 R = 0.428571R 5 R|(R+(R|R|R)) 4/7 R = 0.571429R 6 R|(R+(R|(R+R))) 5/8 R = 0.625000R 7 R|(R+R+(R|R)) 5/7 R = 0.714286R 8 R|(R+R+R+R) 4/5 R = 0.800000R 9 (R|R|R)+(R|R) 5/6 R = 0.833333R 10 (R+(R|R))|(R+R) 6/7 R = 0.857143R 11 (R|(R+R))+(R|R) 7/6 (=1+1/6) R = 1.166667R 12 (R+R+R)|(R+R) 6/5 (=1+1/5) R = 1.200000R 13 R+(R|R|R|R) 5/4 (=1+1/4) R = 1.250000R 14 R+(R|R|(R+R)) 7/5 (=1+2/5) R = 1.400000R 15 R+(R|(R+(R|R))) 8/5 (=1+3/5) R = 1.600000R 16 R+(R|(R+R+R)) 7/4 (=1+3/4) R = 1.750000R 17 R+R+(R|R|R) 7/3 (=2+1/3) R = 2.333333R 18 R+R+(R|(R+R)) 8/3 (=2+2/3) R = 2.666667R 19 R+R+R+(R|R) 7/2 (=3+1/2) R = 3.500000R 20 R+R+R+R+R 5 R = 5.000000R n = 6 1 R|R|R|R|R|R 1/6 R = 0.166667R 2 R|R|R|R|(R+R) 2/9 R = 0.222222R 3 R|R|R|(R+(R|R)) 3/11 R = 0.272727R 4 R|R|R|(R+R+R) 3/10 R = 0.300000R 5 R|R|(R+(R|R|R)) 4/11 R = 0.363636R 6 R|R|(R+(R|(R+R))) 5/13 R = 0.384615R 7 R|R|(R+R+(R|R)) 5/12 R = 0.416667R 8 R|R|(R+R+R+R) 4/9 R = 0.444444R 9 R|((R|R|R)+(R|R)) 5/11 R = 0.454545R 10 R|(R+(R|R))|(R+R) 6/13 R = 0.461538R 11 R|((R|(R+R))+(R|R)) 7/13 R = 0.538462R 12 R|(R+R+R)|(R+R) 6/11 R = 0.545455R 13 R|(R+(R|R|R|R)) 5/9 R = 0.555556R 14 R|(R+(R|R|(R+R))) 7/12 R = 0.583333R 15 R|(R+(R|(R+(R|R)))) 8/13 R = 0.615385R 16 R|(R+(R|(R+R+R))) 7/11 R = 0.636364R 17 R|(R+R+(R|R|R)) 7/10 R = 0.700000R 18 R|(R+R+(R|(R+R))) 8/11 R = 0.727273R 19 R|(R+R+R+(R|R)) 7/9 R = 0.777778R 20 (R|R|(R+R))+(R|R) 9/10 R = 0.900000R 21 (R+(R|(R+R)))|(R+R) 10/11 R = 0.909091R 22 (R|(R+(R|R)))+(R|R) 11/10 (=1+1/10) R = 1.100000R 23 (R+R+(R|R))|(R+R) 10/9 (=1+1/9) R = 1.111111R 24 R+(R|R|R|(R+R)) 9/7 (=1+2/7) R = 1.285714R 25 R+(R|R|(R+(R|R))) 11/8 (=1+3/8) R = 1.375000R 26 R+(R|R|(R+R+R)) 10/7 (=1+3/7) R = 1.428571R 27 R+(R|(R+(R|R|R))) 11/7 (=1+4/7) R = 1.571429R 28 R+(R|(R+(R|(R+R)))) 13/8 (=1+5/8) R = 1.625000R 29 R+(R|(R+R+(R|R))) 12/7 (=1+5/7) R = 1.714286R 30 R+(R|(R+R+R+R)) 9/5 (=1+4/5) R = 1.800000R 31 R+(R|R|R)+(R|R) 11/6 (=1+5/6) R = 1.833333R 32 R+((R+(R|R))|(R+R)) 13/7 (=1+6/7) R = 1.857143R 33 R+(R|(R+R))+(R|R) 13/6 (=2+1/6) R = 2.166667R 34 R+((R+R+R)|(R+R)) 11/5 (=2+1/5) R = 2.200000R 35 R+R+(R|R|R|R) 9/4 (=2+1/4) R = 2.250000R 36 R+R+(R|R|(R+R)) 12/5 (=2+2/5) R = 2.400000R 37 R+R+(R|(R+(R|R))) 13/5 (=2+3/5) R = 2.600000R 38 R+R+(R|(R+R+R)) 11/4 (=2+3/4) R = 2.750000R 39 R+R+R+(R|R|R) 10/3 (=3+1/3) R = 3.333333R 40 R+R+R+(R|(R+R)) 11/3 (=3+2/3) R = 3.666667R 41 R+R+R+R+(R|R) 9/2 (=4+1/2) R = 4.500000R 42 R+R+R+R+R+R 6 R = 6.000000R
gooのブログは10000文字までらしいので、結果を全て張ることはできません。
プログラムはJavaで書きました。n = 12で2分くらいです。n = 13は時間がかかりそうなので試していません。
どんなプログラムかというと、逆ポーランド記法を使って可能な式のパターンを全て生成して、式を評価することで抵抗値を求めます。今まで現れていない抵抗値だったら新たに登録する、ことを式がなくなるまで繰り返しています。
図はLTSpiceで書きました。プログラムの出力はテキストのみです。
直列と並列を入れ替えると、抵抗値は逆数になります。
一応作るだけは作ってみたんですが、本当に全種類数えているのかどうか不安なところもあります。ネタ自体はオリジナルなつもりですが、たぶん誰か過去に調べてるはずと思ってググっていません。どこかに正解があったりするんでしょうか?