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

Disculpa, pero esta entrada está disponible sólo en 日本語 y English.

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

オイラーの多面体定理

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

頂点の数 – 辺の数 + 面の数 = 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 カンマ区切りの文字列をカンマで区切って配列にする方法

Disculpa, pero esta entrada está disponible sólo en 日本語 y English.

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

背景

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

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

カンマで分割する方法

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

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

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

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

Disculpa, pero esta entrada está disponible sólo en 日本語 y English.

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

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

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

Disculpa, pero esta entrada está disponible sólo en 日本語 y English.

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 で設定するようなやつです。