アルキメデス多面体

中学校1年のときに習ったように, 正多面体(面がただ1種類の正多角形だけからできている凸多面体)には,つぎの5種類があります.

名称 学名 面の形 面の数
正4面体 Tetrahedron 正3角形 4
立方体 Cube 正方形 6
正8面体 Octahedron 正3角形 8
正12面体 Dodecahedron 正5角形 12
正20面体 Icosahedron 正3角形 20


では,2種類以上の正多角形の面を用いて,新しい凸多面体を作ることができるでしょうか?

つぎの2つの条件を満たす凸多面体を,アルキメデス多面体と呼びます.

アルキメデス多面体の必要条件

はじめに,アルキメデス多面体を可能にするような, ひとつ頂点のまわりの正多角形の順列をすべて求めてみます.

ひとつ頂点のまわりに正 p1 角形,正 p2 角形,・・・,正 pr 角形が 並んでいるとしましょう.

これらの正多角形の内角ひとつずつの和は, 360 度未満でなければなりません. もしそうでなければ,それらの正多角形から立体化したとき,面が凸凹になるからです. そこで

180°(p1 - 2) / p1 + 180°(p2 - 2) / p2 + ・・・ + 180°(pr - 2) / pr < 360°
でなければなりません.
すなわち,
(★) 1 / p1 + 1 / p2 + ・・・ + 1 / pr > r / 2 - 1
でなければなりません.


この等式を満たすような,すべての p1, p2, ・・・,pr の可能性 を求めましょう.

この『しらみつぶし』探索は手作業でも可能ですが, 次節の載せたプログラムを用いるのも一興です.


その結果,次の組だけが可能であることがわかります.

(p1, ..., pr) 名称 学名
(3, 6, 6) 角切り4面体 Truncated Tetrahedron
(3, 8, 8) 角切り6面体 Truncated Hexahedron
(4, 6, 6) 角切り8面体 Truncated Octahedron
(3, 10, 10) 角切り12面体 Truncated Dodecahedron
(5, 6, 6) 角切り20面体 Truncated Icosahedron
(4, 6, 8) 大菱形立方8面体 Great Rhombi Cuboctahedron
(4, 6, 10) 大菱形20-12面体 Great Rhombi Icosidodecahedron
(3, 4, 3, 4) 立方8面体 Cuboctahedron
(3, 5, 3, 5) 20-12面体 Icosidodecahedron
(3, 4, 4, 4) 小菱形立方8面体 Small Rhombi Cuboctahedron/td>
(3, 4, 5, 4) 小菱形20-12面体 Small Rhomb Icosidodecahedron
(3, 3, 3, 3, 4) 歪立方体 Snub Cube
(3, 3, 3, 3, 5) 歪12面体 Snub Dedecahedron

『しらみつぶし』探索するプログラム

探索プログラムは,再帰を用いれば,容易である.
プログラミング言語は,もちろん何でも可能であるが,分数計算が主役であるから, Lisp を用いるのが自然である(たとえば C よりは).
  (defun search-local ()
    (let ((plist nil) (x0) (q))
      (dolist (r '(3 4 5 6))
        (setq x0 (1- (/ r 2)))
        (setq q (search-local-aux r x0 3))
        (setq plist (append plist q))
      )
      plist
    )
  )

  (defun search-local-aux2 (r x pmin)
    (let ((plist nil) (p1) (pmax) (x1) (qlist))
      (setq pmax (truncate r x))
      (if (< pmax pmin) (return-from search-local-aux nil))
      (if (and (= r 1) (= (* pmax x) 1))
        (return-from search-local-aux (list (list pmax))))
      (setq p1 pmin)
      (loop
        (if (> p1 pmax) (return))
        (setq x1 (- x (/ 1 p1)))
        (if (> x1 0)
          (progn
            (setq qlist (search-local-aux (1- r) x1 p1))
            (dolist (q qlist)
              (setq plist (cons (cons p1 q) plist))
            )
          )
        )
        (incf p1)
      )
      (reverse plist)
    )
  )