インフラSE日記

OSS、仮想化、金融工学、ゲーム、ときどきラーメン

可算集合のルベーグ測度が0であることの証明

コルモゴロフが構築した現代確率論を学習するときに、測度論は避けて通ることはできません。そこで、今回は基礎的な定理である「可算集合ルベーグ測度は0である」ということを証明しようと思います。

ちなみに、測度と言えば「掛谷集合」という面白い集合があるのを知っていますか?

掛谷集合とは、以下の性質を満たす集合のことです。

任意の角度の長さ1の線分を含み、測度が0となるような二次元集合が存在する。

 

不思議な集合ですよね。

もともとは、長さ1の線分を回転させられるような集合で、面積が最小となるような集合は何かという数学者掛谷宗一の問題です。

それはともかく、測度論の基礎の基礎のところから学んでいきたいと思います。

測度

測度の定義を以下に述べます。

集合{\displaystyle X}のべき集合{2^{\displaystyle X}}の部分集合{\mathfrak{F}}上で定義される加算加法的測度\mu[0,\infty]に値を持つ写像であり、以下を満たす。

1.空集合の測度は0

\mu(\phi)=0

2.完全加法性を満たす.すなわち、互いに素な集合E_{1},...,が以下を満たすならば

E_{i} \cap E_{j}=\phi \: for \: all \: i, j \in \mathbb{N} \: i\neq j

{\displaystyle \mu(\bigcup_{k=1}^{\infty}E_{k})=\sum_{k=1}^{\infty}\mu(E_{k})}

 

証明

実数\mathbb{R}の部分加算集合Aに対し、\mu(A)=0を示す。

Aのk番目の実数q_{k}と任意の正の実数\epsilon_{k}を用いて開区間E_{k}=[q_{k}-\epsilon_{k},q_{k}+\epsilon_{k}]を定める。

{\displaystyle A \subset \bigcup_{k=1}^{\infty}E_{k}}であることから

 {\displaystyle \mu(A) \leqq \mu(\bigcup_{k=1}^{\infty}E_{k}) \leqq \sum_{k=1}^{\infty}\mu(E_{k}) \leqq 2\sum_{k=1}^{\infty}\epsilon_{k}}

ここで\epsilon_{k}をあらたに\epsilonを正の実数として、以下のように定義する。

\epsilon_{k}=\epsilon^{k}

すると

{\displaystyle \mu(A) \leqq 2\sum_{k=1}^{\infty}\epsilon_{k}=2\frac{\epsilon}{1-\epsilon}}

となり、\epsilonは任意の正の実数であるため\epsilon\rightarrow0として\mu(A)=0となる。

 

証明終了

 

 

厳密に言えば、数学的には証明できてませんね。

専門家がみたら証明(笑)みたいな内容でしょう。

正確に言えば上記に書いた\mu(A)ルベーグ測度ではなく、ルベーグ外測度ですしね。それでも、数学初心者の僕からしたら十分な内容です。

 

測度が定義できないヴィタリ集合についても書きたいです。

 

 

そんな感じです。

 

 

VyOSというオープンソース仮想ルータを使ってみた

vyosとは

Vyattaからフォークされたオープンソースのネットワーク用OS。

BGP、OSPF、RIPなど基本的なプロトコルを扱える。また、NATやF/Wなどのルーティング以外の機能も有する。

 

N/W構成図

我が家のN/W構成図を書いてみます。

以下のようになっています。f:id:chemicallogical:20171008221847p:plain

WKはVMware Workstationの略です。

一番上のルータはBaffalo製のルータ(最近たまに接続不可になり要再起動なので早く買い替えたい)です。

今回赤で囲った箇所がvyosで構築したルータです。

ちなみに、ESX01はVMware Workstation上で稼働している仮想マシンです(いわゆるNested Virtualization)。

VMware Workstationで作成した3つのセグメント192.168.197.0/24(NAT)と192.168.41.0/24(Only)と172.19.16.0/24(Only)を接続していきます。

 

やったこ

VMware Workstation上に172.19.16.254と192.168.41.254をもつ

 仮想ルータ(vRouter01)をvyosで構築し、2つのインタフェースでRIP起動

VMware Workstation上に192.168.41.253と192.168.197.253をもつ

 仮想ルータ(vRouter02)をvyosで構築し、2つのインタフェースでRIP起動

③ESX01上に192.168.41.252と192.168.197.252のポートグループに所属する

 仮想ルータ(vRouter99)をvyosで構築し、2つのインタフェースでRIP起動

疎通検証結果

以下の4つの仮想マシンを使って、各ペアで疎通できるか検証してみました。

その結果を以下に記載します。

VM1(Win2008R2, 172.19.16.2)

VM2(Win2008R2CP、192.168.41.2)

VM3(ESX01、192.168.197.136)

VM4(Win2008、192.168.41.128)

 

ペア 送信元 送信先 疎通結果
1⇔2 VM1 VM2 ×
VM2 VM1 ×
1⇔3 VM1 VM3 ×
VM3 VM1 ×
1⇔4 VM1 VM4 ×
VM4 VM1 ×
2⇔3 VM2 VM3 ×
VM3 VM2 ×
2⇔4 VM2 VM4 ×
VM4 VM2 ×
3⇔4 VM3 VM4 ×
VM4 VM3 ×

 

全部通信できませんでした。

原因は不明。今後特定します。

今の自分のネットワークの知識では特定できず、悔しい結果となりました。

とりあえず不満だらけの結果で本当は載せたくないのですが、あえて自分に厳しくネットワークの知識・技術がまったくないことを反省し今後の自分の成長の期待して載せます。

必ず原因特定して解消します。

 

今回vyos構築作業で使ったコマンド

今回使ったコマンドを下記に載せます。

RIPを使ったので、静的ルーティングはしてないです。

【ホスト名】

ホスト名確認

show host name

ホスト名変更

set system host-name <ホスト名>

 

IPアドレス

IPアドレス確認

show interfaces

IPアドレス設定

set interfaces ethernet <インタフェース名> address <IPアドレス(CIDR表記)>

 

【ルーティングテーブル】

ルーティングテーブル確認

show ip route

 

プロトコル

RIP設定

set protocols rip <ホスト名>

 

ネットワークって難しいですね。

机上だけの知識だけでは本当にわかったことにならない、なるべく実機で触って理解しよう!ということからやってみました。実機で設定しても思ったようにうまくいかないです。何度モニターぶん殴ろうかと思ったことか…

それでも、改めて全くネットワークのこと理解していないということが理解できましたので、よかったです。

かならずリベンジします。

 

 

そんな感じです。

対角線論法について

カントール自然数\mathbb{N}と実数\mathbb{R}との間に全単射がないことを証明するために対角線論法を使ったことはあまりにも有名です。 その他にもチューリングの停止性問題、ゲーデル不完全性定理を証明するために対角線論法を使ったことでも有名ですね。

個人的に昔から対角線論法の証明内容が腹落ちしないというか、納得がいかなかったので自分で納得がいく証明方法を考えてみました。

ちなみに、初めてはてなブログMarkdown記法を使ってtexの数式で書いたのですが、 なかなかうまく書けないですね。

定理 自然数\mathbb{N}から実数\mathbb{R}への全単射は存在しない。

証明

自然数\mathbb{N}から実数\mathbb{R}の部分集合[0,1]へ全単射fが存在すると仮定する。

ここで関数g,hを下記の通り定義する。


g:[0,1]\times\mathbb{Z}_{10}\to\mathbb{Z}_{10}


g\left(r, n\right)=\lfloor r\times10^{n} \rfloor mod 10


h:\mathbb{Z}_{10} \to \mathbb{Z}_{10}

関数hは任意のx\in\mathbb{Z}_{10}に対しh\left(x\right)\neq x

を満たす関数であればなんでもよい

ここで実数rを以下の通り定義する。

r={\displaystyle
\sum_{i=1}^{\infty}\frac{h(g(r_{i},i))}{10^{i}}
}

仮定から、実数rに対応する整数Nが存在する。

{\displaystyle
g\left(r,N\right)=g\left(r_{N},N\right)=\lfloor \sum_{i=1}^{\infty}\frac{h(g(r_{i},i))}{10^{i}}\times10^{N} \rfloor mod 10=h(g(r,N))}

となり、矛盾する。 すなわち、自然数\mathbb{N}から実数\mathbb{R}全単射fが存在するという命題が偽であることがわかり、自然数から実数への全単射が存在しないことが証明できた。

僕が普通の対角線論法で納得いかない部分は、自然数から実数への対応表から、対応表にない実数を構成するところでした。対応表にない実数が、無限に並んだ自然数から実数への対応表のどれにも一致しないという論法において、何故無限個の実数と異なることを示すことができるのだろうという疑問がありました。 具体的に対応表に存在しない実数rを対角線上にある自然数から構成し、自然数と実数の間に全単射が存在するという仮定から、実数rに対応する自然数Nが存在することになるが、実数rのN番目の自然数は実数rのN番目の自然数と異なるという矛盾を導き出す。 このことによって、自然数から実数への全単射がないことが証明できる。

次は、ゲーデル不完全性定理かな?

そんな感じです。

ARP REQUSTの挙動について

今更、ネットワークの基本的なことを勉強しています。

その中でも、ARPは基本的な通信プロトコルであるため、どのような挙動をするか実験してみました。

何を今更そんな、という方もいらっしゃるかもしれませんが、ほとんど自分用のメモなので許してください!

 

結論

ARP REQUSTは他のサーバのARPテーブルを書き換えることができる

 

実験内容

仮想マシンVM1, VM2, VM3を使い、イーサネットヘッダの送信元MACアドレス送信先MACアドレスARPヘッダの送信元MACアドレス、送信元IPアドレス送信先MACアドレス送信先IPアドレスを変えながらARP REQUEST(ブロードキャスト)を投げる。ARP REPLYの内容と実際に書き換わったARPテーブルの内容を確認する。

 

通信するプログラムはVM1で実行する。VM1はUbuntu 14.04であり、生ソケットを使うものとする。

 

わかったこと①

イーサネットヘッダの送信元MACアドレスARPに全く影響しない。

 

イーサネットヘッダの送信元MACアドレスをVM1, VM2, VM3のMACアドレスに変更しながら実行してみたが、ARP REPLYに影響はなかった。

 

わかったこと②

ARP REPLYを返すサーバは、ARP REQUESTのARPヘッダに書かれている送信先IPアドレスのサーバである。

 

もともと知りたいIPアドレスに対応するMACアドレスのサーバにARP REPLYを返してほしいため、当たり前の挙動である

 

わかったこと③

ARP REPLYを返したサーバは、ARP REQUESTのARPヘッダに書かれている宛先IPアドレスのサーバのMACアドレスを、ARP REUESTのARPヘッダに書かれている送信元MACアドレスとして学習する

 

つまり、ARP REQUESTを受け取ったサーバは、素直にARP REQUESTを投げたサーバのIPアドレスMACアドレスを素直に学習する

この仕様を使えば、ARP REQUESTでブロードキャストドメイン上に存在するサーバのARPテーブルを改ざんできる

 

下に実験結果をまとめてみます

No.7以降の学習結果を書いていないのはめんどくさくなって実験してないからです

まぁ、ある程度仕様わかったしね、ある程度は大丈夫でしょう

これでARP SPOOFINGには偽のARP REPLYを投げてする方法と、偽のARP REQUETを投げる方法があることがわかりましたね!

 

良い子はARP SPOOFINGなんてやっちゃダメですよ!

 

No. 実行端末 ETH SRC MAC ETH DST MAC ARP SRC MAC ARP SRC IP ARP DST MAC ARP DST IP ETH SRC MAC ETH DST MAC ARP SRC MAC ARP SRC IP ARP DST MAC ARP DST IP VM1 VM2 VM3
1 VM1 VM1 FF:FF:FF:FF:FF:FF VM1 VM1 00:00:00:00:00:00 VM2 VM2 VM1 VM2 VM2 VM1 VM1 VM2のMACアドレスを、VM2のMACアドレスとして学習した VM1のMACアドレスを、VM1のMACアドレスとして学習した 学習していない
2 VM1 VM1 FF:FF:FF:FF:FF:FF VM2 VM1 00:00:00:00:00:00 VM2 VM2 VM2 VM2 VM2 VM2 VM1 VM2のMACアドレスを学習できなかった VM1のMACアドレスを、VM2のMACアドレスとして学習した 学習していない
3 VM1 VM1 FF:FF:FF:FF:FF:FF VM3 VM1 00:00:00:00:00:00 VM2 VM2 VM3 VM2 VM2 VM3 VM1 VM2のMACアドレスを学習できなかった VM1のMACアドレスを、VM3のMACアドレスとして学習した 学習していない
4 VM1 VM2 FF:FF:FF:FF:FF:FF VM1 VM1 00:00:00:00:00:00 VM2 VM2 VM1 VM2 VM2 VM1 VM1 VM2のMACアドレスを、VM2のMACアドレスとして学習した VM1のMACアドレスを、VM1のMACアドレスとして学習した 学習していない
5 VM1 VM2 FF:FF:FF:FF:FF:FF VM2 VM1 00:00:00:00:00:00 VM2 VM2 VM2 VM2 VM2 VM2 VM1 VM2のMACアドレスを学習できなかった VM1のMACアドレスを、VM2のMACアドレスとして学習した 学習していない
6 VM1 VM2 FF:FF:FF:FF:FF:FF VM3 VM1 00:00:00:00:00:00 VM2 VM2 VM3 VM2 VM2 VM3 VM1 VM2のMACアドレスを学習できなかった VM1のMACアドレスを、VM3のMACアドレスとして学習した 学習していない
7 VM1 VM3 FF:FF:FF:FF:FF:FF VM1 VM1 00:00:00:00:00:00 VM2 VM2 VM1 VM2 VM2 VM1 VM1      
8 VM1 VM3 FF:FF:FF:FF:FF:FF VM2 VM1 00:00:00:00:00:00 VM2 VM2 VM2 VM2 VM2 VM2 VM1      
9 VM1 VM3 FF:FF:FF:FF:FF:FF VM3 VM1 00:00:00:00:00:00 VM2 VM2 VM3 VM2 VM2 VM3 VM1      
10 VM1 VM1 FF:FF:FF:FF:FF:FF VM1 VM2 00:00:00:00:00:00 VM2 Gratuitous ARP
11 VM1 VM1 FF:FF:FF:FF:FF:FF VM2 VM2 00:00:00:00:00:00 VM2
12 VM1 VM1 FF:FF:FF:FF:FF:FF VM3 VM2 00:00:00:00:00:00 VM2
13 VM1 VM1 FF:FF:FF:FF:FF:FF VM1 VM3 00:00:00:00:00:00 VM2 VM2 VM1 VM2 VM2 VM1 VM3      
14 VM1 VM1 FF:FF:FF:FF:FF:FF VM2 VM3 00:00:00:00:00:00 VM2 VM2 VM2 VM2 VM2 VM2 VM3      
15 VM1 VM1 FF:FF:FF:FF:FF:FF VM3 VM3 00:00:00:00:00:00 VM2 VM2 VM3 VM2 VM2 VM3 VM3      

 

 

 

そんな感じです。

Nutanix CE構築手順

家のNutanix CEの仮想マシンが壊れたので、再構築してみました。

自分への備忘として、構築時の手順を以下に記載します。

構築してからスクリーンショットをとってないことに気づきましたが後の祭りでした。

構築所要時間は1時間くらいです。

 

■構築環境

 仮想基盤:VMware Workstation Pro

 メモリ:16G

 vCPU:4

 HDD1::200GB(Hot)

 HDD2:500GB(Cold)

 Nutanix Host IP:192.168.197.11

 CVM IP:192.168.197.21

 

1. Nutanix CEのインストール
1-1. Nutanix CE用のimgを下記URLからダウンロードする
 【URL】
  http://next.nutanix.com/t5/Discussion-Forum/Download-Nutanix-CE-Docs-and-Guides/m-p/3188#U3188
1-2. 1-1.で取得したimgファイルを解凍し、ファイル名を「ce-flat.vmdk」に変更する
1-3. Nutanix用のVMDKファイルを下記URLからダウンロードする
【URL】
  https://www.virtuallifestyle.nl/2015/06/nextconf-running-nutanix-community-edition-nested-on-fusion/
 【ファイル名】
  ce.vmdk
1-4. Nutanix用の仮想マシン(以下Nutanix01とする)を作成する
 メモリ:16GB
 プロセッサ:4
 ブート用メディア:ce.vmdk    SATA
 Hot Disk(SSD):200GB   SCSI(0:0)
 Cold Disk(HDD):500GB SCSI(0:1)
1-5. NutanixをBIOS起動する
下記をvmxファイルに追記
vhv.enable = "TRUE"
bios.forceSetupOnce = "TRUE"
1-6. [Boot]->[Hard Drive]より起動ディスクの優先順位をSATA(ce.vmdk)に変更し、再起動する
1-7. Nutanixにログインする
 ユーザ名:root
 パスワード:nutanix/4u
1-8. 下記コマンドを実行し、認識しているディスクを確認する
 【コマンド】
  fdisk -l
1-9. 下記コマンドを実行し、Hot Diskとして認識させたいデバイスを擬似的にSSDとして認識させる
 【コマンド】
  echo 0 > /sys/block/sda/queue/rotational
  cat /sys/block/sda/queue/rotational
1-10. 下記ユーザ名入力し、ログインする
 【ユーザ名】
  install
1-11. キーボードのレイアウトを指定する※1
 【レイアウト】
  jp106
1-12. ネットワーク設定を行う
・Host IP Address
・Host Subnet Mask
・Host Gateway
・CVM IP Address
・CVM Subnet Mask
・CVM Gateway
DNS Server

1ノード構成の場合、下記にチェックを入れる※2
 Create single-node clusrter?

 ※2チェックを入れインストールすると後のクラスタ構築時に失敗することがあるため、チェックを入れない

1-13. EULAを最後まで読んで、「I accept the end user license agreement.」にチェックを入れる
1-14. Nutanixのインストールが終了するまで待つ

 

2. クラスタの構成
2-1. 下記ユーザ名とパスワードを入力し、CVMにログインする
 ユーザ名:root
 パスワード:nutanix/4u
2-2. 下記コマンドを実行し、クラスタを構成する
 【コマンド】
  cluster -s <CVMのIPアドレス>
2-3. 下記コマンドを実行し、DNSサーバを設定する
 【コマンド】
  cp -p /etc/resolv.conf /etc/resolv.conf.default
  cluster add-to-name-servers servers="8.8.8.8"
  cat /etc/resolv.conf
2-4. 下記URLアクセスし、管理コンソール(PRISM)にログインする

 https://192.168.197.21:9440/

2-5. 下記を入力し、パスワードを設定する
  ユーザ名:admin
  パスワード:admin
2-6. PRISM初回ログイン時、「NEXT username」と「NEXt password」を入力し、認証する
  [NEXT username」はNutanix NEXTに登録しているメールアドレス

2-7. [admin] > [Nothing To Do?]をクリックして2048で高得点を出す

 

 Nutanixの入門書が出ていたので思わず買ってしまいました。

まだ、途中までしか読めていませんが思ったよりも詳しいことを書いています。

GW中に読了したいです。

Nutanix Hyper Converged Infrastructure入門

Nutanix Hyper Converged Infrastructure入門

 

 

 

そんな感じです。

 

 

 

Zabbixについて

家のサーバを監視するために最近Zabbixを導入してみました。

使い始めて1ヶ月位しか経ってませんが、良いと思う点と良くないと思う点について書いてみたいと思います。

 

■良いと思う点

1. オープンソースであるため、イニシャルコストが0

 僕はUbuntu 14.04の環境にインストールしたのですが、インストールもそれほど難しくなかったです。Zabbix Agentの導入は少し苦労しました。

2. テンプレート機能

 ホストが増えると楽になりますね。同じような設定をする場合だと、めんどくささ設定する時間がかなり減ります。

 

■良くないと思う点

1. 監視抑止をスケジュールで制御できない

 バックアップや、バッチ処理およびメンテンス等のためこの時間帯は監視を抑止したいという時があると思います。それがホストやトリガー単位でできないのはめんどくさいですね。正確に言うとトリガーだと、トリガー関数のtime()やdate()を使えばできるのですが、スケジュールと閾値の設定は別にしたいです。SiteScopeは監視抑止の制御をスケジュールでできるんですが。。

2. 「概要」画面でホスト名が固定表示でないため下にスクロールするとホスト名が見えなくなる

 これはただの表示の問題なので、監視に直接関係ないところです。概要画面を見ていて下にスクロールするとホスト名が流れちゃって、どのホストが障害が起きてるかわからなくなるんですよね。Zabbixって正直表示が見やすいとは思わないです…。

3. 正規表現チェッカーがない

 ログ監視するときに、ほぼ正規表現使うと思います。普通、ログ監視に限らず、監視設定を行うとテストを実施すると思います。監視したい文字列と自分が設定した正規表現がマッチするかテストしたいのに、テストツールがないから外部のツールを使うしかないですね。そもそもZabbixって設定に対するテストができないのでは、と思ってます。そもそもZabbixのログ監視ってなんか怪しいですよね、、

 

話のネタがない+幼女問題が解けてないためZabbixについて書いてみました。

ほとんどZabbixへの愚痴になってしまいましたが、オープンソースなのでもっともっとこれから向上していくでしょう。

(自分でコミッターになればいいじゃんて思うのですが、そんな実力もないので。不甲斐なさすぎる。。)

 

ログ監視について調べるため、Zabbixのソースコード読んでいます。

次は幼女問題かZabbixのソースコードリーディングについてかな。

nginxのソースコードリーディングも放置しているのでやりたいですね。

それとNutanixも。「Nutanix Hyper Converged Infrastructure入門」買いましたが早速積んじゃってます。

 

週1くらいで更新していきたいです。

そんな感じです。

 

 

 

 

200人の赤と青の幼女のお祭り

みなさん幼女問題ってご存知ですか?

幼女とは「幻の女」の略で、論理的思考にのみ従う悪魔(天使?)のことです。

ラプラスの悪魔みたいに、超越した存在のことを悪魔っていうことがありますね。

 

ブログを書く書く言っておきながら全く書いていなかったので幼女問題に挑戦してみました。

 

問題は以下の通り。

08.200人の赤と青の幼女のお祭り

ある村に住む200人の幼女は、この時期になると髪の毛の色が変わる。
赤か青になるのだが、自分では自分が何色に変わったか見ることができない。
赤も青も少なくとも一人は存在することが保証されている。

そしてこの時期になると、幼女たちは自分の色を知るためのお祭りを開催する。
お祭り期間中、幼女たちは広場に出かけて、交流をする。
このとき、髪の色について話題に出してはいけないが、他人の色を見ることは構わない。
そして、自分の色がわかったひとは次の日広場に出かけず、家にこもる。

つまり、祭り初日は200人の幼女が広場に来るが、数日後には自分の色がわかったひとが来なくなり、最終的には誰も来なくなる。
誰も来なくなったときに、祭りは終了する。

今年の幼女の髪の色は赤100人、青100人だった
このとき祭りが終了するのは何日後か?

 

 

以下、僕の回答。

100日後。

 

赤い髪の幼女がn人、青い髪の幼女がn人いると一般化して考える。
「赤も青も少なくとも一人は存在する」を☆で表す。
また、赤い髪の幼女から連番を振り、幼女1, 幼女2, ..., 幼女n+1, ... , 幼女2nとする。

(i)n=1のとき
赤い髪の幼女が「自分は青い髪である」と仮定すると
条件☆に矛盾するため、赤い髪の幼女は自分が赤い髪であるとわかる。
青い髪の幼女も同様であるため、1日後に2人とも来なくなり祭りは終了する。

(ii)n=2のとき
幼女1が「自分は青い髪である」と仮定すると、幼女2は「自分以外3人は全員髪が青い、条件☆から自分の髪は赤い」とわかるはずである。
すなわち、幼女1は翌日幼女2が来なければ自分の髪の毛は青い、翌日幼女2が来たら赤いと判断することができる。
同様に幼女2も考えるはずである。
幼女1, 2ともに髪が赤く翌日来るため、当日自分の髪は赤いとわかる。
幼女4, 5, 6も色が自分の髪の毛の色が青になっただけで考え方は同様である。
1日後全員が自分の髪の色がわかり、2日後に全員来なくなり祭りは終了する。

(iii)n=3のとき
幼女1が「自分は青い髪である」と仮定する。
さらに幼女2がこの仮定の下、「自分が青い髪である」と仮定すると、
幼女2は「自分以外3人は全員髪が青い、条件☆から自分の髪は赤い」とわかるはずである。
すなわち、幼女2は翌日幼女3が来なければ自分の髪の毛は青い、翌日幼女3が来たら赤いと判断することができるはずである。
翌日幼女3が来るため、幼女2は自分の髪の毛の色が青いとわかる。
幼女2が2日後も祭りに来た場合、幼女1の「自分は青い髪である」の仮定が間違っていたことになるため、幼女1は2日後に自分の髪の色が赤いとわかる。
同様に幼女2, 3も考えるはずである。
幼女4, 5, 6も髪の毛の色が青になっただけで考え方は同様である。
2日後に全員が自分の髪の色がわかり、3日後に全員来なくなり祭りは終了する。

(i)~(iii)からn日後に祭りが終了すると予想できる。

(iv)n=kのとき
幼女1が「自分が青い髪である」と仮定する。
さらに幼女2, ..., 幼女k-1がこの仮定の下、「自分が青い髪である」と仮定すると、
幼女kは「自分以外2k-1人は全員髪が青い、条件☆から自分の髪は赤い」とわかるはずである。
すなわち、幼女k-1は翌日幼女kが来なければ自分の髪の毛は青い、翌日幼女kが来たら赤いと判断することができるはずである。
k-1日後に幼女2, 3, ..., kが祭りに来た場合、幼女1の「自分は青い髪である」の仮定が間違っていたことになるため、
幼女1はk-1日後に自分の髪の色が赤いとわかる。
同様に幼女2, 3, ..., kも考えるはずである。
幼女k+1, ..., 幼女2kも髪の毛の色が青になっただけで考え方は同様である。
k-1日後に全員が自分の髪の色がわかり、k日後に全員来なくなり祭りは終了する。

 

以上から100日後に祭りが終了することがわかる。

 

 

 

補足

100%合っている保証はありませんので、ご了承ください。

にしても幼女だらけの村ってすごいですね。祭りといえば僕は何故か金田一少年の事件簿の「雷祭殺人事件」を思い出すんですが、僕だけですかね?

 

次は別の幼女問題に挑戦するか、ZabbixかOracleあたりのことを書きたいです。

せめて週1の更新にしよう。。

 

そんな感じです。