ギアチェンジによる回転数上げ

### 限られた歯車で被駆動歯車の回転数を駆動歯車のⅹ倍にしたい。

歯車(ギア)、駆動歯車、被駆動歯車とはについては以下のhttps://le-www-live-s.legocdn.com/sc/media/files/support/mm のスクリーンショットを参考に


![gear_説明.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3171994/5239af01-50fe-72e3-7804-a643eadf3891.png)

**問題**
制約条件の下で駆動歯車が1回転したとき被駆動歯車をx回転したい。あり得るxとその時の歯車の組み合わせを全て出力せよ(答えよ)。
**制約条件**
xは1より大きい整数。
使える歯車は歯数が12、歯数が20、歯数が28、歯数が36の4種類で、それぞれ2個ある。
歯車は全て互いに噛み合うように組む。

例)　
歯数36の歯車を駆動歯車にして、被駆動歯車を歯数12のものにする。
するとx=36/12=3で駆動歯車が1回転したとき被駆動歯車は3回転する。

歯数36の歯車を2個、歯数12の歯車を2個使えば、x=(36/12)×(36/12)=9
これは36を駆動歯車にし、同軸に歯数12と歯数36の歯車をさし、それに噛んでいる歯数12の被駆動歯車の回転数が駆動歯車の9倍ということである。

### 次の画像は歯数36、歯数28、歯数12を2個で組んだ例である。
![駆動歯車 - コピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3171994/942e2a03-f04a-4d2b-4346-ff12ea156b74.png)

この問題を解く上で歯車に関する重要な性質がある。
![ギアの性質.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3171994/2895574b-4896-106e-504c-cbcd77081981.png)
※ギアBの回転数には影響はありませんが、回転方向は間に入るギアの数が偶数か奇数かで影響があります。コメントにてご指摘を頂いたので、追記しました。

要するにこの性質を数式にすると、
![ギアの性質2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3171994/a3b54d38-1f87-efaf-3736-953b4c7785bf.png)
なので、直観的に理解できる。

実際にPythonで全探索した。

```python
import itertools
gear=[36,36,28,28,20,20,12,12]
cmb={}

for z in itertools.permutations(gear,2):
    rotation = z[0]/z[1]
    if rotation.is_integer() and rotation>1:
        cmb[f'{z[0]}/{z[1]}'] = rotation
'''
8P3は約分により、8P2の回転数パターンと変わらない。    
for z in itertools.permutatinos(gear,3):
    rotation = (z[0]/z[1])*(z[1]/z[2])
    if rotation.is_integer() and rotation>1:
        cmb[f'({z[0]}/{z[1]})×({z[1]}/{z[2]})'] = rotation
'''

for z in itertools.permutations(gear,4):
    rotation = (z[0]/z[1])*(z[2]/z[3]) 
    #ギアを直列に繋いでも、得られる答えはギア2個と同じなので同軸に二つギアのパターンだけ
    if rotation.is_integer() and rotation>1:
        cmb[f'({z[0]}/{z[1]})×({z[2]}/{z[3]})'] = rotation

'''
8P5と8P4の結果は同じである。
直列に繋いだ場合は8P2と変わらない

'''
for z in itertools.permutations(gear,6):
    #2つの軸に2つずつギアをいれるパターン以外は約分によって上のパターンと同じになる。
    rotation = (z[0]/z[1])*(z[2]/z[3])*(z[4]/z[5])
    if rotation.is_integer() and rotation>1:
        cmb[f'({z[0]}/{z[1]})×({z[2]}/{z[3]})×({z[4]}/{z[5]})'] = rotation

'''
2つギアをつけれる軸は2個なので、8P6と変わらない
'''

for z in itertools.permutations(gear,8):
    #2つギアを付けられる軸が3個
    rotation = (z[0]/z[1])*(z[2]/z[3])*(z[4]/z[5])*(z[6]/z[7])
    if rotation.is_integer() and rotation>1:
        cmb[f'({z[0]}/{z[1]})×({z[2]}/{z[3]})×({z[4]}/{z[5]})×({z[6]}/{z[7]})'] = rotation


cmb
```

**出力結果**

```python
{'36/12': 3.0,
 '(36/20)×(20/12)': 3.0,
 '(36/12)×(36/12)': 9.0,
 '(36/12)×(28/28)': 3.0,
 '(36/12)×(28/12)': 7.0,
 '(36/12)×(20/20)': 3.0,
 '(36/12)×(20/12)': 5.0,
 '(28/28)×(36/12)': 3.0,
 '(28/12)×(36/12)': 7.0,
 '(20/20)×(36/12)': 3.0,
 '(20/12)×(36/20)': 3.0,
 '(20/12)×(36/12)': 5.0,
 '(36/28)×(28/20)×(20/12)': 3.0,
 '(36/20)×(28/28)×(20/12)': 3.0,
 '(36/20)×(28/12)×(20/28)': 3.0,
 '(36/20)×(20/12)×(36/12)': 9.0,
 '(36/20)×(20/12)×(28/28)': 3.0,
 '(36/20)×(20/12)×(28/12)': 7.0,
 '(36/12)×(36/12)×(28/28)': 9.0,
 '(36/12)×(36/12)×(20/20)': 9.0,
 '(36/12)×(28/28)×(36/12)': 9.0,
 '(36/12)×(28/28)×(20/20)': 3.0,
 '(36/12)×(28/28)×(20/12)': 5.0,
 '(36/12)×(28/12)×(36/28)': 9.0,
 '(36/12)×(28/12)×(20/28)': 5.0,
 '(36/12)×(28/12)×(20/20)': 7.0,
 '(36/12)×(20/28)×(28/12)': 5.0,
 '(36/12)×(20/20)×(36/12)': 9.0,
 '(36/12)×(20/20)×(28/28)': 3.0,
 '(36/12)×(20/20)×(28/12)': 7.0,
 '(36/12)×(20/12)×(36/20)': 9.0,
 '(36/12)×(20/12)×(28/28)': 5.0,
 '(36/12)×(20/12)×(28/20)': 7.0,
 '(28/28)×(36/20)×(20/12)': 3.0,
 '(28/28)×(36/12)×(36/12)': 9.0,
 '(28/28)×(36/12)×(20/20)': 3.0,
 '(28/28)×(36/12)×(20/12)': 5.0,
 '(28/28)×(20/20)×(36/12)': 3.0,
 '(28/28)×(20/12)×(36/20)': 3.0,
 '(28/28)×(20/12)×(36/12)': 5.0,
 '(28/20)×(36/28)×(20/12)': 3.0,
 '(28/20)×(20/28)×(36/12)': 3.0,
 '(28/20)×(20/12)×(36/12)': 7.0,
 '(28/12)×(36/20)×(20/28)': 3.0,
 '(28/12)×(36/12)×(36/28)': 9.0,
 '(28/12)×(36/12)×(20/28)': 5.0,
 '(28/12)×(36/12)×(20/20)': 7.0,
 '(28/12)×(20/28)×(36/20)': 3.0,
 '(28/12)×(20/28)×(36/12)': 5.0,
 '(28/12)×(20/20)×(36/12)': 7.0,
 '(20/28)×(36/12)×(28/12)': 5.0,
 '(20/28)×(28/20)×(36/12)': 3.0,
 '(20/28)×(28/12)×(36/20)': 3.0,
 '(20/28)×(28/12)×(36/12)': 5.0,
 '(20/20)×(36/12)×(36/12)': 9.0,
 '(20/20)×(36/12)×(28/28)': 3.0,
 '(20/20)×(36/12)×(28/12)': 7.0,
 '(20/20)×(28/28)×(36/12)': 3.0,
 '(20/20)×(28/12)×(36/12)': 7.0,
 '(20/12)×(36/20)×(36/12)': 9.0,
 '(20/12)×(36/20)×(28/28)': 3.0,
 '(20/12)×(36/20)×(28/12)': 7.0,
 '(20/12)×(36/12)×(36/20)': 9.0,
 '(20/12)×(36/12)×(28/28)': 5.0,
 '(20/12)×(36/12)×(28/20)': 7.0,
 '(20/12)×(28/28)×(36/20)': 3.0,
 '(20/12)×(28/28)×(36/12)': 5.0,
 '(20/12)×(28/20)×(36/12)': 7.0,
 '(36/28)×(28/20)×(20/12)×(36/12)': 9.0,
 '(36/20)×(28/28)×(20/12)×(36/12)': 9.0,
 '(36/20)×(28/12)×(20/28)×(36/12)': 9.0,
 '(36/20)×(20/12)×(36/12)×(28/28)': 9.0,
 '(36/20)×(20/12)×(28/28)×(36/12)': 9.0,
 '(36/20)×(20/12)×(28/12)×(36/28)': 9.0,
 '(36/12)×(36/12)×(28/28)×(20/20)': 9.0,
 '(36/12)×(36/12)×(28/20)×(20/28)': 9.0,
 '(36/12)×(36/12)×(20/28)×(28/20)': 9.0,
 '(36/12)×(36/12)×(20/20)×(28/28)': 9.0,
 '(36/12)×(28/28)×(36/12)×(20/20)': 9.0,
 '(36/12)×(28/28)×(20/20)×(36/12)': 9.0,
 '(36/12)×(28/28)×(20/12)×(36/20)': 9.0,
 '(36/12)×(28/20)×(36/28)×(20/12)': 9.0,
 '(36/12)×(28/20)×(20/12)×(36/28)': 9.0,
 '(36/12)×(28/12)×(36/28)×(20/20)': 9.0,
 '(36/12)×(28/12)×(36/20)×(20/28)': 9.0,
 '(36/12)×(28/12)×(20/28)×(36/20)': 9.0,
 '(36/12)×(28/12)×(20/20)×(36/28)': 9.0,
 '(36/12)×(20/28)×(36/20)×(28/12)': 9.0,
 '(36/12)×(20/28)×(36/12)×(28/20)': 9.0,
 '(36/12)×(20/28)×(28/12)×(36/20)': 9.0,
 '(36/12)×(20/20)×(36/12)×(28/28)': 9.0,
 '(36/12)×(20/20)×(28/28)×(36/12)': 9.0,
 '(36/12)×(20/20)×(28/12)×(36/28)': 9.0,
 '(36/12)×(20/12)×(36/28)×(28/20)': 9.0,
 '(36/12)×(20/12)×(36/20)×(28/28)': 9.0,
 '(36/12)×(20/12)×(28/28)×(36/20)': 9.0,
 '(36/12)×(20/12)×(28/20)×(36/28)': 9.0,
 '(28/28)×(36/20)×(20/12)×(36/12)': 9.0,
 '(28/28)×(36/12)×(36/12)×(20/20)': 9.0,
 '(28/28)×(36/12)×(20/20)×(36/12)': 9.0,
 '(28/28)×(36/12)×(20/12)×(36/20)': 9.0,
 '(28/28)×(20/20)×(36/12)×(36/12)': 9.0,
 '(28/28)×(20/12)×(36/20)×(36/12)': 9.0,
 '(28/28)×(20/12)×(36/12)×(36/20)': 9.0,
 '(28/20)×(36/28)×(20/12)×(36/12)': 9.0,
 '(28/20)×(36/12)×(36/28)×(20/12)': 9.0,
 '(28/20)×(36/12)×(20/12)×(36/28)': 9.0,
 '(28/20)×(20/28)×(36/12)×(36/12)': 9.0,
 '(28/20)×(20/12)×(36/12)×(36/28)': 9.0,
 '(28/12)×(36/20)×(20/28)×(36/12)': 9.0,
 '(28/12)×(36/12)×(36/28)×(20/20)': 9.0,
 '(28/12)×(36/12)×(36/20)×(20/28)': 9.0,
 '(28/12)×(36/12)×(20/28)×(36/20)': 9.0,
 '(28/12)×(36/12)×(20/20)×(36/28)': 9.0,
 '(28/12)×(20/28)×(36/20)×(36/12)': 9.0,
 '(28/12)×(20/28)×(36/12)×(36/20)': 9.0,
 '(28/12)×(20/20)×(36/12)×(36/28)': 9.0,
 '(20/28)×(36/12)×(36/20)×(28/12)': 9.0,
 '(20/28)×(36/12)×(36/12)×(28/20)': 9.0,
 '(20/28)×(36/12)×(28/12)×(36/20)': 9.0,
 '(20/28)×(28/20)×(36/12)×(36/12)': 9.0,
 '(20/28)×(28/12)×(36/20)×(36/12)': 9.0,
 '(20/28)×(28/12)×(36/12)×(36/20)': 9.0,
 '(20/20)×(36/12)×(36/12)×(28/28)': 9.0,
 '(20/20)×(36/12)×(28/28)×(36/12)': 9.0,
 '(20/20)×(36/12)×(28/12)×(36/28)': 9.0,
 '(20/20)×(28/28)×(36/12)×(36/12)': 9.0,
 '(20/20)×(28/12)×(36/12)×(36/28)': 9.0,
 '(20/12)×(36/20)×(36/12)×(28/28)': 9.0,
 '(20/12)×(36/20)×(28/28)×(36/12)': 9.0,
 '(20/12)×(36/20)×(28/12)×(36/28)': 9.0,
 '(20/12)×(36/12)×(36/28)×(28/20)': 9.0,
 '(20/12)×(36/12)×(36/20)×(28/28)': 9.0,
 '(20/12)×(36/12)×(28/28)×(36/20)': 9.0,
 '(20/12)×(36/12)×(28/20)×(36/28)': 9.0,
 '(20/12)×(28/28)×(36/20)×(36/12)': 9.0,
 '(20/12)×(28/28)×(36/12)×(36/20)': 9.0,
 '(20/12)×(28/20)×(36/12)×(36/28)': 9.0}
```
8個のギアを使い、3つの軸各々に対して2つのギアを入れる制約条件を満たすパターンは全て被駆動ギアの回転数が9倍になる結果となった。
また、xの取りうる値は3,5,7,9となる。