素数を数えるんだ!!(本気で)

今回は結構お勧め本なのでアマゾンにリンクとかしてみた

よくわかる現代魔法
1「new edition」
著者  :桜坂 洋
イラスト:宮下未紀
分類     : ライトノベル
総合評価   : ★★★★★
文章     : ★★★★
内容     : ★★★★★
キャラクター : ★★★★
一言で言うと「魔法もプログラムもコードという観点では同一のもの」という感じです。
名前の通り現代の世界で魔法でドンパチやります。
ただし、魔法はコンピュータを用いて組み上げるのが現代魔法だそうです。
プログラミングをやったことのある人なら見てるとかなり面白いかも。(ただし小説版に限る)
アニメを見て面白いと思った方も、絶望した方も、ぜひ小説のよくわかる現代魔法を読んでみてほしい
ちなみに、ぼくは職業的プログラマーではありません
プログラミングは妄想を具現化する方法の一つだと思っています
ここでちょっと暴走します。
まだ書いてないけど、内容的に暴走しそうなので先に言っときます
この物語中に出てくる美鎖さんの
「素数を遅延評価で求める」というセリフについて
↓ ↓ ↓ ↓ ↓


魔法を使う前落ち着きたいときには「素数を遅延評価で求める」のがいいそうです
まず、遅延評価(delayed evaluation)とは何か、
おおざっぱに言うと、与えられた式は必要になってから計算する。
という方法のことである。
逆に、与えられた式は必要か不要かにかかわらず計算することを先行評価(Eager evaluation)という
例をあげる。
「ミカンの値段は50円、リンゴの値段はミカンの2倍、バナナはミカンの4倍である。」
という文がまず与えられる。
つぎに、「ミカンとバナナを1つずつ買うといくらでしょう」
という問いを受ける。
これを解く手順について以下のように考える、
一文目を読んだ時点で、ミカン、リンゴ、バナナの値段を計算してしまい、
二文目を読んでミカンの値段とバナナの値段を足し合わせて答えを求める。
この方法を用いるとリンゴの値段を計算したのが無駄手間であると思い、下のような方法を思いつくだろう。
一文目を読んだ時点ではなにも計算せずに記憶だけしておく
二文目を読んでミカンの値段とバナナの値段が必要になったので、一文目からミカンの値段とバナナの値段のみを計算し、それを足し合わせて答えを求める。
このような方法が遅延評価です。
この方法により、計算時間を短縮することができます。
しかし、この方法にはそれ以上の意味があります。
たとえば上の例で、商品が無限にある場合を考えてください。
これを最初の方法で解こうとすると無限ループに陥ってしまいます。
しかし、遅延評価なら無限に続くデータ出会っても全く問題ないのです。
(まあ、問題のほうに無限が入ってくると結局ループしてしまうのですが)
で、ここで、本題です。
「遅延評価で素数を求める」とはおそらく、上の例の一文目に当たる部分が自然数、二文目に当たるものを素数かどうかの判定(エラストテレスのふるい等)にして順番に素数かどうかを調べていくという意味だと思われます。
つまり、1234・・・と頭の中で数えながら1は素数じゃない、2は素数、3は素数、4は素数じゃない・・・といったことを頭の中で考えるとここでは言いたかったのではないでしょうか。
言葉だけ聞くと難しそうだけどやってることはたいしたことないですね
ちょっとここから単語が難しくなるけど
まだまだ行くよ~
遅延評価をプログラミングでどう使われているかです。
遅延評価はよく関数型言語で実装されている方法です
Haskellとかが有名かな。
その他の言語でも頑張れば似た様なことはできます。
遅延評価を使うとループを記述する部分とそれを評価する部分の分離がうまくでき、プログラムの見通しが良くなるという利点があります。
他にも、ある特定の条件のときには評価されるとエラーになるような処理に対しても有効です。
(評価されるとエラーになる例としては0で割るなどが有名です)
問題点としては、
1、計算されるタイミングが分からない
2、外部からだと抽象化されていて内側で起こっていることが少々分かりにくい
という点が挙げられます。
1の計算されるタイミングがわからないとは
C言語では
printf(“def”,printf(“abc”));
という文があれば引数は関数より先に評価される(先行評価)ので
>abcdef
と表示されます。
しかし、これが遅延評価だとどちらが先に実行されるのか、はたまた、引数は評価されるかどうかすら分かりません。
以上より、
遅延評価とは使ってみるとチョット面白いことができるかも
ただし、言語仕様として組み込まれている場合は少し注意も必要
ということでした

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です