Excelの乱数関数と最大公約数関数で円周率πの近似値を求めよう
平面上の描いた真円の周の長さ/その円の直径の長さを円周率と言ってπで表し、
値は約3.141592654で、正確な値は整数比では表すことができないというのは有名です。
さらに、どんな有限次の代数方程式の解にもならないことも証明されています。
Excelでも
関数 | 説明 |
---|---|
PI 関数 | 円周率πを返します。 |
という、近似値をを返す関数があります。
円周率πは、実は、整数の性質と確率で関係しているという以下の事実があります。
自然数から無作為に2つを取り出す時、その2つが互いに素である確率は
「互いに素」とは、最大公約数が1であるということです。
ここでは、この事実を利用して、PI関数を使用せずにわざわざ、Excelの乱数関数と最大公約数関数でπの近似値を求める方法を紹介します。近似精度は悪いので、実用的には、まったく役に立ちません。
以下の関数を使用します。
関数 | 説明 | |
---|---|---|
RAND 関数 | 0 以上 1 未満の乱数を返します。 | |
INT 関数 | 指定された数値を最も近い整数に切り捨てます。 | |
GCD 関数 | 最大公約数を返します。 | |
SQRT 関数 | 正の平方根を返します。 | |
COUNTA 関数 | 引数リストの各項目に含まれるデータの個数を返します。 | |
COUNTIF 関数 | 指定された範囲に含まれるセルのうち、検索条件に一致するセルの個数を返します。 |
セルD1に
=SQRT(6*COUNTA(C:C)/COUNTIF(C:C,1))
と入力
・・・C列の最大公約数のうち、1である割合を求めて、6を割って、その正の平方根を計算しています。この段階では、C列に値は1つだけなので、1でないと分母が0になってしまい0除算エラーが表示されます。
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に発売されています。
私の担当
Chapter 4 ハードウェアの操作
ファイル
- アプリパッケージのファイルにアクセスする
- ファイル/フォルダーを取得する
- パスからファイルを取得する
- 親フォルダーを取得する
- 同一ファイル/フォルダーを識別する
- ファイル/フォルダーの情報を取得する
- ファイルのコンテンツに関する情報を取得する
- ファイルの基本情報(サイズ/更新日時)を取得する
- ファイルの詳細なプロパティを取得/設定する
- ファイルのサムネイルを取得する
- アプリデータにアクセスする
- アプリデータフォルダーにアクセスする
- ユーザーコンテンツにアクセスする
- フォルダーにファイル/フォルダーを作成する
- ファイルをキャッシュリストに追加する
- テキストファイルを読み込む(Unicodeエンコーディング)
- テキストファイルに書き込む(Unicodeエンコーディング)
- テキストファイルにテキストを追記する(Unicodeエンコーディング)
- テキストファイルを読み込む(任意のエンコーディング)
- テキストファイルに書き込む(任意のエンコーディング)
- バイナリファイルを読み込む
- バイナリファイルに書き込む
- ファイルのコピーを作成する
- ファイルを削除する
- ファイルを移動する
- ファイルの名前を変更する
- 圧縮データを作成する
- 圧縮データを解凍する
- ファイルを検索する
デバイス
- デバイスを列挙する
- デバイスの情報を取得する
- デバイスを動的に列挙する
- 位置情報を検出する
- 位置情報の変化を検出する
- キーボード接続を検出する
- ポインターデバイスを検出する
- マウスで利用できる機能を検出する
- マウスの移動を検出する
- タッチデバイスの接続を検出する
- 加速度データを取得する
- 加速度データの変化を追跡する
- 端末の揺さぶりを検出する
- 傾斜データを取得する
- 角速度データを取得する
- 方角データを取得する
- ライトセンサーデータを取得する
- 簡易向きデータを取得する
メディア
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開発の基本を把握できます。
詳細な目次・サンプルコードダウンロードは、
- 出版社サイト→「TECHNICAL MASTER はじめてのAndroidアプリ開発 Android 4対応版|書籍情報|秀和システム」
- WINGSサイト→「TECHNICAL MASTER はじめてのAndroidアプリ開発 Android OS4対応版 - WINGS」
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(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年夏アニメは何を見ようか…
見れる時間があるかわかりませんが…。。
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」の真偽値をこのように定めるのでしょうか。
論理学ご専門の方または説明できる方、ぜひとも私にこの理由をご教示ください!