Excelの乱数関数と最大公約数関数で円周率πの近似値を求めよう

平面上の描いた真円の周の長さ/その円の直径の長さを円周率と言ってπで表し、
値は約3.141592654で、正確な値は整数比では表すことができないというのは有名です。
さらに、どんな有限次の代数方程式の解にもならないことも証明されています。
Excelでも

関数 説明
PI 関数 円周率πを返します。

という、近似値をを返す関数があります。
円周率πは、実は、整数の性質と確率で関係しているという以下の事実があります。

自然数から無作為に2つを取り出す時、その2つが互いに素である確率は{\frac{6}{\pi^2}}

「互いに素」とは、最大公約数が1であるということです。
ここでは、この事実を利用して、PI関数を使用せずにわざわざ、Excelの乱数関数と最大公約数関数でπの近似値を求める方法を紹介します。近似精度は悪いので、実用的には、まったく役に立ちません。
以下の関数を使用します。

関数 説明
RAND 関数 0 以上 1 未満の乱数を返します。
INT 関数 指定された数値を最も近い整数に切り捨てます。
GCD 関数 最大公約数を返します。
SQRT 関数 正の平方根を返します。
COUNTA 関数 引数リストの各項目に含まれるデータの個数を返します。
COUNTIF 関数 指定された範囲に含まれるセルのうち、検索条件に一致するセルの個数を返します。

セルA1とセルB1に

=INT(RAND()*1000000)

と入力
・・・0から1000000までの整数の乱数を2つ作成しています。

セルC1に

=GCD(A1,B1)

と入力
・・・2つの数の最大公約数を求めています。

セルD1に

=SQRT(6*COUNTA(C:C)/COUNTIF(C:C,1))

と入力
・・・C列の最大公約数のうち、1である割合を求めて、6を割って、その正の平方根を計算しています。この段階では、C列に値は1つだけなので、1でないと分母が0になってしまい0除算エラーが表示されます。

列 A:Cを

選択

Ctrl + D (Fill Down)を

実行(少し待ちます)
・・・A列からC列の数式を行最大値まで数式コピーしています。2つの乱数の最大公約数を求める操作を沢山行います。2組の乱数の最大公約数が1である割合の計算は沢山行うほど、精度が上がります。

D1に円周率πの近似値が出てくるはずです。
乱数を使用しているので、[F9](再計算)をすると値が変わります。それでも毎回、円周率に近い値となるはずです。
整数の性質が、確率を通して、円における円周と直径の長さの割合である円周率πと関係しているなんて、面白い!と思いませんか?

Windows 8開発ポケットリファレンスのご紹介

2014年2月19日発売

2014/02/19に私も執筆に関わった書籍「Windows 8開発ポケットリファレンス」が発売されました。
Windows 8.1のストアアプリを開発するためのAPIのポケットリファレンスです。

著者 WINGSプロジェクト 阿佐志保,森島政人,飯島聡,土井毅,花田善仁 著,山田祥寛 監修
ページ数 496ページ
定価 3,024円(本体2,880円)
ISBN 978-4-7741-6296-6

出版社リンク→Windows 8開発ポケットリファレンス:書籍案内|技術評論社
WINGSプロジェクト→Windows 8開発ポケットリファレンス - WINGS

電子書籍(PDF)版も2014/02/19に発売されています。

Windows 8開発ポケットリファレンス | Gihyo Digital Publishing
https://gihyo.jp/dp/ebook/2014/978-4-7741-6349-9/

私の担当

Chapter 4 ハードウェアの操作

ファイル

  • アプリパッケージのファイルにアクセスする
  • ファイル/フォルダーを取得する
  • パスからファイルを取得する
  • 親フォルダーを取得する
  • 同一ファイル/フォルダーを識別する
  • ファイル/フォルダーの情報を取得する
  • ファイルのコンテンツに関する情報を取得する
  • ファイルの基本情報(サイズ/更新日時)を取得する
  • ファイルの詳細なプロパティを取得/設定する
  • ファイルのサムネイルを取得する
  • アプリデータにアクセスする
  • アプリデータフォルダーにアクセスする
  • ユーザーコンテンツにアクセスする
  • フォルダーにファイル/フォルダーを作成する
  • ファイルをキャッシュリストに追加する
  • テキストファイルを読み込む(Unicodeエンコーディング
  • テキストファイルに書き込む(Unicodeエンコーディング
  • テキストファイルにテキストを追記する(Unicodeエンコーディング
  • テキストファイルを読み込む(任意のエンコーディング
  • テキストファイルに書き込む(任意のエンコーディング
  • バイナリファイルを読み込む
  • バイナリファイルに書き込む
  • ファイルのコピーを作成する
  • ファイルを削除する
  • ファイルを移動する
  • ファイルの名前を変更する
  • 圧縮データを作成する
  • 圧縮データを解凍する
  • ファイルを検索する

バイス

  • バイスを列挙する
  • バイスの情報を取得する
  • バイスを動的に列挙する
  • 位置情報を検出する
  • 位置情報の変化を検出する
  • キーボード接続を検出する
  • ポインターバイスを検出する
  • マウスで利用できる機能を検出する
  • マウスの移動を検出する
  • タッチデバイスの接続を検出する
  • 加速度データを取得する
  • 加速度データの変化を追跡する
  • 端末の揺さぶりを検出する
  • 傾斜データを取得する
  • 角速度データを取得する
  • 方角データを取得する
  • ライトセンサーデータを取得する
  • 簡易向きデータを取得する

メディア

  • オーディオ/ビデオを再生する
  • メディア要素のビルトインのコントロールを利用可能にする
  • ビデオをフルスクリーンで再生する
  • オーディオをバックグラウンドタスクで再生する
  • 撮影用ダイアログを使用して写真/動画を撮影する
  • 写真撮影/動画録画/オーディオ録音のための準備をする
  • 写真/動画を撮影する時にプレビューを表示する
  • COLUMN ビデオデバイスがサポートするエンコード情報
  • 撮影のためにカメラを設定する
  • 独自の撮影用UIを使用して写真を撮影する
  • 独自の撮影用UIを使用して録画する
  • 音声を録音する
  • 自動再生コンテンツに応答する

Chapter 7 非同期プログラミング 457

  • 概要
    • 非同期処理とは
    • 非同期処理の目的
    • async/awaitキーワード
    • 同期メソッドを非同期メソッドにする
    • 非同期メソッドの処理の流れ
    • Windowsランタイムの待機可能オブジェクト

非同期処理の作成/実行

  • 非同期処理を作成して開始する
  • 非同期処理から値を返す
  • 非同期処理の依存関係を指定する
  • 非同期処理が実行されるスレッドを限定する
  • 非同期処理を行う

非同期処理の制御

  • 非同期処理の状態を取得する
  • 入れ子の非同期処理結果を解除する
  • 非同期処理完了後の継続処理を設定する
  • 指定時間後に完了する処理を作成する
  • 非同期処理の完了を待つ
  • 複数の非同期処理すべての完了を待つ
  • 複数の非同期処理のいずれかの完了を待つ
  • 制御を返して非同期に残りの処理を行う
  • 非同期処理をキャンセルする
  • 非同期処理の進行状況を報告する
  • 非同期処理の例外を処理する

よろしくお願いします。

TECHNICAL MASTER はじめてのAndroidアプリ開発 Android OS4対応版

書籍のレビューです。
2012年11月刊行された書籍「TECHNICAL MASTER はじめてのAndroidアプリ開発 Android OS4対応版」を著者の山田祥寛様のご厚意により秀和システム様よりご献本いただきました。

Android開発の環境構築の部分からアプリの公開までの一連の流れがしっかりと書いてあり、無理なくAndroid開発が学べるようになっています。

Chapter01で概要と環境構築、Chapter02で開発環境とアプリ開発の概要、Chapter03-07で画面要素開発の詳細、Chapter08以降はアプリ開発で必要となる応用技術の説明となっています。Chapter03まで読めば、Android開発の基本を把握できます。
詳細な目次・サンプルコードダウンロードは、

Androidではバージョンが頻繁に更新されており、私が動作確認した実機も書籍で動作確認されているものより新しいバージョンで、細部は異なってしまっているところもありますが、丁寧に解説されているので、開発環境の構築の流れが把握できました。差分に関してはサポートサイトで補足されています。

各節ごとの本文、サンプルコードの分量、それらの順番が適切で、無理なく楽しんで学べるようになっています。
本文を読んでいて何か疑問に思ったことへの回答がすぐ横の傍注に書かれていて、スムーズに読み進めることができました。

これから何度も読み返して、自分でも楽しめるようなAndroidアプリを開発したいと思います。

三角関数cosでFizz Buzz

FizzBuzz問題が何度か、ネット上のプログラマやその他IT関係者で流行ったときに大したネタも思いつかずに乗り遅れた感あったわけですが、このたびやっとネタ(?)が思いついたので、エントリを書こうと思った次第です。
ここで、FizzBuzz問題とは1から順に数字を述べていき、3で割り切れる場合は 「Fizz」、5で割り切れる場合は 「Buzz」、両者で割り切れる場合は 「Fizz Buzz」と述べなければならないという言葉遊びです。

[Link]「Fizz Buzz - Wikipedia

ただこの、並びを再現する出力するプログラムを各言語で作るのは簡単で、ネット上では、いろいろな素晴らしいコードや業界の理不尽な状況をやや自虐気味に風刺する(?)ネタエントリが生み出されています。僕も楽しく拝見させていただいております。
いまさらですが、私も三角関数のcosを(わざわざ)使ったコードを思いつきましたのご紹介します。
JavaScriptコード(抜粋)

<script>
	function fizzBuzz(n){
		with(Math){
			var c = cos(2*PI*n/5);
			var x = (1+2*c) * c + cos(2*PI*n/3);
		}
		return (x>3) ? "Fizz Buzz"
			:(x>2) ? "Buzz"
			:(x>1) ? "Fizz"
			:n;
	}
</script>
//・・・ ・・・
<script>
	for (var i=1;i<100;i++){
		document.write(fizzBuzz(i)+", ");
	}
</script>

C#コード(抜粋)

        static string fizzBuzz(int n) {
            var c = Math.Cos(2 * Math.PI*n / 5);
            var x = (1 + 2 * c) * c + Math.Cos(2 * Math.PI * n / 3);
            return (x > 3) ? "Fizz Buzz" 
                : (x > 2) ? "Buzz" 
                : (x > 1) ? "Fizz" : n.ToString();
        }
        static void Main(string[] args)
        {
            Enumerable.Range(1, 100)
                .Select(fizzBuzz)
                .Select(s => { Console.Write("{0}, ", s); return s; })
                .ToArray();
        }

普通に剰余を使うコードよりもまわりくどいので、「どこが面白いんだ!」といわれるかもしれませんが、割り切れるとかどうかという整数の問題に無関係な三角関数を使った式の値に関しての判定で条件を満たしているかどうかがわかるのが面白いと思いませんか。
使用している三角関数の式は
(1+2 cos(\frac{2 \pi x}{5})) (cos(\frac{2 \pi x}{5}))+cos(\frac{2 \pi x}{3})
(1+2*cos(2*Pi*x/5))*(cos(2*Pi*x/5))+cos(2*Pi*x/3)
で、グラフは
[Link]「(1+2*cos(2*pi*x/5))*(cos(2*pi*x/5))+cos(2*pi*x/3) - Google 検索

[Link]「(1+2*cos(2*Pi*x/5))*(cos(2*Pi*x/5))+cos(2*Pi*x/3) - Wolfram|Alpha

と、まあこんな感じです。
実は、この関数はx=整数では、

xの値 (1+2*cos(2*Pi*x/5))*(cos(2*Pi*x/5))+cos(2*Pi*x/3)の値 整数との比較
15の倍数 4 >3
15の倍数でなくて5の倍数 2.5 >2
15の倍数でなくて3の倍数 1.5 >1
上記以外の整数 0 <1

なのです。
というわけで上記のコードでFizzBuzzの条件の判定ができたのです。こんな関数をどうやって作ったのかというと…秘密ですが、関数を2倍するとわかる人にはわかるかもです…

2012年夏アニメは何を見ようか…

見れる時間があるかわかりませんが…。。

曜日 タイトル アニメ公式サイト ウィキペディア 公式Twitter
(推奨)Twitterハッシュタグ
放送局
曜日曜日
放送時間(通常時)
放送開始日 その他の放送日時 備考
輪廻のラグランジェ season2 輪廻のラグランジェ|公式サイト W @lag_rin
#kamojo
TOKYO MX
日曜日
22:00 - 22:27
7/1 バンダイチャンネル7/1日22:00 - 22:30 season 2
TARI TARI アニメ「TARI TARI」公式サイト W @taritarianime
#taritari
tvk
日曜日
22:30 - 23:00
7/1 TOKYO MX7/2月22:30 - 23:00  
境界線上のホライゾン 境界線上のホライゾン W @__HORIZON__
#kyoukaisen
TOKYO MX
日曜日
22:30 - 23:00
7/8 tvk7/8日25:00 - 25:30
テレ玉7/9月25:00 - 25:30
第2期
人類は衰退しました 人類は衰退しました W @project_romeo
#jintai
tvk
日曜日
24:00 - 24:30
7/1 TOKYO MX7/2月 25:30 - 26:00  
織田信奈の野望 TVアニメ「織田信奈の野望」スペシャルサイト W @anime_odanobuna
#デアルカ
テレビ東京
日曜日
25:05 - 25:35
7/8    
トータル・イクリプス TVアニメ「トータル・イクリプス」 W @TE_anime
#TE_anime
テレビ東京
日曜日
25:35 - 26:05
7/1 ニコニコ生放送7/7土 24:00 - 24:30  
はぐれ勇者の鬼畜美学(エステティカ) 『はぐれ勇者の鬼畜美学(エステティカ)』アニメ公式サイト W @hagure_kichiku
#kichiku
TOKYO MX
月曜日
24:30 - 25:00
7/9    
超訳百人一首 うた恋い。 アニメ「超訳百人一首 うた恋い。」公式サイト W @anime_utakoi
#utakoi
テレビ東京
月曜日
25:30 - 26:00
7/2    
ゆるゆり♪♪ TVアニメ「ゆるゆり♪♪」スペシャルサイト W @anime_yuruyuri
#yuruyuri
テレビ東京
月曜日
26:00 - 26:30
7/2   第2期
貧乏神が! TVアニメ「貧乏神が!」公式HP W @binbogamiga
#貧乏神が
テレビ東京
水曜日
25:50 - 26:20
7/4 バンダイチャンネル7/6金19:00 - 19:30  
だから僕は、Hができない。 TVアニメ「だから僕は、Hができない。 W @anime_bokuH
#boku_h
TOKYO MX
水曜日
25:30 - 26:00
7/11 tvk7/14土25:00 - 25:30  
もやしもん リターンズ テレビアニメ『もやしもん リターンズ』公式サイト W @moyashimonR
#moyashimonR
フジテレビ
木曜日
24:45 - 25:15
7/5   第2期
夏雪ランデブー アニメ「夏雪ランデブー」公式サイト W @natsuyukitv
#natsuyukitv
フジテレビ
木曜日
25:15 - 25-45
7/5    
ちとせげっちゅ!! TVアニメ「ちとせげっちゅ!!」公式サイト W ?
#tv_chitose
テレ玉
木曜日
25:00 - 25:05
7/5    
恋と選挙とチョコレート 「恋と選挙とチョコレート」 公式サイト W @koichoco_anime
#恋チョコ
TBSテレビ
木曜日
25:25 - 25:55
7/5    
この中に1人、妹がいる! この中に1人、妹がいる! 公式サイト W @nakaimo_anime
#nakaimo_anime
TBSテレビ
木曜日
25:55 - 26:25
7/5    
カンピオーネ!〜まつろわぬ神々と神殺しの魔王〜 TVアニメ「カンピオーネ! 〜まつろわぬ神々と神殺しの魔王〜」 W @campi_anime
#campi_anime
TOKYO MX
金曜日
25:00 - 25:3
7/6    
じょしらく StarChild:じょしらく W @TVjoshiraku
#じょしらく
TBSテレビ
金曜日
26:25 - 26:55
7/6 バンダイチャンネル7/14土25:00更新
ニコニコチャンネル7/14土 26:00更新
 
えびてん -公立海老栖川高校天悶部- アニメ えびてん 公式サイト W @Ebiten_Kyoko
#ebiten
ニコニコ生放送
土曜日
23:30 - 24:00
7/14    
DOG DAYS' TVアニメーション「DOG DAYS´」公式サイト -ドッグデイズ- W @dogdays_anime
#dogdays
TOKYO MX
土曜日
23:30 - 24:00
7/7 tvk7/8日25:30 - 26:00
テレ玉7/9月26:00 - 26:30
第2期
ソードアート・オンライン ソードアート・オンライン W @sao_anime
#sao_anime
TOKYO MX
土曜日
24:00 - 24:30
7/7 ニコニコ動画7/9月24:00 更新  
ココロコネクト ココロコネクト W @kokoroco_anime
#kokoroco
tvk
土曜日
24:30 - 25:00
7/7 TOKYO MX7/7土25:00 - 25:30
バンダイチャンネル 7/14土24:00 更新
 

PならばQの対偶について

前エントリに引き続き論理学の初歩についての話題です。

命題「R」=「PならばQ」からさらに、Rの「QならばP」、Rの「〜Pならば〜Q」という命題を作成できます。真偽値は以下のようになります。

Pの真偽値 Qの真偽値 〜Pの真偽値 〜Qの真偽値 PならばQ(〜PまたはQ)の真偽値 QならばPの真偽値 〜Pならば〜Qの真偽値

さらに、命題「R」=「PならばQ」のRの逆の裏=Rの裏の逆である命題「〜Qならば〜P」を考えることができます。この命題を命題Rの対偶といいます。真偽値は以下のようになります。

Pの真偽値 Qの真偽値 PならばQ(〜PまたはQ)の真偽値 〜Qならば〜P(Qまたは〜P)の真偽値

ある命題とその対偶の真偽値は一致します。R=「PならばQ」と「〜Q」と真であるとき、Pが真と仮定すると、RによってQも真となってしまうので、Pが真というのはあり得ないから、Pは偽でなければならない。すなわち、「〜Qならば〜P」が真であることがわかります。
また、R=「PならばQ」が偽で「〜Q」が真のとき、Pが真であってもQが真でないのだから、Qが偽でPが真であることがあるので、「〜Qならば〜P」が偽であることがわかります。ですので、命題とその対偶の真偽が一致しているのは十分に納得いくことです。
「a=5ならば、a×a=25」とその対偶「a×a=25でないならばa=5でない」はどちらも真ですし、「a=5ならばaは2で割り切れる」とその対偶「aが2で割り切れないならば、a=5でない」はどちらも偽です。ほかにもP、Qにいろいろ代入して考えてみてください。「PならばQ」と「〜Qならば〜P」の真偽は一致するはずです。

では、P=「上司に怒られない」、Q=「残業しない」を代入して「上司に怒られないならば、残業しない」の対偶を考えてみてください。「残業を強要する職場なんて待遇が悪い!」なんてダジャレを言ってないで対偶を考えましょう。〜Qは「残業する」、〜Pは「上司に怒られる」だから、「残業するならば、上司に怒られる」・・・あれ?
これだと、「上司に怒られないならば、残業しない」と真偽値が一致するようには思えませんね・・・これは一体どういうことなのでしょう・・・?

実は、この場合の対偶は「残業するならば、上司に怒られる」ではないのです。
「上司に怒られないならば、残業しない」というのは、たとえば、18時前に上司が「このままでは期限に間に合わないから残業しろ!」と怒ることがあった場合のみ、18時以降に残業するわけです。つまり暗黙の内に事実「怒られる/怒られない」と事実「残業する/残業しない」に時間的な順序があるのです。「上司に怒られないならば、残業しない」はより正確には「上司に怒られないならば、そのあとで残業をすることはない。」と言い換えることができます。そしてその対偶は「残業するのは、その前に上司に怒られたときだ。」ということができます。これなら、元の命題と対偶の真偽値が一致するのが納得できます。
ほかにも、面白い命題が思いついたら教えてください!

PならばQの真偽値について

「命題」とは意味のある文で、その意味が事実にあうか、事実に合わないかが判定できるものです。事実に合う意味を持つ命題を、事実に合わない意味を持つ命題をといって、命題から定まるこの真偽のことを真偽値といいます。

命題Pから命題「〜P」=「Pでない」という命題を定めることができます。Pと〜Pの真偽値は、反対になります。表にすると以下のようになります。

Pの真偽値 〜Pの真偽値

また、命題P、命題Qに対して命題「PまたはQ」、命題「PかつQ」が考えられます。「PまたはQ」はPかQのどちらかが真であれば真となる命題と定めます。「PまたはQ」はPかQのどちらも真であるときのみ真となる命題と定めます。

Pの真偽値 Qの真偽値 PまたはQの真偽値 PかつQの真偽値

ここまではとても自然に思えると思います。

命題P、命題Qに対して命題「PならばQ」を考えるとき、一般的な論理学ではこの真偽値を以下のように定めるそうです。

Pの真偽値 Qの真偽値 PならばQの真偽値

「PならばQ」の真偽値は、「〜PまたはQ」と一致します。すなわち、Pが偽であればQの真偽にかかわらず、「PならばQ」は真となります。また、Qが真である場合にも、Pの真偽にかかわらず「PならばQ」は真となります。
たとえば、P=「犬は猫である」(偽)、Q=「月は太陽である」(偽)を適用した命題「犬は猫であるならば、月は太陽である」は真となるのです!また、P=「犬は猫である」(偽)、Q=「月は星である」(真)を適用した命題「犬は猫であるならば、月は星である」も真となります。ほかにも「1=2ならば1=1」も「1=2ならば0=100」も真となるのです!
なぜ、通常の論理学では、「PならばQ」の真偽値をこのように定めるのでしょうか。
論理学ご専門の方または説明できる方、ぜひとも私にこの理由をご教示ください!