数学・情報理論

2011/10/27

無矛盾性と完全性

ある公理系が無矛盾であるとか、完全であるとかいうのは、その公理系のなかで、

  • すべての論理式 Pに対して、Pと¬Pがともに証明可能となることはない → 無矛盾
  • すべての論理式 P に対して、Pまたは ¬Pのいずれかが必ず証明可能である → 完全

でいいのかな。

(追記)
上に書いた「完全」の意味は「ゲーデルの不完全性定理」での用法のつもりで書いた(あってるのかどうか自信がない)のだが、「ゲーデルの不完全性定理」と「ゲーデルの完全性定理」とでは、「完全」の意味が異なるのだそうだ。
う~む、ますますわからなくなってきた。数学の独学の道程はとてつもなく長いぞ。

| | コメント (0) | トラックバック (0)

2011/08/01

真か偽か、正常か異常か

プログラム言語でのデータ型のひとつとして、論理値型(boolean)というものがあります。
多くのプログラム言語では、論理値型というデータ型以外でも、例えば整数型なら0ならば偽(FALSE)0以外なら真(TRUE)、文字型なら空白" "または"0"ならば偽(FALSE)空白以外は真(TRUE)といったように、論理値としても扱えるようになっています。

また、サブルーチンや関数は返り値(リターンコード)を返すことができます。プログラミング言語や開発環境、あるいは開発プロジェクトにおいては、サブルーチンが正常に終了した場合の返り値は整数型の0とし、異常終了の場合には0以外を返り値とするのが、昔からの一種のお作法のようになっていることがよくあります。

ところが、この返り値のお作法では、返り値を論理値として扱うと、正常終了の場合が偽(FALSE)となり、異常終了の場合が真(TRUE)となり、どうも感覚的に具合がよくありません。こういう場合はえてしてパグを作り込み易いのです。

こういうのも、「歴史的な不整合」のひとつなんでしょうね。


逆に、ファイルオープン命令(関数)の返り値が、ファイル識別子へのポインタになっていて、正常にファイルオープンできたら返り値は0以外、ファイルオープンできなかったら返り値は0という場合もよくあります。
これだと、返り値を論理型と見なして評価すると、正常なら真(TRUE)、異常なら偽(FALSE)となり、感覚的によくあいますね。

こういうのを利用して、例えば以下のようなプログラムが書かれることがあります。(架空のプログラム言語です)

if open(FILE) == true
  then do { 正常処理 }
  else do { 異常処理 ; abort }
endif;

上記の記述だと分かりやすいのですが、ちょっと凝ったプログラムコードだと以下のように書いてあることがあります。

open(FILE) or { 異常処理 ; abort };
{ 正常処理 };

これは、open命令が正常に終了したら、open命令の返り値は0以外すなわち真(TRUE)なので、論理和(or)の右辺を評価するまでもないのでスキップし、正常処理のルーチンを実行する。
open命令が正常に終了しなかったら、返り値は0すなわち偽(FALSE)なので、論理和の右辺を評価しないといけなくなり、結果的に異常処理のルーチンが実行される、ということになります。

よくできてるなぁ、と思いますか?

私は、こういうプログラミングはバグを作り込みやすく発見しにくいのでよくないプログラミングだと思いますが、みなさんはいかがでしょうか。

| | コメント (0) | トラックバック (0)

2010/11/19

右回りと左回り

しばらく前に、ビッグエンディアンとリトルエンディアンという記事で、「数学に関する長い歴史のなかで培われてきたちょっとした不整合」ということを書きました。同じような事例が、角度や方向の表現についてもあります。

日常生活で角度や方向について表現する場合、上方または前方をゼロとして、右回り(時計回り)に何度ということが多いように思います。ゼロ点は時計の0時(12時)方向にあり、単位はほとんどの場合、度(°)で表現しているようです。

一方、複素数平面上で角座標(でいいのかな?)表現をする場合には、X軸(実数軸)の正方向を右側に書き、この方向をゼロとして、反時計回り(左回り)に、ラディアン(rad)を単位として表現します。
学校で三角関数でsin,cos,tanを習い始めるときも、ゼロの位置と方向はこの方式ですね。単位は度(°)ですが。

右回りと左回り、ゼロの位置が上か右か、という違いがあり、ふとしたときに間違いや混乱の元となっているように思います。

| | コメント (0) | トラックバック (0)

2010/10/28

有理数から実数へ

しばらく前から数学の勉強をし直しています。

勉強のゴールなんてのはありませんが、「自然数Nから複素数Cまでの構成を、中学生・高校生くらいの年代に分かりやすく説明できるようになる」ということをひとつの目標としています。

数の構成についてはいろんな教科書に書いてありますし、WEB上にも多数のコンテンツを見つけることができました。

たとえば、このtogetterなどは、twitterという文字数制限のあるなかでの表現なので、各段階を細かく分割して説明しなければならないせいか、非常に読みやすく感じました。フォロワーとのやり取りも理解を助けてくれますし。

おかげで自分なりにかなり理解したつもりになれたのですが、いざ「中・高生に分かりやすく説明」となると全然ダメです。

特に実数Rは、有理数Qから完備化によって拡大するのですが、完備化の手順は理解できたのですが、完備化が必要になるということの上手な説明ができないのです。

自然数Nから整数Zへの拡大は加法(和)に関する逆元が、整数Zから有理数Qへの拡大は乗法(積)に関する逆元が必要ということで、必要性と拡大方法が自然につながっています。
ところが、有理数Qから実数Rへの拡大については、実数R(だけ)が必要となる必要性が私の頭の中で整理できていません。

有理数Qに含まれない数がある(新しい種類の数が必要になる)という例として、X2=2の根である±√2を取り上げて説明している資料が多いです。しかしこれでは、X2=-1の根である±i(虚数単位)も同様な例となり、有理数Qから拡大する先が実数Rではなくて、有理係数多項式の根の全体(=代数的数)になってしまいます。

Number

(最初に掲載していた図が間違っていましたので、修正しました)

有理数Qから、複素数Cを含まずに超越数を含む実数R全体への拡大が必要になる理由を、分かりやすく説明する例はないでしょうか。


超越数の身近な例が円周率(π)くらいしか思い当たらないところに、このモヤモヤ感の根っこがあるような気はするのですが。(自然対数の底(e)は身近とはいえません)

| | コメント (0) | トラックバック (0)

2010/10/22

「桁が違う」

数学で「指数」や「対数」って聞くと頭が痛くなるかたもいらっしゃるかと思います。指数はX2とかX3とかで少しは身近な感じがすると思いますのでともかくとしても、対数のほうはlog10とか、log2とかlogeとか、なにがなんだか。

Wikipediaで対数の項を調べてみると、


対数(たいすう、英語: logarithm)とは、任意の数 x を a を底とする指数関数により x = ap と表したきの冪指数 p の事である。 p = loga(x) と書いて a を底とする x の対数という。

なんて書いてあります。対数は指数関数の逆関数だからというのでこういう表現になってしまうのでしょうが、これでわかる方は最初からわかっていらっしゃ方でしょう(^^;

そもそも「対数」なんて普段使わない言葉だから難しいと思うんです。数学には普段使わない言葉が多いですよね。外国で進んだ学問を無理やり日本語(漢語)に置き換えたり、そのままカタカナで書いたりしたものが多いのが原因の一つだと思います。もっともどんな分野でも似たような傾向はありますが。

さて、「対数」を普段使う言葉でいえば「桁が違う」という場合の「桁」に相当します。といえば分かりやすいでしょうか。
10倍違えば1桁違う、100倍違えば2桁違う、1000倍違えば・・・というやつです。
100倍(2桁違う)のさらに1000倍(3桁違う)は、100000倍(=100倍×1000倍)で5桁(=2桁+3桁)となるように、元の数値の掛け算はその数値の桁の足し算に対応します。これが「対数」の本質です。

自分に関係しそうもないような巨大なお金の計算なんかで良く使いますよね。スタジアム建設に何百億円とか、リニア新幹線の建設費が10兆円とか。こんな金額は一万円札でどれくらいの量かなんて想像もつきませんが、スタジアム建設費はマンション購入費(数千万円)の3桁上、リニア新幹線はスタジアム建設費の2~3桁上、みたいな感じでなんとなく桁数で考えているでしょう。

上に挙げた例は、「底が10の対数」とか「常用対数」といって、log10と書きます。

「底が2の対数(log2)」は、「2進数で桁が違う」と考えればOKです。log2なんて、普通の生活ではあまり使わないですね。コンピュータ関連では2進数をよく使いますので、log2も使うことが多いと思いますが。

「自然対数(loge)」はちょっと説明が面倒なので、うまい説明が思いついたら書きます。
「自然対数だと計算が簡単になるから」とか、「計算が簡単になるような数(ネイピア数 e)を導き出した」って感じなんですが、これじゃわからないですよね。


# このエントリは、前のエントリで「位取り記数法」についてもちょっと触れたので、そのついでに、忘れないうちに書いたものです。

| | コメント (0) | トラックバック (0)

ビッグエンディアンとリトルエンディアン

コンピュータ内部でマルチバイトデータをどのように表現(格納)するかという方式に、ビッグエンディアンとリトルエンディアンと呼ばれる異なる方式があります。詳しくはWikipediaなどを参照していただくとして、簡単に説明すると以下のような違いです。

例として、32ビット(4バイト)長の符号無し整数を表現する方式で説明します。長方形の箱はバイトを表しています。

Endien1_3

この図をみるとどちらが「直感的に」分かりやすいでしょうか。自分はビッグエンディアンのほうが分かりやすいと感じました。仕事で最初に使った計算機がビッグエンディアンだったという理由もありますが、こうやって図にした時に、リトルエンディアンだとややこしいのに対して、ビッグエンディアンでは、いつも見慣れた表現でそのまま見ることができます。

では、こちらの図ではどうでしょうか。ビッグエンディアンのほうは変更なく、リトルエンディアンのほうだけ図を変更しています。

Endien2_4

メモリのアドレスを「逆順に」書いただけなんですが、こうすると、リトルエンディアン「でも」分かりやすいと思いませんか。

コンピュータ内部で取り扱う情報は、4バイトデータだけではありません。1バイトデータも2バイトデータも8バイトデータもあります。
リトルエンディアンでは1バイトで納まらなくなったら、溢れた上位桁の分を次のバイトに格納すれば良いわけです。一方、ビッグエンディアンでは1バイトで納まらなくなった時は、そのデータを次のバイト位置に移動したうえで、溢れた上位桁の分をもとのバイト位置に格納します。
1バイトデータから2バイトデータに拡張する時は、むしろリトルエンディアン「のほうが」自然な方式だと感じませんか。


こういう感じ方の違いが出てくる原因はなんでしょうか。それは、数学(のというか数値表現)に関する長い歴史のなかで培われてきたちょっとした不整合が原因だと思います。

数直線という言葉をご存じですね。普通は水平に線を引いて、左側が小さい数値で、右側が大きい数値を表現します。グラフの水平軸(X軸)も普通はこの方向です。
自分の想像ですが、おそらくこの書き方が定着したのは、右利きの人のほうが多いからだと思います。右利きの人が水平線を描くときは、左から右へ引くように描くのが楽です。また、数を順番に数えるには、一般的には小さいほうから大きいほうへ数えます。小さい方から大きいほうへ、と、左から右へがこうしてつながっています。

さきほどの図の1枚目と、2枚目でもビッグエンディアンのほうは、メモリアドレスは右のほうが大きい(高位アドレス)として表現しています。ところが、2枚目のリトルエンディアンのほうでは逆に左のほうが大きく(高位アドレス)なっています。だからなんとなく気持ちが悪く感じます(自分の場合は)。

一方、数値の位取り表現(普通のアラビア数字の書き方といえばいいでしょう)では、桁があがると左側に追加していきます。
この書き方が定着したのも右利きが関係していると想像しています。数値を言葉で表現する時、多くの言語では位(桁)の大きいほうから表現します。日本語では1234は1千2百3十4です。英語ではone thousand, two handreds and thirty fourです。ほかの言語は知りません(^^; この言語表現と、位取りを左(上位桁)から右(下位桁)に書いていくのにも右利きに取って馴染みやすいというのが理由じゃないかと。

つまり、左よりも右のほうが大きいという数直線と、左のほうが大きいという位取り表現のミスマッチが、「リトルエンディアンは(ビッグエンディアンよりも)分かりにくい」という、自分のような人間を産んでいるんだと考えています。


計算機内部(CPUチップ内部)の電子回路でみれば、同じバイト内で上位ビットが左側にあるということもなければ、メモリ上の上位アドレスのバイトが右側にあるということもありません。右とか左とかという概念は論理回路上にはありませんから。「回路図」上にはあるでしょうけど。

となると、論理的にはリトルエンディアンのほうが素直なのかもしれませんね。

| | コメント (0) | トラックバック (0)

2010/07/10

数学を独学中

1年くらい前から、突然思いついて数学の勉強を始めてます。

一応、30年くらい前に理系の学部を卒業しているのですが、あらためて勉強してみようかと思うとまったく覚えていない、というか、当時からなにもちゃんと理解していなかったことに愕然としてしまいました。

こんな状態ですから、いきなり難しい教科書を買っても無駄になることは明らかです。「(一応)理系卒の社会人向けの数学入門セミナー」みたいなものがあるといいのですが、さすがに自分で考えてもそんな需要の少なそうなセミナーは見当たりませんね。

数学といっても幅広いので、定番の遠山啓の「数学入門」上下を買って読んだり、インターネットでいろいろと検索してみたりして、自分の興味はどうやら、集合論、数論、代数、位相といったあたりに落ち着いてきたような感じです。これから気の向いたときに断続的に独学をしていきたいと思います。


数学の独学を始めて感じたのですが、数学のとっつきにくさのかなりの部分は、数学用語の難しさというか、日常生活と乖離した用語が多く使われているところにあるようです。例えば、代数で出てくる「群・環・体・束」とか、「位相」とか、集合論でも「内延・外延・羃」とか。これらの日本語(漢語)に翻訳されたものでも分かりにくいのに、外国人の名前に由来する「リーマン・ゲーデル・カントール・ヒルベルト・バナッハ・・・」みたいな。さらに表記として、ギリシャ文字やらアラビア文字やら、どう読んでいいのかわからないし、ましてや書けない文字が多すぎます。

もちろん、永い永い歴史のうえに構築されてきたものなので、今からこれらを変更することは事実上無理でしょうし、そもそも分かりやすく、体系化された用語を検討するだけで数世紀くらいかかるんじゃないかと思います。

| | コメント (0) | トラックバック (0)