オイラーの多面体定理を考えてみましょう。 (もともとはグラフ理論での定理なのですが。)
オイラーの多面体定理
多面体では次の等式が成り立つ。
頂点の数 – 辺の数 + 面の数 = 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 で ruby の split や PHP の explode にあたるようなものを考えました。
背景
haskell を使ったことがなく、使う場面もなかなかないので CodeIQ で使ってみようと思ったものの、 「入力を受け取るにはどうすればいいんだ?」という疑問にぶちあたり、 split する方法を考えました。
Haskell には Data.List.Split モジュール内 に splitOn という関数があるのですが、 CodeIQ でコンパイルに失敗しました。 Ideone でも コンパイルに失敗しました。 ほかにも関数はあるそうなのですが、うまくいかなかったので自分で考えることにしました。
カンマで分割する方法
下のようになりました。 この方法だと カンマ でのみ区切ります。
|
|
split = _split [] _split ts "" = ts _split ts s = _split (ts ++ [(token s)]) (drop (length(token s) + 1) s) token = _token "" _token ys "" = ys _token ys (x:xs) = do if x == ',' then ys else _token (ys ++ [x]) xs |
任意のデリミタで分割する方法
任意のデリミタを指定できるようにしてみました。 1文字のデリミタでのみ分割可能です。
|
|
split d = _split d [] _split d cs "" = cs _split d cs s = _split d (cs ++ [token d s]) (drop (length(token d s) + 1) s) token d = _token d "" _token d t "" = t _token d t (x:xs) = if (x == d) then t else _token d (t ++ [x]) xs |
CakePHP 3 の migration コマンド について調べました。
続きを読む CakePHP3 migration コマンド →
Rails を真似て作られたといわれている CakePHP で、 部分テンプレートの使用例を説明します。 英語ドキュメントを見ると正しく設定できるのですが、 日本語ドキュメントは古い状態なので、日本語ドキュメントを見ていると解決できません。
続きを読む CakePHP3 rails のように部分テンプレートを使用する方法 →
Rails の seeds.rb で task を実行したいとのことで、 やり方を調べました。
実践 Ruby on Rails 4 本格 Web プログラミング
環境
- Ruby 2.2.2p95
- Rails 4.1.8
- Rake 10.4.2
rails g task sample shot とコマンドを実行して、タスクを作っておきます。 下のように。
|
|
namespace :sample do desc "shot sample" task shot: :environment do # something what to do end end |
タスク自体は bundle exec rake sample:shot で実行できます。 これを更に bundle exec rake db:seed とやったときにも実行されるようにするのが今回のゴールです。 おそらく、 rails のコード内から task を実行するのも似たような感じでいけると思います。
解決策
seeds.rb に下の記述を追加します。
|
|
ENV['SOMETHING'] = 'value' Rake::Task['sample:shot'].invoke |
環境 (test, development, production) は、 rake db:seed で設定されたものが引き継がれます。 上では SOMETHING に 'value' という値を設定しています。 rake db:fixture:load FIXTURES=xxxx で設定するようなやつです。
A Life Summary of an Gypsy