オイラーの多面体定理を証明する

オイラーの多面体定理を考えてみましょう。 (もともとはグラフ理論での定理なのですが。)

オイラーの多面体定理

多面体では次の等式が成り立つ。

頂点の数 – 辺の数 + 面の数 = 2

平面上の図形においてもこの式は成り立つ。

今回はこの式が本当に正しいのか検証してみようという趣旨です。 オイラーの式は平面上で成り立つ式なので、平面上で考えます。 多面体は平面図形に置き換えられるので、 平面図形でオイラーの式が成り立てば 多面体でも成り立つことになります。

多面体を平面に投影する

多面体は平面図形に投影することができます。

左の4面体は右のように平面に投影できます。 4面体の面は4角形になったのが3つ、残る面はまわりのエリアです。 点と線で 4つの区域に分けられていますね。

証明

平面上に描かれた点と線を考えます。 線の両端が点だと考えてください。 全ての線は点を介してつながっているものとし、点以外では線がつながらないものとします。 線は曲線も含みます。

数学的帰納法で考えます。 点の数を \( V \) 、 線の数を \( E \) 、 面の数を \( F \) とします。 \( V – E + F = 2 \) を証明すればOKです。

\( E = 1 \) のとき

辺 \( E \) は 1, 面 \( F \) は 1, 点 \( V \) は 2 です。

\[ V – E + F = 2 – 1 + 1 = 2 \]

オイラーの式は成立しています。

\( E = k \in \mathbb{N} \) でオイラーの式が成り立つとき

\( E = k \) でオイラーの式が成立するときの \( E \) 、 \( V \) 、 \( F \) の値をそれぞれ \( E_k \) 、 \( V_k \) 、 \( F_k \) とすると、次の式が成り立ちます。

\[ V_k – E_k + F_k = 2 \]

ここで \( V_k \) 、 \( F_k \) の値は \( k \) によって一意に定まるものではなく、 あくまで前提とした条件での値です。

図形に線を足す場合を考えます。 線は点を介してつながっているので、新しく引く線は両端または一方の端が既存の線とつながります。

線の一方のみが既存の点に接続する場合

点が新たに1つ増えるので \( V = V_k + 1 \) 、 線が新たに1つ増えるので \( E = E_k + 1 \) 、 面の数は変わらないので \( F = F_k \) 。

\begin{array}{cl} & V – E + F \\ = & ( V_k + 1 ) – ( E_k + 1 ) + F_k \\ = & V_k – E_k + F_k \\ = & 2 \end{array}

線の両端が既存の点に接続する場合

新しく線を引く前の状態で、 既存の線は繋がっているため 新しく引く線の片側または両側は線が閉じていることになる。 すなわち線を新しく引くと、 面の数が1増える。

これより 点の数は増えず \( V = V_k \) 、 線の数は1増えて \( E = E_k + 1 \) 、 面の数も1増えて \( F = F_k + 1 \) 。 これは 線の始点と終点が同じ場合も含みます。

\begin{array}{cl} & V – E + F \\ = & V_k – ( E_k + 1 ) + ( F_k + 1 ) \\ = & V_k – E_k + F_k \\ = & 2 \end{array}

以上より、 \( E = k \in \mathbb{N}\) で オイラーの式が成立していれば \( E = k + 1 \) でも成立することが分かる。

よって すべての場合で オイラーの式は成立する。

証明にしてはちょっとゆるい感じがしますが、 式が成り立つことを理解していただけるとうれしいです。

このオイラーの定理を使うと、デカルトの定理も証明できます。 詳細は デカルトの定理を証明する をご覧ください。

haskell split カンマ区切りの文字列をカンマで区切って配列にする方法

haskell で ruby の split や PHP の explode にあたるようなものを考えました。

背景

haskell を使ったことがなく、使う場面もなかなかないので CodeIQ で使ってみようと思ったものの、 「入力を受け取るにはどうすればいいんだ?」という疑問にぶちあたり、 split する方法を考えました。

Haskell には Data.List.Split モジュール内 に splitOn という関数があるのですが、 CodeIQ でコンパイルに失敗しました。 Ideone でも コンパイルに失敗しました。 ほかにも関数はあるそうなのですが、うまくいかなかったので自分で考えることにしました。

カンマで分割する方法

下のようになりました。 この方法だと カンマ でのみ区切ります。

任意のデリミタで分割する方法

任意のデリミタを指定できるようにしてみました。 1文字のデリミタでのみ分割可能です。

CakePHP3 rails のように部分テンプレートを使用する方法

Rails を真似て作られたといわれている CakePHP で、 部分テンプレートの使用例を説明します。 英語ドキュメントを見ると正しく設定できるのですが、 日本語ドキュメントは古い状態なので、日本語ドキュメントを見ていると解決できません。

続きを読む CakePHP3 rails のように部分テンプレートを使用する方法

Rails seed から task を実行したときの方法

Rails の seeds.rb で task を実行したいとのことで、 やり方を調べました。

実践 Ruby on Rails
実践 Ruby on Rails 4 本格 Web プログラミング

環境

  • Ruby 2.2.2p95
  • Rails 4.1.8
  • Rake 10.4.2

rails g task sample shot とコマンドを実行して、タスクを作っておきます。 下のように。

タスク自体は bundle exec rake sample:shot で実行できます。 これを更に bundle exec rake db:seed とやったときにも実行されるようにするのが今回のゴールです。 おそらく、 rails のコード内から task を実行するのも似たような感じでいけると思います。

解決策

seeds.rb に下の記述を追加します。

環境 (test, development, production) は、 rake db:seed で設定されたものが引き継がれます。 上では SOMETHING'value' という値を設定しています。 rake db:fixture:load FIXTURES=xxxx で設定するようなやつです。