日本でハリウッドVFXを制作! 「経産省アイディアボックス」 結果:  
●まとめエントリはこちら ●FAQ ●お問い合わせは左のメールフォームから
ラベル 演算 の投稿を表示しています。 すべての投稿を表示
ラベル 演算 の投稿を表示しています。 すべての投稿を表示

2009年2月23日月曜日

論理演算 (5) 「論理演算」は「計算」??

「演算」の定義には「数値計算」と「論理演算」が含まれる。
しかし、「四則演算」は「計算」であるとわかるが、
「論理演算」が「計算」であるといわれてもなかなか、ピンとこない。

おそらく「計算」の定義が明確には、わかっていないからだろう。
すこしそのあたりを調べてみたい。


--------------------
計算(大辞林 第二版より):
(1)数量を数えること。
(2)結果や展開を予測すること。。
「雨の降ることまでは―してなかった」「相手の反対を―に入れる」
(3)〔数〕 数や式を演算の法則に従って、結果を出したり式の変形を実行すること。

定義(3)は「演算」が定義に含まれていて堂々めぐりになるので、ここでは考慮しない。

「四則演算」はまさに「数を数えること」である。
数を数えるとは、複数の物があるときに、最初の数「1」に次の物の数「1」を足していき、必要なだけ、次々と「1」を足していくことである。
コンピュータでは、引き算、かけ算、割り算も二進数をつかって、すべて足し算によって答えを導き出している。
コンピュータでなくても、普通にかけ算「2x3」は「2+2+2」で求めることができ、まさに数を数えることである。

この定義は、納得できるし、理解しやすい。
問題はもうひとつのほうだ。

定義(2)は、「予測すること」とある。
予測とは、将来なにがおきるか想像すること。
その作業をステップごとに考えると、
1)ある事例をとりあげる。
2)そこに含まれる要素間の関係をみつける。
3)現在、目の前にある要素を、その関係にあてはめる。
4)それが、どのような答えになるか考える。
という手順を踏む。

「要素間の関係」とは「法則(一定の条件のもとで、必ず成立する事物相互の関係)」のことである。

これが「計算」の定義なのか??
いまひとつわかったようでわからない。
定義(1)は、狭義の定義(2)ではないだろうか?


--------------------
次にWikiを見てみる。

計算(wikiより):
与えられた入力に対して、あらかじめ決められた所定の "手続き" に従って演繹することである。


「演繹」の定義が、いまひとつなので調べてみる。

「演繹」とは:、
●一般的・普遍的な前提からより個別的・特殊的な結論を得る推論方法である。(wiki)

●諸前提から論理の規則にしたがって必然的に結論を導き出すこと。
普通、一般的原理から特殊な原理や事実を導くことをいう。(大辞林)



簡単に言うと、「一般的な前提から個別的な結論を出す。」こと。かな...。 (^^;)


もうすこしWikiを読んでみると、「演繹の代表例として三段論法がある。」
ということなので「三段論法」をしらべてみた。

--------------------

三段論法とは、

三段論法は「大前提」「小前提」「結論」の三つの命題がある。
「大前提」に法則的に導き出される一般的な原理を置き、「小前提」に目前の具体的な事実を置き、「結論」を導き出す。以下に三段論法の例を示す。

大前提:すべての人間は死すべきものである。
小前提:ソクラテスは人間である。
結論: ゆえにソクラテスは死すべきものである。


先ほどの計算の定義(2)で考えたことによく似ている。
考えたことが全く違っていたわけでもないようだ。
もう一度この三段論法にしたがって、計算のステップをまとめてみる。

1)一般的な原理(大前提)
2)目前の具体的な事実(小前提)
3)結論を出す。


四則演算「二つの数から新たな数を決定する規則を一般化したもの」である。

1)この「規則を一般化したもの」は「大前提」にあたり、「+」「-」「×」「÷」で表される。
2)そして具体的に今計算のためにつかわれる数字が「小前提」となる。
3)結果的に、「結論」を導き出すことが「計算」ということになる。


かなり自分にとって哲学的でわからないことだらけなので、間違っている部分もあるだろうが、
まるっきり外れてはいないだろう。


「論理的な思考にそって、何かを扱い結論を出す」ことが「計算」ならば、
「扱うもの」がなんであろうと「計算」ということになる。

物の量を抽象化した物が数字で、それを扱うのが「計算」
その数字をさらに抽象化しアルファベットで表したものが代数で、その式を扱うのも「計算」
抽象化した概念を扱い、論理の原理を記号化し、それによって論理的な思考をするのも「計算」

よって、論理演算も四則演算も「計算」ということになる。

2009年2月21日土曜日

論理演算 (1)

今日からしばらく、論理演算について勉強していくことにした。

プログラミングでは条件分岐が核となるということを以前につきとめたが、
(あくまで持論であり真偽は不明)
その中で、演算子は重要な役割をはたす。

Mayaヘルプの「値の検証と比較を行う」にMelで使われる演算子が表になっているが、
そこでも「論理演算子」がその一部となっている。

また先日の調べもののとき、見つけた「ITpro 5分で覚えるIT基礎の基礎
でも言われているように論理演算の習得はプログラミングにおいて必須のようだからだ。

プログラミング言語をマスターするには,論理演算を理解する必要があります。
論理演算が分からなければプログラムを作成できない,と言っても過言ではないでしょう。


Gihyo.jpの「はじめMath!Javaでコンピュータ数学」で
この論理の数学を学ぶことについて、もう少しその重要性を説明していた。


なぜプログラマが論理の数学を学ぶ必要があるのでしょう。
それは,論理の数学がプログラムの構造・動作を決定したり改善するのに役立つからです。

プログラムの骨組みとは論理構造です。
論理の数学は,理にかなって無駄がなく,美しいプログラムの骨組みをつくるために役立つのです。


--------------------
まず、細かなことを追求していく前に、論理演算の概略をつかんでおこうと思う。

論理演算と四則演算の大きな違いは,
論理演算が2進数の1けた(=1ビット)を対象としていることと,
演算結果が決してけた上がりしないことです。

論理演算は,2進数の1けたを対象として演算結果がけた上がりしないのですから,
0または1だけを演算し,その結果も0または1のいずれかになります。

複数けたの2進数で論理演算を行うこともできます。
ただし,論理演算はけた上がりをしないのですから,
複数けたの論理演算とは,1ビットごとの論理演算を複数同時に行っているのに過ぎません。


ここで重要なのは、
「論理演算は二進数の一桁を対象とした演算で、桁上がりしない。」
ということである。

ただしこれは、純粋にその計算を見た場合の最小単位で起きることであり、
おそらく実際のプログラム内では、もっと異なる対象を演算しているようにみえると思う。


つづけて「第二回 AND,OR,XOR,NOTの意味と使い方の総整理」をみてみた。

コンピュータは,あらゆるデータを数値で表します。

それなら,コンピュータは数値に対する四則演算だけができれれば十分なように思えます。
ところが実際には,そうではありません。

コンピュータは,本来なら数値でないデータも数値で表すからです。
このようなデータを演算する場合には,論理演算が大いに役に立ちます。

例えば,赤色と青色を混ぜ合わせて紫色というデータを得るには,赤色と青色でOR演算を行うことになります。
個々の論理演算の用途は一つに決まっているわけではありません。


そしてこのページのまとめは以下の通りだが、
それぞれの詳しい説明は一度このページを読んだほうがいい。

AND演算は「かつ」を表すもので,データをマスクするために使います。
OR演算は「または」を表すもので,データをセットするために使います。
XOR演算は「排他」を表すもので,データを部分的に反転するために使います。
NOT演算は「否定」を表すもので,データを全体的に反転するために使います。


第五回 真と偽の論理演算」ではさらに使い方についての説明があった。

If文の「もしも○○なら」の部分に複数のチェック条件を置くこともできます。

この場合には,個々のチェック条件を論理演算でつなぎます。

リスト3は,「もしも入力した値が100より大きくかつ 200より小さいなら,
メッセージ・ボックスを表示する」というプログラムです。
ここでは,And演算が使われています。

この場合には,個々のチェック条件の真偽に対して論理演算が行われるのです。
If a > 100 And a <>
「もしもa > 100というチェックの結果が真で,かつ,a <>
という意味です。


ここで、1ビットの計算を行うという点においては、具体的な演算だが、
最後の例ではA and Bのような、抽象的な概念を演算対象としている。

こういった抽象的概念への応用がほかにももっとあるなら
それを学習した方が、プログラミングには役に立つのではないか?


--------------------
メモ:

このページには、「比較演算」に関することで重要なこともかかれていた。

a > 100やa <>
意識していないプログラマが多いのですが,比較演算も演算の一種なのですから,
必ず演算結果の値を返します。
比較演算の結果は,真または偽のいずれかになります。

2009年2月20日金曜日

リンク

良いサイトがみつかった。

高校数学について、とてもわかりやすく説明してあり、
将来、いろいろなプログラミングの基礎となる数学を学ぶには良さそうである。


大学数学へのかけ橋!


ここにある本の第一章(pdf)を拾い読みしてみた。

pg5
なお,デカルトは数を表すのに,先ほど見たように,
文字 a, b, c などを用い,
文字によって数の演算を表現しました。
文字を使うと,特定の数でなく,どんな数でも表すことができます。
したがって,それらに共通する基本的な計算規則を明らかにし,
数の性質や方程式の解法を組織的に研究することが可能になりました。

これは「変数」の定義にもあてはまるのではないかと思う。。

また、ブール代数の例などを挙げ、

数学は,記号や数の意味を柔軟に解釈すれば,幅広い応用が可能になる(pg22) 

としている。
まさにプログラミングでは、記号に対しての柔軟な解釈がなされ幅広い応用がされている。

考えてみると、高度なプログラミングを行うようになると数学の知識は不可欠。
どこかで数学の基礎を勉強し直すことが必要になるだろう。

ちょっと脇道にそれるが、数学の基礎についての他のホームページを
上記サイトのリンクからたどってみた。


数学の散策路

ここで「数学トレッキング」というページにいろいろな数学の基礎知識がわかりやすく説明されている。
まず、そのなかの「26_数学は抽象化の学問」を読んでみた。

以下に、いくつかおもしろそうな記述を抜粋してみる。

しかし”3”は”さん”を表す記号であって”さん”そのものではありません
本が3冊,犬が3匹,人が3人…,から本・犬・人の固有の概念を取り去れば,
3と言う共通したものが残ります。これが抽象化です。

ところが中学校になると文字が登場致します。
「数に代わるもの」いわゆる「代数」です。
この文字は「数をさらに抽象化」したものです。
例えば,(-2)×(-3)=2×3,(-4)×(-5)=4×5を抽象化すれば(-a)×(-b)=a×bになります。
数字での計算はできるが文字になるととたんにわからなくなる人が多いのも,抽象化が一歩進むためです。

なるほど、そうだったのか。
たしかに抽象化して具体性がなくなることで、なにがいいたいのか把握しずらくなってくる。
そしてさらに記号(例:∧ ∈ ∩ f ≒)が増えていき、その定義付けがはっきりしていないと
そこで混乱が始まり、数学離れがはじまるのだろう。

プログラミングでは、
この記号と、関数、それを扱う文法、など決まりだらけ、そしてほぼすべてが抽象化されている。
初心者で、そういった抽象化を扱うことになれていない人は、とっつきにくくなるのも
当然かと思う。


また、演算についてものべているページがあった。
32.数学の出発は演算から

「演算」と言うと誰もが思い浮かべるのは加減乗除の四則演算でしょう。
数学で言う演算はもっともっと広いものです。
原則的には「あるものにある操作をすること」はすべて演算になります

ただし何でも演算になるわけではありません。
「あるものに同じ条件で同じ操作をしたとき,いつも同じ結果が(原則として)ただひとつだけ決まる」と言う約束があります。

このホームページには
「論理」の散歩道というページもある。
論理学を勉強し直すときには是非よんでみたい。

2009年2月19日木曜日

演算子 (番外編1) 写像

「演算」、「四則演算」、「二項演算」とかの用語をWikiなどで調べていると「写像(mapping)」ということばに頻繁に出くわす。

すぐにそのリンクへ飛んで、その説明を読んでみるが、
いろんな数学的な記号がでてきて、すぐにリタイア。

ちゃんと理解するのは難しそうだったので、いままでスルーしてきたが
「演算」の定義にも深く関係している。

それに、
写像は集合とともに現代数学の基礎となる道具の一つである。
現代数学のほとんどが、集合と写像の言葉で書かれているといっても良いほどである。
wiki)


ということなので、そろそろ、本腰を上げてしらべておいたほうがよさそうだ。

写像とは「像を写す」ことつまり鏡のようなものですね。
代表的なものが、狭い意味の写像の、関数ですね。
2X+5という写像は、たとえばX=3という点を11というところに写し出す鏡です。
(Yahoo知恵袋「写像」とは

Xからyへの変換を考えます。
この操作を写像と呼びます。
ここで、yが実数や複素数なら、
この写像を、関数と呼びます。
はてなQuestion


ここで思いがけずひろいものがあった。
写像の説明はまさに「関数」だ。

これは数学の「関数」の説明だが、
x (input) → 機能f (function) → y (output)
という説明は、プログラミングの「関数」でも同じだ。
(「関数」はCやJavaでも出てくるが、Mayaでもcos、angleなどの関数がある。)


また、「写像」は「集合」を扱うことでもあるらしい。

写像(しゃぞう、mapping, map)とは、二つの集合が与えられたときに、
一方の集合の各元に対し一つずつ、他方の集合の元を指定して結びつける対応関係のことである。
wiki)

確かブール代数でも集合を扱うので、なんらかの関連があるだろうし、
コンピュータとの理論的な親和性も高いことが考えられる。


おもしろいのが、写像は英語では「Mappingもしくはmap」であるということ。

これをUVマッピングのしくみで考えてみた。
UVマッピングでは、まず画像があり、
そこにUVと呼ばれるオブジェクトの展開図がある。
UVと実際のオブジェクトのサーフェイスは位置情報が一対一で対応している。
結果として、オブジェクト上の対応した一にもとの画像が表示される。

元の画像を「集合A」
オブジェクト上に表示された画像を「集合B」
とするとUVレイアウトは、その対応関係を示しているので、「写像」ということができる。
まさに目に見える「写像」である。

演算子 (2) その定義

今日は「演算子(operator)」の定義と語源を探ってみた。

まず「演算子」の意味。

各種の演算をあらわす記号のことである。(wiki)

コンピュータプログラミングにおいて、演算内容を指示する記号などのこと。
演算の対象となる値や変数などは「被演算子」または「オペランド(operand)」という。
(e-Words)

以上で、演算を表す記号と言うことはわかったので、もう少し踏み込んでみたい。


--------------------
「演算子」は「演算」+「子」の二つの言葉から出来ている。

まず、「子」だが、

小さな塊、一単位の意味でも用いられる。
粒子・分子・原子・陽子・電子などがそれ。
(用語・"子"という字

「子」というのは、「演算子、」「識別子」などのように、
ある性質を持った部分文字列のことでしょう。(教えてgoo


「子」は、一単位としてカウントできる一群の文字列ということらしい。
演算を表す最小限の文字列、それが演算子ということでいいだろう。


--------------------
次に「演算(operation)」の定義は:

演算とは、加算や減算、比較といった計算処理のことである。
四則演算(加算・減算・乗算・除算)・比較演算・論理演算などが演算に含まれる。
演算はコンピューターの五大機能のひとつとして数え上げられる。
IT用語辞典バイナリ


実はwikiで調べると「演算」は「算法」へ転送されてしまう。
そして意味は、

1. 計算機科学の分野でアルゴリズムの訳語として用いられる。

ということでアルゴリズムと言うことになってしまっている。

このページの下の方に「命名について」という項目があり補足がされている。

「算法」は「計算の規則」あるいは「計算の方法」を連想させ、「演算」は「計算を演ずるという行為」を連想させ、ともに「写像」としての「算法の概念」を連想させにくい。

意味的には同じだが言葉自体は、若干イメージのわきにくい言葉になっているようだ。

ここで、「演ずる」とは当然ながら「劇などをおこなう」ことではなく、

(2)ある役割をつとめる。はたす
三省堂提供「大辞林 第二版」

「演」という漢字の由来は、
「水+寅(まっすぐのびる)」の会意兼形声文字で,引くまたはのびるの意。
 演説の演は長く引き延ばして説明すること。
はらきんHP 漢字の由来

というふうに、「演」とは「何かをのばす」ことからきて、「時間をかけてなにかをする」ことに用いられているようだ。

そこから考えると「計算を時間をかけて行う」これが演算の意味ということでよいだろう。

ちなみに「算」の由来は
:「竹+目(算木=数え棒?)+廾(両手)の会意兼形声」で、竹でできた算木を両手で数えるさま


--------------------
こうしてみていくと
「演算子」とは、「計算」という行為を表現する最小単位ということになる。

1+1=2だと「演算子」は「+」と「=」だ。
(もっと正確に言うと、「+」は算術演算子、「=」は関係演算子 とうことになる。)


「1」と「2」は、数字であり、それだけでは計算は意味しない。
「+」記号は、それだけで、足し合わせるという「計算」を表現している。

ようするに「+」記号は「計算」という行為を表現する最小の単位ということになる。


「演算子」には、上記の「算術演算子」、「関係演算子」に加え、「論理演算子」がある。
それぞれの詳細はまた別の機会に調べてみたい。

ちなみにMayaのヘルプでは「関係演算子」が「比較演算子」と表記されている。


またプログラムと数学では「演算子」の種類やルールに若干の違いがある。

独自の演算子。(例:if-elsを意味する「?:」演算子。割り算の余りを求める「%」演算子)
数学とは表記が異なる。(例:平等を表す「==」演算子)
数学より機能が拡張してる。(例:「+」演算子で二つの文字列を連結。)
数学とは機能が異なる。(例:「=」で代入)


最後にITproで見つけた記事より:
コンピュータの世界では,計算のことを演算と呼びます。
コンピュータにできる演算の種類には,
数学の加減乗除の四則演算の他にもいくつかの種類があります。

その中でも,いかにもコンピュータらしく,かつ,よく使われるのが論理演算です。
Basic,C言語,Javaなど,何らかのプログラミング言語をマスターするには,
論理演算を理解する必要があります。
論理演算が分からなければプログラムを作成できない,と言っても過言ではないでしょう。

ということだ。
確かにコンピュータは、引き算でさえ、回路的には論理演算で行われており、
論理演算は、その基本的な部分だけでなく、広く応用されていると思う。

論理演算をぜひマスターできるように頑張ろう。

2009年2月17日火曜日

比較演算子 (1)

最近、Melのヘルプを少しづつよみすすめているが、
今日は、プログラミングの要、条件分岐の重要な要素である「比較演算子」を理解するためにいろいろと調べてみた。

比較演算子は、
式と演算子 (Lesson4) によると
変数や式の値を比較して条件式を作り、その結果により処理をかえる。
条件式は、条件が成り立つかどうかboolean型の値(「真(true)」または「偽(false)」)で返す。

というふうに、
変数もしくは、式、数値をその両辺におき、その値を比較する。

そしてその演算子に応じた結果をTrueか、Falseで返してくる。




Mayaのヘルプで、比較演算子 の表をみると
(5 != 10)  5 は 10 と等しくない  true
という説明がある。

ここで一番左の部分は「エクスプレッション」という項目名になっているが、これは「式」という意味である。
Expression(式)(wiki)




さてMayaヘルプの表では、「!=」は「等しくない」と簡潔に説明されているが、
「!」は論理演算の「NOT(否定)」を意味し、「論理演算子」の項目にもある。

これは、C言語,Perl,Javaなどと同じ表記である。
ちなみにVBAやPascalでは、「<>」と表記される

否定(ひてい)とは、命題の真と偽を反転する論理演算である。
否定は英語で Not であるが、Invert とも言われ論理演算ではインバージョン(Inversion)、論理回路では Not 回路やインバータ回路(Inverter)とも呼ばれ入力に対して出力が反転する。


http://www.monmon-dance.com/c/c_3.html
真である被演算数を偽、
偽である被演算数を真
にする。


よって、「!=」は「イコールの反転」=「イコールでない」を意味することとなる。