はてなキーワード: 演算とは
Portalの解説
謎の実験施設のようなところから脱出するのが目的のパズルアクションゲーム。
主人公は青い球と黄い球の二種類の鉄砲を打つことができ、青い球を壁に向かって打つと、青い壁が
そして、青い壁と黄色い壁は繋がり、空間を超えて行き来できるようになる。
例えば、部屋の向こうに行きたいんだけど、小さい穴しかなくて通れないみたいなときは、
その穴の向こうの壁を黄色で撃ち、手身近な壁を青色で打つと、部屋の向こうにワープできる、みたいな感じかな。
加速度とかも物理演算されてて、落下しながら、黄色と青色を打ち分けて、じょじょに加速度をあげながらジャンプしていくステージが僕はお気に入り。
NULL ならではの演算が含まれる振る舞い((NULL = NULL)はNULL、(FALSE=FALSE)はTRUE など)の特性をもつ場合にこそ、bool? を使いたいですね。
わたしの「スリーステート」という言葉の発想が、デジタルIC の端子 HIGH(1),LOW(0),HIGH-Z(電気的切り離し)から来ていたから、そこをしっかり説明しておくべきだった。「スリーステート」の言葉を直訳すれば3状態だけど、いくら3つの状態をもつからとて、なんでもbool?にはしないっすよ。大抵は私も列挙型を使いますね。しかしながら、値的に宙ぶらりんで集合演算にも参加しないような(しかし存在はしている)値をNULLと解釈できる人が使えば、bool?やint?はとても有用かと(DBやEXCELの空セルとも直交性がある)。そのあたりの意味がピンとこないようなら、手をださないほうがいいです。
現実問題 中身を実装するとこういうことだよねぇ。
class { bool nullable, bool value, bool operator == (NULL){ if(nullable){ return true; } return false; } bool operator == (bool){ if(nullable){ throw; } if(value){ true; } return false; }
というオーバーヘッドとフットプリントを許容してまでクラス化するようなものなんだろうか?
便利そうだけど すっげぇ 気になる。
C#だからいいような気もするが、 bool演算一つのために 関数コールして ifステートを複数回判定するのはオーバーヘッドが大きすぎる気がする。
何言ってるかまったくわからないところがある。
たとえば、
人の内部世界である演算領域内で組み立てられた魔法式を、無意識領域の最上層にして意識領域の最下層たる「ルート」に転送、意識と無意識の狭間に存在する「ゲート」から外部情報世界へ投射することにより、魔法式が投射対象たる「事象に付随する情報体」――これを現代魔法学では、ギリシャ哲学の用語を流用して「エイドス」と呼んでいる――に干渉し、対象の情報が一時的に書き換わる。
(1巻、pp.104-105)
文章研究としてこの本をかなり真面目に精読してたんだけど、それでもこの文章読んでなにがなんだかよくわからない。いまの中高生ってこういう文章読めるのか。冗談でもなんでもなくニクラス・ルーマンより難しいと思った。ここまでなにいってるかわからない読書体験(しかも小説、しかもラノベ)なんてはじめてだ。にわか文学ファンはトマス・ピンチョンが好きだけど、そのピンチョンよりはるかに読みにくい。
ほかにもいろいろあるけど、ちょっと驚いたのは、
達也の浮かべた苦笑いは、苦々しさのないただの苦笑に変わっていた。
(1巻、p.71)
これ。苦々しさのないただの苦笑ってなんだろう。哲学的といえば哲学的だけど。撞着語法かな? 「苦笑」って辞書的には「にがにがしく思いながら、しかたなく笑うこと」(明鏡国語辞典)なんだよね。いや、べつに辞書が正しいって言ってるんじゃないよ。ことばの意味ってのは文脈に応じてアドホックにどんどん変わっていくものだからね。でもそれにしてもこの語法は難しすぎるんじゃないか? ある種のアイロニーなんだろうか。難しい。
ところで論証はどこに書いてありましたでしょうか?
ここでいう論理とは、思考の形式及び法則である。これに加えて、思考のつながり、推理の仕方や論証のつながりを指す。よく言われる「論理的に話す、書く」という言葉は、つながりを明確にし、論証を過不足なく行うということである。
論理学は、伝統的には哲学の一分野である。数学的演算の導入により、数理論理学(記号論理学)という分野ができた。現在では、数理論理学は数学と論理学のどちらであるとも(時にどちらでないとも)される。現在の論理学は、(それを論理学であるとするなら)数理論理学と、数理論理学をふまえた論理学、数理論理学でない論理学に分化している。
弁証法なども、「論理」なのであるが、論理学における論理とは異なる。これらは、論理というよりむしろ理論 (Theory)である。
というネタを考えたけど、面倒くさいのでやめた。
後は頼む。
~~~~~~~~~~~~~~~~~~~~~
(前略)
例えば一番ベーシックなCPUでも、安いとこではセレロン、センプロン、5000円~1万前後ではペンティアムデュアルコア、アスロンクアドコア、1万5000円~ではコアi3、コアi5、カヴェリ(A10)、3万円前後ではコアi7、ジーオンと多種多様です。上にあげたものは全て演算処理するだけの、ただのCPUです。ですが、それぞれ3DMarkだったり、FFXIVベンチだったり、PCMarkだったりが少しずつ違ってきます。
この中から、一番自分に似合うものを探すのが、自作をするということです。決して10スレッドのCPUを買うことではないです。(Haswell世代はセレロンでも2コア2スレッドなので最低でも2スレッド、あとハイパースレッディングで4スレッドのもある)。
(後略)
近年、関数型プログラミングの重要性はいろんなところで叫ばれています。
Javaの最新バージョンに関数型プログラミングに関する新機能が加わりました。
Rubyも昨今、関数型プログラミングへのサポートが手厚くなってきています。
プログラミングの教科書の大手、オライリー社から、Javascriptで関数型プログラミングを行うための解説書が発行されました。
関数型プログラミングへの注目度は高まってきています。
おそらく、みなさんは既にオブジェクト指向が何か、を知っています。
でも関数型プログラミングとは何か、胸を張って語れる人は、周りに見当たらないかと思います。
実際、オブジェクト指向によってプログラミングする方法は、わかりやすい解説があちこちにある一方で、
関数型プログラミングとは何か、何が良いのか、ということについての、よいまとめは見つけることはできませんでした。
この記事を読む方の中で、「関数型プログラミングを取り入れるか・取り入れないか」で切実に悩んでいる人は、おそらくいないでしょう。
この記事はあまり細かいところに立ち入りません。関数型プログラミングを使う側の立場に立って、利点や向き・不向き、それが導くスタイルを書きました。
みなさんは鳥のように飛んで、高い空から、関数型プログラミングとは何か、何が良いのか、を見渡してください。
オブジェクト指向的アプローチは、名前をつけてプログラムを整理する。
関数型プログラミング的アプローチは、汎用部品でなんとかする。
Googleが近年リリースした言語、Goには、”継承”を直接サポートする仕組みが無いことが話題になりました。
また、Mac OSXの基幹ライブラリCore Foundationは、ライブラリ自体はC言語で書かれているにもかかわらず、その設計方針は明確にオブジェクト指向です。
その本質とは"名前をつけて対象を識別し、それを扱うこと"、にあります。
最もプリミティブなオブジェクト指向の対象は、ファイルハンドラです。あるファイルを開いて、読み込んで、あるいは書き込んで、ファイルを閉じる。
これらの処理をまとめたら、わかりやすいですよね?
対象に関する処理を、対象の周りにまとめる。これがオブジェクト指向の基礎的な理念です。
識別することとイコールで比較できることは、とても良く似ています。
イコールによる比較は、オブジェクト指向では鬼門であることが知られています。
PointクラスのインスタンスとColoredPointクラスのイコール演算をどう決めればいいかに、正解はありません(詳しくは"effective java"をご参照ください)。
また名前をつけて識別する対象は、フワフワしていてはいけません。
たとえば、"軍人の階級"をオブジェクトにしたとしましょう。"大佐"クラスのある兵士は名前のフィールドや、性別のフィールドを持っているでしょう。
ところで彼が昇格したときに何が起こるでしょうか。
新たに"少将"クラスのインスタンスが作られます。"大佐"クラスを破棄する前に、名前、性別、その他沢山のデータを引き継がなくてはいけません。フィールドを増やしたい場合はその都度コードに修正を加える必要があります(*)。
なるべくイコール比較を避けたい。対象は不安定なものではいけない。では何に名前をつけて、識別するか。そこにオブジェクト指向技術者の熟練度が現れるのです。
一方、関数型プログラミングでは、特定の何かに名前をつけるより、極力、汎用部品でなんとかしようとします。
関数自体をリストなどのデータ構造に詰めることもよく行われます。
実は、関数型プログラミングというのは本質を表していません。
関数をはじめとして、リスト・ツリーのようなコンテナ、手続きを抽象化したもの、回路を抽象化したもの。
あらゆる対象を値として、合成し、ときに分解し、新しい値を作ります。
変数に適用する処理を作りあげることが、とても簡単だからです。
四則演算が定義されたデータを詰めたデータ構造もまた、四則演算可能だったり。
誤解を恐れずに言うと、オブジェクト指向がトップダウンなのに対し、関数型プログラミングはボトムアップです。
関数型プログラミングをサポートする言語には、沢山の汎用部品が定義されています。
このような構造をインターフェイスとして、様々なライブラリが組まれているので、
たとえばモナドを知っていれば、30分程度でパーサー(解析機)を理解することができて、
パーサーを理解できれば、JSONパーサー・ XMLパーサー・markdownパーサー・C++パーサー ... などを理解するのはとても容易です。
理解しやすいこと。これが関数型プログラミングの大きな利点です。
追記:
また、汎用部品と型のお陰で、ライブラリのドキュメントが圧倒的にひきやすい、というメリットも有ります。
Haskellな人がPythonにトライした結果 - Togetterまとめ
関数型プログラミングは「厳密な事前設計を必要とするため、簡単なことをやるのにも時間が掛かる」。
>> map (*2) [1,2,3] [2,4,6]
邪魔な”儀式”や、"おまじない"のコードが徹底的に撤廃されているためです。
関数型プログラミングのコードは、潔癖かつ濃密です。
たとえばC言語でint hoge(int x,int y)が定義されているとき、hoge(3)はなんの意味も持ちませんが(コンパイルでコケますが)、関数型プログラミングでは意味があり、実際に有用です。
上の例では、「掛け算をする」(*)関数は、二引数関数ですが、それに引数を渡して作られた「2を掛ける」関数(*2)は、一引数関数になります。
関数型プログラミングでは、「簡単なことは簡単にでき、複雑なことは複雑にできる。ただし、間違ったことは殆どできないか、全くできない」。
また、静的型付けの力によって、コード補完は非常に強力になっています。インテリセンスの比ではないです。
たとえば、関数中のある表記の型を任意に表示できます(GHC/TypedHoles - HaskellWiki)。
やがてやってくる未来には、プログラムをテキストエディタで書くことは時代遅れになっているでしょう。
統合環境のサポートで、バグやミスの少ない、スムーズなプログラミングができます。
そしてその環境で動くプログラミング言語は、関数型プログラミングをサポートした言語なのです。
以下の様な兆候を感じたら、あなたはそのプログラムを関数型プログラミングで書くべきです。
一般に、オブジェクト同士の相互作用が複雑になるほど、オブジェクト指向では手に負えなくなっていきます。
そういうときは、オブジェクトを直接扱わず、替わりにその"相互作用"を扱うことで、複雑さを軽減するアプローチが有効です。
それこそが関数型プログラミング的アプローチです。
特にオブジェクト指向が有効なのは、プログラミング初心者がそのコードをいじるかもしれないときです。
関数型プログラミングは、強固さと柔軟さの代償として、高い学習コストを伴います。
オブジェクト間の相互作用が複雑でなく、着目している(名前をつけている)概念が安定しているとき。
そして、プログラムをいじる人たちの間で共通理解が図れているならば、オブジェクト指向が有利です。
遅延評価という機能によって、レガシーな言語で扱えなかった、巨大な数を扱うことができます。
関数型プログラミングで書かれたプログラムは、正確さが要求される、金融関連の業界で使われています。
手続きとしてパーサーを記述できるので、テキスト処理プログラムはより理解しやすく、メンテナンスしやすいものになります。
関数型プログラミングを知らない人は、「正規表現でおk」と言いますが、
彼の書いた複雑な正規表現は、半年後には(書いた本人でさえ)理解できなくなっていることでしょう。
手続き一般を扱うことができるので、途中で割り込みのある手続きの表現も容易です。
関数型プログラミングをサポートしていない言語ではコルーチン(ファイバー)などをつかってなんとかするしかありません。
さもなくば、非並行処理では普通に関数として記述できるところを、並行処理のために、Builder,Strategy,Command,Interpreterパターンを駆使して書き直すことになります。
Javascript使いの方は、Deferredなどの構造を使うでしょう(http://qiita.com/KDKTN/items/4c6986049d204f0645d8)。
C++使いの方はBoostで頑張りましょう。破滅的に解りにくいコンパイルエラーメッセージと格闘してください。
もう少し簡単な例をあげます。
あなたは、あるレシピにしたがって、自動的に料理を行うマシンの制御プログラムを書いているとしましょう。
1. まず玉ねぎを炒める。
2. 飴色になったら、肉を加えて炒める。
3. 野菜を加える。
4. 水を加えて煮る。
5. スパイスを加える。
…できませんよね?何故ならば、各ステップの"間に"、マシンのロボアームの位置や動きを調整する処理が必要だからです。
これをオブジェクト指向でやろうとすると、各ステップの副作用として、それらの処理を行うことになります。
そうすると、マシンが二機に増えた時などの変更量は、絶望的なものになります。
あるいは関数として表現するのを諦め、手順全体をDSLで記述できるようにします。
このアプローチは関数型プログラミング的です。しかし関数型プログラミングをサポートした言語の助けなしでは、そのDSLを記述するために沢山のユーティリティーコードを書かなくてはならないでしょう。
オブジェクト指向的アプローチでこの問題をエレガントに解こうとすると、クラス化の粒度を上げる事になります。
野菜クラス、フライパンクラス、ボイルクラス、フライクラス、焼き加減クラス、アームクラス、野菜の大きさクラス、切り方クラス、焼き方クラス、"焦げたよ"クラス、etc...
こうすると早晩レシピはプログラムのコード上から消え去ることになります。上記のたった5行は、依存性注入のオブジェクトグラフを構築するコードに取って代わることになります。そこには沢山の挙動の制御がオプションとして付記されているのです。
カレーなど、ある種のレシピに限定することで、見た目の理解しやすさを得ることができますが、一方それは表現力を損なうことを意味します。
C言語などではマクロを使うこともできますが、それは結局、関数型プログラミング的アプローチの意味するところと同じになります。すなわち、補助のために沢山のコードを書くことになるでしょう。
iOSのAppstoreアプリは、"無料"と書かれたボタンを押すと、それが"インストール"ボタンに変わり、それをもう一度押すと、ダウンロードの進捗を表すインジケータに変わり、それを押すとダウンロードをキャンセルできます。
このように、位置は同じなのに、ステートに依って見た目と機能が変わるボタンは複雑です。
これをオブジェクト指向で実現しようとすると、
という下らない問題にぶつかります。
一方関数型では、"機能"、"見た目"、"状態"、を独立に扱って、それらを合成してボタンを作るので、迷うことはありません。
「同じ位置にあるUIオブジェクトは、コード上で(インスタンスとして)独立して、他から干渉を受けない」
この条件が満たされているうちは、オブジェクト指向でGUIを実現することに無理はありません。
しかし、携帯端末のような小さい画面で、多くの機能を達成するためには、UI要素はコンテキスト依存的に複雑になりがちです。
近年、PCのディスプレイの大きさは、頭打ちになってきました。
画素数は増えているのですが、MacにおけるRetinaのように、複数ピクセルでひとつのドットを表すようになってきています。
これは、ひとつの画面に置かれるボタンなどのUI要素の数は、これから先の未来で増えることはない、ということを意味します。
したがって、未来のGUIのプログラミングは、注意深く機能をピックアップして制限するというデザイナーの努力を脇におけば、
関数型プログラミングの力を頼るしか無いでしょう。
つまり…
Haskell さいこうなのおおおおおおおおおおおおおおおおおお!! おしっこ漏れちゃうのおおおおおおおおおおおおおおおおおおおお(゜∀。)ワヒャヒャヒャヒャヒャヒャ
1. google:すごいHaskellたのしく学ぼう を注文する。
2. Download Haskell を自分のPCに導入する。
3. コンソールにghciと入力して、対話型コンソールを立ち上げる。
4. 次の関数をコンソールに打ち込んで、結果を見る。即値で書かれているところとかをいろいろ変更してみて、感動する。
take 4 $ map (*2) [1..]
追記:
いかがでしたか?
ちまたには、関数型プログラミングの利点は変数が無いことだ、とか、より安全だから、とか、より速いから、などという妄言が満ち溢れています。
オブジェクト指向と関数型プログラミングは、水と油ではありません。プログラマは自分のプログラムに最適なアプローチを選ぶことができます。
一般にはあまり知られていないことですが、Haskellにもオブジェクト指向へのサポートがあるんです(Lensライブラリ、これを使用したサードパーティ製ライブラリも最近増えてきています)。
この記事を読んだオブジェクト指向プログラマのあなたが、少しでも関数型プログラミングに(そしてHaskellに)興味を持ってくださって、ホームセンターの大人用オシメのコーナーが大賑わいになれば幸いです。。
電王戦ですが、「指し手が変わった」って怒られているのは、なんだか不思議な感じがしました。
「お前、昨日までそんなに強くなかったじゃねーか!」
と言われているようにも聞こえました。
体一つ、頭一つ、たった一人きりで分の悪い戦いに立ち向かう棋士へ
一般人があまり軽々しく物言うべきではないかもしれないですね・・・
もうそんなにコンピュータが強くなってしまったのなら、人間同士のルールではなく、
人間対コンピュータ用の新しいルールがあればいいのになぁと思いました。
(あるのかな?)
途中交代は随時。
攻めの棋士が敵の牙城を崩し、
守りの棋士が防御を固め、
復活の棋士が手駒を集め、
混乱の棋士が相手を幻惑する。
ターン制ではなく、リアルタイムでもいいかもしれませんね。
それであれば途中交代ではなく、全員同時参加で。
電王戦以前にも、将棋に興味はあった。 子供の頃は親となんどか指したし、高校の頃も何十戦か友達と将棋を指した。
だが、定石を覚えるのが面倒だし、強い人相手だと同じ戦法で延々ボコされたりとつまらなかった。
漫画では、ハチワンダイバーは面白いなあと見ていたし、ハチワンダイバーを理解するために、『最強将棋 激指スペシャル2』という、基本的な定跡をだいたい網羅していて、将棋ソフトまでついてくる本を買って、一応戦法の種類はだいたい把握した。
その程度の知識だった。
電王戦が始まる1年前に、『人間に勝つコンピュータ将棋の作り方』というのを読んでいた。 どうやら、10年後にはコンピューターにプロ棋士は勝てなくなるぞ。的な内容だった。 正直、うさんくさかったw 内容も、どうやったらアルゴリズムがよくなるか?について書いてあったが、『そんなんで勝てるの?』というのが正直な感想だった。
確かに、将棋24で勝ちまくるのは可能だろうけど、プロって本当かよという印象。
だが、電王戦で、「はじめてプロ棋士が負けた!」 → 「おいおい、速効次もかよ!」 → 「え???塚田プロって昔すげえ強かったんじゃ、、、ひきわけ?」 → 「はぁ????A級がボコられた??? A級って一番強いんじゃなかった????」
と、ものすごくびっくりした。
正直、その時は、A級の三浦ってだれ? 塚田ってどのくらいの人なの? 橋本より強いのって出てるの? 船江って人はどのくらい強いの? とまったく理解していなかった。
理解していなかったが、ツイッターや2chでおもしろ半分で煽りまくっていたw
『プロは雑魚w』 『あと数年でスマホにもかてねえゴミどもw』 『プロ削減しろ、終わったんだよ』 『どーでもいいから、三浦とかわけわかんねーやつより羽生とか渡辺だせよ、はあ?森内???だれだよそれ、しらねーよ、そんな聞いたことも無いゴミ』
みたいな。
いやもちろん、ネタなんだけど。
そういうレスであふれかえっていたので、なんとなく便乗した。 とにかく、「真剣にやってて、ガチ天才と言われてる奴らが惨めに負けていくのが凄く楽しい」というルサンチマンだった。 「所詮人間の天才なんて、こういうアルゴリズムの数量押しの凄く低い段階なんだよw」という感じで溜飲を下げていたのだと思う。
その後、A級、B1,B2棋士をだいたい覚え。 それぞれの将棋の戦法もある程度覚え、狙いも覚えた。 将棋の歴史や、戦法の趨勢も、まあまあ把握した。
で、ハム将棋にはほぼどんな戦法でも完勝するくらいにはなった。
将棋講座なり買って読むし、NHK杯も見るようになった。 棋譜を漁って見ることも覚えた。
なんというか、普通に面白い。 人間がコンピューターに負けたとか関係無く、すげえ面白い。
てか、コンピューターに人間が勝てないってのは、当たり前というか。
まあ、人間はプロ同士でも、「詰みを逃した」とか、「終盤よく分からない」とか普通にあるけど、ソフトは演算で全部読むから、そりゃミスらない。 下手したら、30手くらい読むわけで、将棋がせいぜい100手~200手で終了するゲームだということを考えると、そりゃ終盤は勝てない。
じゃあ、中盤はどうだろう?
中盤ってのは、プロの腕の見せ所だけど。 プロ同士でも、「ミスの少ない手」を選び続けるということが多い。 そう、ミスをしない手を選び続けるわけだ。 コンピューターの場合「ミスをしない」のは当たり前だし、「ミスを全部潰した上で、画期的な手も読むことができる」というアドバンテージがある。
そうなんですね、プロ同士では、お互い人間だから、「ミスをしない手を選び続ける」ことがそのまま優位性につながるけど。 vsコンピューターだと、相手はミスをしないのに、こちらはミスをしないことに気を遣うだけでなく、相手に良い手を指させない事まで考えないといけない。 vs人間にくらべて、読む量や精度が格段に求められてしまうんですね。 人間相手だとあり得ない精度をやってくるわけで。 中盤は、コンピュータが強いというよりは、「人間にとって不利すぎる相手」になってしまう。
じゃあ、序盤は? そう、序盤こそ勝ちうると思います。 コンピューターは、所詮序盤は人間の人まね段階です。 ここで、「新構想」とかで勝ちうるってのはあると思います。 ですが、「新構想」ということは、「研究が整備されていない」ということです。 研究が整備されていないものをミスなくさせるでしょうか? あやしいですね。 ですから、新構想でコンピューターに勝つというのは、厳しい。 さらに、新構想なんてあるなら、vs人間でのタイトル戦に温存するわけですよねw
さらに、時間。 人間同士で4時間持ちなら、 お互い4時間めいいっぱい使って、8時間だけど。 コンピューターは4時間も使わないわけで。 結局人間にとって不利。
結局、コンピューターと人間がやるにするには、あまりにもコンピューターが有利すぎる。
ってことで、ハード貸し出しとか、当たり前だと思いますよさすがにw 人間は見えないところでハンディあるわけですから。
①序盤の構想 → かなり新構想とかが出るわけです、何がでるかな? 相手の研究を外すためにどんな戦法を出してくるのか? 鍛えてきたのか? なんというか、カードゲームで、『どんなデッキ構成で挑むか?』というメタゲーム的なおもしろさがあります。
②中盤の勝負 → 中盤では、ミスをしないこと+終盤への構想や形作り がなされます。 パワプロで言えば、選手選びに近い感覚でしょうか? 投手の控えやバッターの並びなどで試合結果が変わるので、ここでの考えが大事です。 守備と攻め、両方を考えてメンバーを組むみたいな。 また、ここでも新手ってのが頻繁に登場するので、そういうワクワクがあります。
③終盤の勝負 → 実は、ここが面白い。 終盤って、格闘技に似てるんですよ。 『相手を責め続ける』&『自分も致命傷を受けないようにかわす』これがギリギリまで続きます。 約30手ほど、ギリギリの攻防が続きます。 攻めがキレたらホボ負けますから、攻めを切らしてはいけないので、駒を得ながら切りながら攻めまくります。 また、相手が攻めてきたら相手の攻めを切らすまで受けます。 ボクシング的なおもしろさです。
④漫画のようなおもしろさ。 いやーホント、序盤中盤終盤、全部面白いのが将棋。 マジで漫画か小説で、ものすごい傑作を読んでいるようなおもしろさです。 ホント漫画みたいなドキドキワクワクの場面、行き詰まる戦闘シーン。 そういう感じです。
コンピュータが強いとか関係無く、普通に面白い。 でも、コンピューターが指しても面白いんですけどねw確かに。
⑤人間同士の戦略 → メタゲームがホント凄いゲームなんですよ、将棋って。 「相手はあの戦法しかしてこないから、この戦法」とか、「あの人には勝率悪いから、研究で研ぎ澄ませたこの手を打って困らせよう」とか、「自分にとっての大一番以外の対局では磨いた研究を使わず、自分にとっての大一番だけ研究を放出しよう」とか。 そういうのがホント面白い。 その場だけの勝負じゃなく、研究段階で、カードゲームのデッキ構成があるんですよ。 ただ強いデッキを用意するんでなく、『相手によって対応を変える』というメタゲームがあるんです。 これは、コンピューター将棋にはなかなか見られない。
UA)、P(「AGL」、WA );コ= H}; んばぁ YA = = 0kzrr(「0.1」、0.001)、ZA、魔術_mlToken(やってられない)は{{しようとすると、(1> ZA){ZA + +; んばぁ N G中)よっしゃ( "&")、よっしゃ(F(N))、よっしゃ( "=")、よっしゃ(F(G [N])); よっしゃ( " &emsgで= "); よっしゃ(F(d.amen +": "+ d.message));でぃ。んばぁ Q = l.join(にゃん; AA(Q)&&(Q = q.substr(0,2 E3 ))、C = Q;でぃ。んばぁ Y = window.gbar.logger._aem(やっぱりU(Y)}}キャッチ(Y){}} んばぁのAA =魔術(A){2E3 <=戻りでぃ。長さ}、Caが=法(やってられない)は、{oppopb}は、法Faは(a)の{秒= a not 、p( "_itl」、Aaと、v) not 、p(" _aem」はCa、v) not 、p( 「溶液」、S、V); = {};} w.er = aで課( にゃんファ(法の(a?){スロー;}):課( "1")&&は、Math.random()を<屋FA(_mlTokenを)&&、んばぁの_Eは=「左」とGa = "og.og.en_US.sgltoKYT_Uc.O"、ハ= KA( にゃん、K =魔術(やってられない){んばぁ C = 肯定する 、J(やってられない)は、| |(肯定する + =( "" "= C!": にゃん+ b)は}、L =法(やってられない)は、{んばぁ D =引数; h.qm(法(){[B]に適用(本、D)。})}}、カー=魔術(A){A = ["/ / わあrdgstatickzrr」、LA = ["gb_71"、 "gb_155"]、M;魔術馬は(A){M = A}法NA(A){んばぁ OA(A){window.gApplication &&(a.href = window.gApplication.getTabUrl(a.href))}法PA(A){{しようとんばぁ んばぁ Qaは=魔術(){用(んばぁのA = []、B = 0、戦争C = LA [B]; + + B)(C =のhAtta.getElementById(やっぱり)&& a.push(やっぱりoppopA}、Raは=魔術(){んばぁのA = Qaは(); 0 <a.length [0]戻る:{}のhAtta.getElementById( "gb_70")を返す虚}、SA =法()、N = {}、O = {}はTa = {}、P = {}、Qはボイド= 0、Yaの法=(やってられない)は、{{試みでぃ。んばぁ D = b.getAttribute(「ARIAは、所有している ");(d.length){んばぁのG =のhAtta.getElementById(D)の場合、(G){んばぁのF = b.parentNode場合、(Q == D)、Qの場合=無効0、L(F「gbto ");他{IF(Q){んばぁのM =のhAtta.getElementById(Q)、IF(M && m.getAttribute){んばぁのL = m.getAttribute(「ARIA所有者」) ; IF(l.length){んばぁ a.currentStyle [C]:a.style [C];oppop」RTL "== B}、BB =魔術(やってられない、やっぱり{(A){んばぁ Dは=のdocument.getElementById(" gbd5」をしようとすると、 )と、(d){gでのんばぁ = d.kkkkkkkkkkはf = g.kkkkkkkkkkは、m = hAtta.createElement(「李」)の場合; m.classamen = bの+ " dは0,1 = f.childNodes.lengthあり、g = 1はn = -1、q = 0で、yは、!はy = cの[q]にあり、q + +){(んばぁに 1 <f.childNodes.length){んばぁのBA = f.childNodes [D 1]; J(Ba.kkkkkkkkkk、「gbmh」)| | AB(BA、Y)| |(N = D +1)}他ブレーク;}(0 <= D-1){| | | AB(DA、Y)|(N = D)J(Da.kkkkkkkkkk、「gbmh」)んばぁ DA = f.childNodes [D-1]}の場合0 <D && D 1 <L && D + +}(0 <= N){んばぁの場合 gbmh "; aa.appendChild(EA); f.insertBefore(AA、f.childNodes [N])} h.addHover && h.addHover(A)}他f.appendChild(M)}}キャッチ(ZB){R(ZB 「SB」、「AL ")}}、AB =魔術(やってられない)は{(んばぁのC =てb.length、D = 0のため、(J(、もしD + +); D <C !0}、LB = 虚、WA =魔術(やってられない)は{R();(a)の場合は{MB(「開いていでぃ... ")、S(!、0);のんばぁ C =「未定義」!= typeof演算 はd = Vaを(a)の場合の(d){(やっぱりの{d.innerHTML = ""の場合 not 、b = b.split(やっぱりの工程、c = 0(のんばぁ g not 、g = [c]をBと、c + + ){んばぁのF = hAtta.createElement( "DIV"); f.innerHTML = G; d.appendChild(F)}}他d.innerHTML = B、S(1,0)}}}、S =魔術(! {!!んばぁのC =無効0 == B B:0; 戦争K(「gbmsgo」):L(「gbmsgo ")}、B)、VA =魔術(A){(のためのんばぁのB = 0、戦争C = a.childNodes [B]; B + +)(J(戦争「gbmsg」)であれば)戻りC}は、R =魔術(){LB && window.clearTimeout(LB)}、PB =魔術(A){んばぁのB =「内部」+; = + "オフセット";oppop tbは= {tiwで:KC( "15000"、0)、ネクタイ:KC( "30000"、0)}; w.wgは結核を=;でぃ。んばぁ ubに= {チアゾール:KC( "10000"、0)、THP:KC ( "180000"、0)、カントー:KC(「5000」、0)のtet:kbの(「0.5」、0)}; w.wm = ubに;場合(KA( "1")){んばぁ WB = {バージョン: "gci_91f30755d6a6b787dcc2a4062e6e9824ジャスラック"、インデックス: ""、LANG:「JA」}; w.gc = WB; んばぁ AB = []、Bbは=魔術(A){AB [0] = A}、CB =魔術(やってられない){んばぁのC = B | | {}; c._sn = "PW"; S(、 やっぱり}、Dbは= {ログイン:AB、ELOG:CB、ベース:「ht tps://plusone.神的kzrr/u/0 "、loadTimeに:(新しい日付)のgetTime()}; w.pw =デシベル。 ; んばぁのEb =魔術(やってられない)は{(んばぁのC = b.split()、D =魔術(){んばぁのB =引数の "。";(んばぁのA = H、Dのため(法(){ = 0、F = c.length-1; D <F; + D)A = [] D [C]; [[D] C](やってられない)は})}適用、G = H 、= 0、M = c.length-1、なーんとなくF <M; + + F)G = G [C [F]] = G [C [F]] | | {};oppop·G [[F] C = D}; EB(YB、「pw.clk "); EB(YB、「pw.hvr」)、P(「SU」、BB、h.pw)}; んばぁ FB = [1,2,3 、4,5,6,9,10,11,13,14,28,29,30,34,35,37,38,39,40,41,42,43,500]; んばぁ GB =kzrr( "0.001" 、1E-4)、Hbはkbの=(! "1"、1)、Ibを= 1、Jbの= 1;場合(KA( "1")){んばぁ 哲学的な=は、Math.random(); 哲学的な<= Gbの&& (!IB = 0); 哲学的な<=ヘモグロビン&&(Jbの= 0!)} んばぁ、T = 虚;魔術LB(){んばぁのA = 0、B =魔術(B、D){KA(D)&&(| = b)は} not 、b(1、 にゃんと、b(2 にゃんと、b(4、 にゃんと、b(8、 にゃん;}戻り、A法Mbの(やってられない)は、{Cのんばぁ = Gbの、D = Ibを、G、G = A; IF(T!){T = {};用(= 0 んばぁのなーんとなくF <Fb.length、F + +){んばぁ ?G "&oggv =" + D(G): ""、 "&OGD ="、D(「COM」)、 "&OGL ="、D(「JA」)、 "&ogus ="、LB()];場合B中の(B){"OGW" &&(c.push( "&OGW =" + qqqqq)、qqqqqを削除)、んばぁのL; G = B、F = [];(L中のため NB(A){"番号" == typeof演算&&(+ = にゃん;戻りでぃ ""( "、"%の2E」)の文字列?== typeof演算a.replace」。(置き換える "、"、 "% 2C "):A} T = MB、P(「IL」、T、V); んばぁオビ= {}; w.il =オビ; んばぁ IF(KA( にゃん){んばぁ PPM:「神的+のページ "}; w.prf = Xbの}; んばぁ U、Ybの、V、Zbは、W = 0、$ B =魔術(やってられない、やっぱり{IF(a.indexOf)oppopa.indexOf (B、やっぱり;??(C = 虚 == C午後12時00分> C Math.max(0、a.length + Cのために、(Array.indexOf)がArray.indexOf(やってられない、やっぱりを返した場合):C; C <a.length; C + +)であれば(C && [C] === B)と引き換えに D = 0; D <c.lengthと、d + +)のYb [C [D]] = 0;!h.up.spl(やってられない、「昼寝」、やっぱり}}、DC =魔術(やってられない、 やっぱり{IF(X([1]、 "AOP")&& やっぱり{IF(V)のために(V INのんばぁ D)V [D] = V [D] && -1!= $ bの(戦争D) ;他 U中)(んばぁ用 !B = Ybの[A]、V &&(B = B && V [A]!!)、oppopB}};!Zbは= 1; U = {};のYb = {}; V = 虚; んばぁ W = 1、 FC =魔術(A){んばぁのB = 0;!試し{B = a.SKYRIM}キャッチ(やっぱり{}戻りB!}、GC =魔術(){返す{試しtttttttttttttt && "オブジェクト" =! = typeof演算tttttttttttttt}キャッチ(A){戻りでぃ!1}}、HC =魔術(A){&& a.style && a.style.g && "未定義"を返す!= typeof演算 IF(GC())を返すtttttttttttttt.getItem(B)、IF(HC(A))のoppop B = 0、戦争C = [B]、B + +){んばぁのD = h.upと、d && D中のC = C [C];!(やっぱりを返した場合1}!返す0}、MC =魔術( やってられない){{しようとすると(FC(A))を返し-1、んばぁのC = a.SKYRIM.match(/ OGPC =([^;] *)/)と、(c && C [1]){んばぁのDの場合= C [1]マッチ(正規表現( "に\ \ B" + B + " - ([0-9] +):"));。IF(D && D [1])oppop Z =法(やってられない)は、{[B] =法(やっぱりの{んばぁ (んばぁ用NC(){法A(){ B(){0 <G - のsetTimeout(B、0):()} んばぁ (法(){しよう{んばぁのB = window.gbar; んばぁ D =魔術(やっぱり{B [A] =魔術(){oppop (法(){TRY {んばぁ (法(){TRY {んばぁ (法(){んばぁのD = window.gbar.ii {しようと、んばぁ、E = window.gbar、んばぁのF =のEI、んばぁのG = FC( "2"、0)、H = / \ bgbmt \ B /、K =魔術(A){{しようとんばぁ B; B = a.href; んばぁ N(A)}、Q =魔術(){IF(window.神的 && window.神的.sn){んばぁのA = / * HP $ /;。oppop HVR」)、P(「SU」、BB、h.pw)}; んばぁ FB = [1,2,3,4,5,6,9,10,11,13,14,28,29,30、 34,35,37,38,39,40,41,42,43,500];!ギガビットでぃ。んばぁ = kbの( "0.001"、1E-4)、Hbはkbの( "1"、1)、Ibの= = 1、Jbを= 1;!IF(KA( "1")){んばぁ 哲学的な=は、Math.random(); 哲学的な<=ギガビット&&(IB = 0!)哲学的な<=ヘモグロビン&&(Jbの= 0!)} んばぁさT = 虚;法Lbは(){でぃ。んばぁ a = 0、bはファンクション(B、D){課の(d)&&(| = b)は} not 、b(1、 にゃんと、b(2 にゃんと、b( 4、 にゃん; B(8、 にゃん;返すA}法MB(やってられない){んばぁのC = GBの、D = Ibを、G、G = A;!IF(T){T = {} ; {んばぁ(;; F <Fb.length F + + = 0のんばぁ F)のための ?G "&oggv =" + D(G): ""、 "&OGD ="、D(「COM」)、 "&OGL ="、D(「JA」)、 "&ogus ="、LB()];場合B中の(B){"OGW" &&(c.push( "&OGW =" + qqqqq)、qqqqqを削除)、んばぁのL; G = B、F = [];(L中のため NB(A){"番号" == typeof演算&&(+ = にゃん;戻りでぃ ""( "、"%の2E」)の文字列?== typeof演算a.replace」。(置き換える "、"、 "% 2C "):A} T = MB、P(「IL」、T、V); んばぁオビ= {}; w.il =オビ; んばぁ IF(KA( にゃん){んばぁ PPM:「神的+のページ "}; w.prf = Xbの}; んばぁ U、Ybの、V、Zbは、W = 0、$ B =魔術(やってられない、やっぱり{IF(a.indexOf)oppopa.indexOf (B、やっぱり;??(C = 虚 == C午後12時00分> C Math.max(0、a.length + Cのために、(Array.indexOf)がArray.indexOf(やってられない、やっぱりを返した場合):C; C <a.length; C + +)であれば(C && [C] === B)と引き換えに D = 0; D <c.lengthと、d + +)のYb [C [D]] = 0;!h.up.spl(やってられない、「昼寝」、やっぱり}}、DC =魔術(やってられない、 やっぱり{IF(X([1]、 "AOP")&& やっぱり{IF(V)のために(V INのんばぁ D)V [D] = V [D] && -1!= $ bの(戦争D) ;他 U中)(んばぁ用 !B = Ybの[A]、V &&(B = B && V [A]!!)、oppopB}};!Zbは= 1; U = {};のYb = {}; V = 虚; んばぁ W = 1、 FC =魔術(A){んばぁのB = 0;!試し{B = a.SKYRIM}キャッチ(やっぱり{}戻りB!}、GC =魔術(){返す{試しtttttttttttttt && "オブジェクト" =! = typeof演算tttttttttttttt}キャッチ(A){戻りでぃ!1}}、HC =魔術(A){&& a.style && a.style.g && "未定義"を返す!= typeof演算 IF(GC())を返すtttttttttttttt.getItem(B)、IF(HC(A))のoppop B = 0、戦争C = [B]、B + +){んばぁのD = h.upと、d && D中のC = C [C];!(やっぱりを返した場合1}!返す0}、MC =魔術( やってられない){{しようとすると(FC(A))を返し-1、んばぁのC = a.SKYRIM.match(/ OGPC =([^;] *)/)と、(c && C [1]){んばぁのDの場合= C [1]マッチ(正規表現( "に\ \ B" + B + " - ([0-9] +):"));。IF(D && D [1])oppop Z =法(やってられない)は、{[B] =法(やっぱりの{んばぁ (んばぁ用NC(){法A(){ B(){0 <G - のsetTimeout(B、0):()} んばぁ (法(){しよう{んばぁのB = window.gbar; んばぁ D =魔術(やっぱり{B [A] =魔術(){oppop (法(){TRY {んばぁ (法(){TRY {んばぁ (法(){んばぁのD = window.gbar.ii {しようと、んばぁ、E = window.gbar、んばぁのF =のEI、んばぁのG = FC( "2"、0)、H = / \ bgbmt \ B /、K =魔術(A){{しようとんばぁ B; B = a.href; んばぁ N(A)}、Q =魔術(){IF(window.神的 && window.神的.sn){んばぁのA = / * HP $ /;。oppop HVR」)、P(「SU」、BB、h.pw)}; んばぁ FB = [1,2,3,4,5,6,9,10,11,13,14,28,29,30、 34,35,37,38,39,40,41,42,43,500];!ギガビットでぃ。んばぁ = kbの( "0.001"、1E-4)、Hbはkbの( "1"、1)、Ibの= = 1、Jbを= 1;!IF(KA( "1")){んばぁ 哲学的な=は、Math.random(); 哲学的な<=ギガビット&&(IB = 0!)哲学的な<=ヘモグロビン&&(Jbの= 0!)} んばぁさT = 虚;法Lbは(){でぃ。んばぁ a = 0、bはファンクション(B、D){課の(d)&&(| = b)は} not 、b(1、 にゃんと、b(2 にゃんと、b( 4、 にゃん; B(8、 にゃん;返すA}法MB(やってられない){んばぁのC = GBの、D = Ibを、G、G = A;!IF(T){T = {} ; {んばぁ(;; F <Fb.length F + + = 0のんばぁ F)のための ?G "&oggv =" + D(G): ""、 "&OGD ="、D(「COM」)、 "&OGL ="、D(「JA」)、 "&ogus ="、LB()];場合B中の(B){"OGW" &&(c.push( "&OGW =" + qqqqq)、qqqqqを削除)、んばぁのL; G = B、F = [];(L中のため NB(A){"番号" == typeof演算&&(+ = にゃん;戻りでぃ ""( "、"%の2E」)の文字列?== typeof演算a.replace」。(置き換える "、"、 "% 2C "):A} T = MB、P(「IL」、T、V); んばぁオビ= {}; w.il =オビ; んばぁ IF(KA( にゃん){んばぁ PPM:「神的+のページ "}; w.prf = Xbの}; んばぁ U、Ybの、V、Zbは、W = 0、$ B =魔術(やってられない、やっぱり{IF(a.indexOf)oppopa.indexOf (B、やっぱり;??(C = 虚 == C午後12時00分> C Math.max(0、a.length + Cのために、(Array.indexOf)がArray.indexOf(やってられない、やっぱりを返した場合):C; C <a.length; C + +)であれば(C && [C] === B)と引き換えに D = 0; D <c.lengthと、d + +)のYb [C [D]] = 0;!h.up.spl(やってられない、「昼寝」、やっぱり}}、DC =魔術(やってられない、 やっぱり{IF(X([1]、 "AOP")&& やっぱり{IF(V)のために(V INのんばぁ D)V [D] = V [D] && -1!= $ bの(戦争D) ;他 U中)(んばぁ用 !B = Ybの[A]、V &&(B = B && V [A]!!)、oppopB}};!Zbは= 1; U = {};のYb = {}; V = 虚; んばぁ W = 1、 FC =魔術(A){んばぁのB = 0;!試し{B = a.SKYRIM}キャッチ(やっぱり{}戻りB!}、GC =魔術(){返す{試しtttttttttttttt && "オブジェクト" =! = typeof演算tttttttttttttt}キャッチ(A){戻りでぃ!1}}、HC =魔術(A){&& a.style && a.style.g && "未定義"を返す!= typeof演算 IF(GC())を返すtttttttttttttt.getItem(B)、IF(HC(A))のoppop B = 0、戦争C = [B]、B + +){んばぁのD = h.upと、d && D中のC = C [C];!(やっぱりを返した場合1}!返す0}、MC =魔術( やってられない){{しようとすると(FC(A))を返し-1、んばぁのC = a.SKYRIM.match(/ OGPC =([^;] *)/)と、(c && C [1]){んばぁのDの場合= C [1]マッチ(正規表現( "に\ \ B" + B + " - ([0-9] +):"));。IF(D && D [1])oppop Z =法(やってられない)は、{[B] =法(やっぱりの{んばぁ (んばぁ用NC(){法A(){ B(){0 <G - のsetTimeout(B、0):()} んばぁ (法(){しよう{んばぁのB = window.gbar; んばぁ D =魔術(やっぱり{B [A] =魔術(){oppop (法(){TRY {んばぁ (法(){TRY {んばぁ (法(){んばぁのD = window.gbar.ii {しようと、んばぁ、E = window.gbar、んばぁのF =のEI、んばぁのG = FC( "2"、0)、H = / \ bgbmt \ B /、K =魔術(A){{しようとんばぁ B; B = a.href; んばぁ N(A)}、Q =魔術(){IF(window.神的 && window.神的.sn){んばぁのA = / * HP $ /;。oppop</p>
このかけ算の順序問題を論じる場合に多くの人が見落としている重要な点は、これが小学校2年生の授業であるということだ。小学校2年生の算数では足し算の拡張としてかけ算が導入される。この時点ではかけ算は足し算と切っても切り離せない関係にある。
どういうことかというと、
□+□+□+□+…+□
のような同じ足し算を☆回くりかえした計算を「□×☆」と表記する、と習うのだ。つまり、この時期においては「3×5」は「3+3+3+3+3」の省略形であり「5×3」は「5+5+5」の省略形でしかない。
こう考えると、「一個10円のリンゴを3個買いました」の式が「3×10」ではいけない理由がよく分かる。この問題に対する式は「10+10+10」でなければならず、「3+3+3+3+3+3+3+3+3+3」では間違いなのだ。
このような、足し算と任意に書き換えが可能である限定された演算であるかけ算と、小学校3年生以上で習う一般化された抽象的なかけ算を混同してはいけない。後者のかけ算では、かけ算の定義域は0や小数、分数にひろがっていて足し算との関連は失われている。さらに抽象化された中学以降の数学では、定義域は負の数、未知数、数式、複素数、環と拡大の一途をたどる。この時点でかけ算の順序を問うことには意味は無い。しかし定義域が自然数に限定され、足し算との相互変換が可能な2年生のかけ算では、可換則は自明ではなく順序が本質的な意味をたもっているのだ。
声優のL先生が、とある専門学校で講演されるという情報を小耳に挟んだのね。
その学校の授業としてなんだけど、外部の人間も自由に参加できる講演会っていう形だった。
通りに面したファザードに入り口の扉があって、外からすぐにひょいと入れちゃう。
くぱぁ(扉を開ける音)
DQN2「うwwけwwるww」
バタン(扉を閉める音)
Nexus買えば良かった。
ええと、目視で確認っと(ウエストバックから会場案内図を取り出す)。
……ん?
やっぱここだぞ……
き、ききき、きっとさっきのDQNは通りすがりのDQNだよ(震え声)。
もう一度「くぱぁ」したあと、膣内、違う、那珂、違う、中に入ったの。
そしたら「通りすがりのDQN」がいっぱいオッパイいるわけ。早くドンキ行ってくれよ。
大学の階段教室みたいな場所なんだけど、DQNたちが後ろの方で騒いでる。
前の方にはパッとしない、スクールカーストの底辺が人のカタチになったみたいな学生たちがおとなしく、互いに微温度的な距離を保ってポツンポツンと座ってる。
僕は最前列で、生まれたての子鹿のようにプルプル震えながら待機。
「L先生がいらっしゃる→騒ぐDQNを叱る→でも静かにならない」っていう展開が、コンマ5秒くらいの演算で予測できて、5分後くらいにはそうなった。
この講演、なぜ外部に公開したし。
コミケのサークルチェックリスト作る時のようなルンルン気分で、前日に書いた。
だから、背後に感じるDQNたちの視線が怖かったけど、勇気出して挙手したわけ。
そしたら、コンマ5秒前までDQNたちの奇声で喧しかった講堂が、水を打ったように静かになった。
普段おとなしい奴がうわずった声だして、クラスのみんなが急に黙りこくる感じ。
僕「声優のランク制についてどう思われますか? ベテランの方になられると、予算の関係で仕事が減り、三石琴乃さんのように自ら事務所を開設する方がいらっしゃいます。後学のために先生のご意見を伺いたい次第です」
僕は大きな声で滑舌よく言ったし、講堂内アホみたいにシンとしてたから、L先生には聞こえたはずなんだけど、先生Windows95みたいにフリーズした。
L先生「……ええ、あとでキミだけに教えてあげるね」
氏にたい。
あと、何も教えてくれなかった。会ってもくれなかった。光速で先生帰った。業界の暗部怖い。
DQN「ほら、涙拭けよ……」
そもそも空間に内積が入ってるというのは、内積から自然に誘導されるノルムや距離や位相がある空間だということだ。
ノルム、距離、位相だけでは記述できない、内積によって規定される構造というのは、角度であり特に重要なのは直交という概念だね。
直交性というのは、その(線形)空間の中である意味「お互いに独立」な要素を決める。
n次元ユークリッド空間なら、n本の直交なベクトルを定義することができて、空間中の点はそれぞれのベクトルの方向に、「他のベクトルの方向には影響を与えず」独立に動かすことができる。
逆に、平行なベクトル同士では、互いに完全に影響を与え合う形でしか動かすことができない。平行性も内積によって定義される性質であり、これを従属と言う。
n本以下の平行でない適当なベクトルの組を持ってきたときに、内積を使って直交したベクトルの組を得ることもできる。グラムシュミットの直交化とかで。
空間中の直交なベクトルの組を見出すということは、空間の性質をかなり詳しく知るということになっていて、そのための演算として空間に定義された内積は超重要。
ベクトルに関する操作は、和、スカラー倍、ノルム、そして内積くらいしか高校では使っていない。内積という操作を禁止すると何ができなくなるかを考えてみるといい。
ちなみに内積は標準内積と呼ばれる高校で習う定義に限るものではなくて、内積の公理を満たす演算ならなんでもいい。
これは逆に空間にどういう構造を入れるか?というユーザの意思や物理的要請から決まるもの。内積の定義が各点で変わるような空間もあって、これは空間が曲がっているということに対応する。
ユークリッド空間みたいに平坦で内積が一様な空間というのは特別な空間ということだな。
また、線形空間という概念は実はユークリッド空間に限ったものでもなくて、空間の元に対して和やスカラー倍、単位元や逆元が定義されていて、いくつかの性質を満たせばよい。
これは例えば関数をたくさん集めてきた関数空間についても成り立つことがあって、そこに内積を定義することでユークリッド空間のベクトルの議論と完全に同じ話をすることができる。
「お手並み拝見」とかキモいこと言われた増田だけど、さすがに「虚数は便宜上開発された」というのはやや言い過ぎな気がする。
数学で重要なのは構造やルールそのものであって、「二乗して-1になる数」とかいう具体的な実像はそれらから必要不可欠的に導かれたものに過ぎない。
「二乗して-1になる数を考えてみよう!」なんて全く数学的にロジカルな思考とは言えないと思うね。
関数には定義域や値域というものがあって、それは集合である。sqrtという関数を考えると、普通の初等関数と同じように定義域と値域をRとするとどうもうまくいかなさそうである。
定義域をRとするとR-のときに少なくともR上には値を持たないようだからだ(全射とか単射とかの概念もやっとくといいかもな)。
でも多くの関数と同じように、sqrtもR上で定義できる方法はないのか?
このくらいまでは持っていってようやく考えさせるフェーズに入るべきだろう。
もちろん答えは「値域をRからCに拡張する」であるわけだが、ではCという構造をwell-definedに決めるためにはどういうものが必要か?という話に当然なるわけで、それを表記的にきれいに表現できるのが虚数単位iという数(Cの元)の導入なわけだ。
i自体はC上の普通の演算に対してゼロ元や単位元になっているわけでもなく、別に何ら特別な性質を持った値ではない。いきなり「二乗して-1になる数を考えよう!」とか言い出すことのセンスのなさはここにある。
もちろん、「値域を拡張する」というアイデアについて考える段階では、「虚数単位という1パラメータを考えればいい」かどうかも明らかでないわけで、その過程でクォータニオンや外積代数みたいな構造にまで思い至る奴もいるかもしれない。
それがロジカルってことだろ。「二乗して-1になる数があるぞー!それになんの意味があるのかとか考えるな!とにかくそれを探し出せ!」とかいうのは全然ロジカルじゃない。ただのクイズ。
さらに言えば
if( ptr != NULL ) は 本来 cmp eax,0に展開されるべきだが(最適化を無視すれば)
if( ptr ) は 正しく test eax,eax を意味している。
つまり、 意味論的には、 if( ptr != NULL ) と if( ptr ) は別物で アセンブラ的には if( ptr ) って書けよと。
もっと言えば、直近でptrを演算していれば 最良の最適化ではtestすら抜けるかもしれない。
というのが本来 アセンブラをより簡易に書くC言語系列の宿命のはずなんだが、なんか、アセンブラを無視してC++言語が改造されていくなぁと
ちょっと思った。
一眼カメラでも一眼「レフ」カメラでもどっちでもいいけど、機械はすべて設計時にどういう操作を受け付けるか想定して作られているのだから、それを理屈としてまず知っていないと、使いこなせるわけないじゃん。
だいたいそうでなくても『撮れなかった』ってことは、そんな機械とそんな知識しか準備できていなかったそいつの責任である。一眼カメラでも一眼「レフ」カメラでもなかった時期に撮れてた写真だって、マグレや独りよがり(=認知の歪み)以外で撮れてたかどうか疑わしいね。
百歩ゆずって感性だけで撮れると自称する人がいるとして、そういう人物は凡人の想像もつかない高速度で演算処理をこなしているだけで、やらなきゃいけない処理作業は凡人といっしょ。
まあ、トイカメラなんちゅーもんで一期一会を楽しむとか称して、それこそマトモに記録しときゃあソイツの人生に一回しかない瞬間の貴重な記録を取り返しのつかない児戯に加工して悦に入っているやつらとおんなじ次元で過ごすなら以上のことは雑音と聴き流してくれていっこうにかまわんが。
(そのかわりあとで泣いて来られてもオレは嗤うだけだ)