Haskellでフィボナッチメモ化再帰

さっき挙げたプログラムだとfib(40)ぐらいでもう数十秒ぐらいかかり、だいぶ遅いです。
メモ化再帰フィボナッチをメモしておきます

fib 0 = 0
fib 1 = 1
fib x =  (fiblist !! (x-1) + fiblist !! (x-2))
fiblist = [fib x  | x <- [0,1..]]

実行結果

ghci> fib 5000
3878968454388325633701916308325905312082127714646245106160597214895550139044037097010822916462210669479293452858882973813483102008954982940361430156911478938364216563944106910214505634133706558656238254656700712525929903854933813928836378347518908762970712033337052923107693008518093849801803847813996748881765554653788291644268912980384613778969021502293082475666346224923071883324803280375039130352903304505842701147635242270210934637699104006714174883298422891491273104054328753298044273676822977244987749874555691907703880637046832794811358973739993110106219308149018570815397854379195305617510761053075688783766033667355445258844886241619210553457493675897849027988234351023599844663934853256411952221859563060475364645470760330902420806382584929156452876291575759142343809142302917491088984155209854432486594079793571316841692868039545309545388698114665082066862897420639323438488465240988742395873801976993820317174208932265468879364002630797780058759129671389634214252579116872755600360311370547754724604639987588046985178408674382863125

5000項目でも一瞬で計算できます。多倍長標準実装スゴイ。

いろいろ買い物&スタジオ作りました

今日は街に行ってフィギュアの撮影スタジオの材料とかを買いに行きました。
ついでに夏休みに使う予定の青春18きっぷも買っておきました!!たのしみです
東急ハンズで買い物しましたが、いろいろなものがあって目移りしましたね。
理化学コーナーにビーカーやらいろいろな実験用具が売っていて、専攻は違えどなかなかわくわくしました。
結局あまり買わなかったんですけどまた行きたいです。
さらに大きい書店に寄ってコンピュータの棚をみてると、関数型言語Haskellの参考書『すごいHaskellたのしく学ぼう!』、
(通称すごいH本)が売っていたのでなかなか値は張りましたが買ってしまいました。関数型言語はまだ触れたことがないので楽しみです。
f:id:xxxasdfghjk999:20170727192027j:plain

うちに帰ったら早速スタジオを作りました。
ダンボールの床と壁に白い紙を貼り、上からUSB給電のLED光源で照らすだけの簡素なものです。
ダンボールの切り出しに苦戦しつつも完成しました。(わりとでかい
↓こんな漢字
f:id:xxxasdfghjk999:20170727192344j:plain

↓こんな漢字
f:id:xxxasdfghjk999:20170727193959j:plain

上から照らしてるだけなので正面からも照らしたいんですが、直接当てると影がなかなか目立ちます。
角のほうの影もちょっと問題なのでそのへんを直していきたいです

ねこっかわいがり!クリア

ねこっかわいがり!全ルート読了しました!
ただのイチャイチャ美少女ゲームでないことは知ってましたが、なかなかの内容でした。
僕はクレイン先生が一番のお気に入りです。最近ロリが熱い。
気になる方は是非プレイしてみてください。店頭では見かけないのでDMMやDLsiteがおすすめです。
f:id:xxxasdfghjk999:20170726190223p:plain
次は大悪司です。期末テストがうまい具合に散らばってるから大丈夫...

はてぶで数式を書く

動的計画法のアレを書いてて数式がはてぶで書けたらいいなと思ったらどうやらTexが書けるようで
k's diary様のサイトを参考にしました↓
TeXで数式をはてなブログに表示する - k's diary

TeXのコマンドで数式の表示
\sum_{i=0}^n x_i

DP\left\[k\right\]\left\[n\right\] = \displaystyle\sum_{(s∈S)} (DP\left\[k-1\right\]\left\[n\right\] \times DP\left\[k-1\right\]\left\[s\right\] \times EloRate(n,s)) 


DP\left[k\right]\left[n\right] = \displaystyle\sum_{(s∈S)} (DP\left[k-1\right]\left[n\right] \times DP\left[k-1\right]\left[s\right] \times EloRate(n,s))



dp\left[left\right]\left[right\right] = 0 (left = 0 \land right = 0)
\\
>自分のターンのとき\\
dp\left[left\right]\left[right\right]  = max\{dp\left[left\right]\left[right-1\right] + b\left[B-right+1\right] ,dp\left[left-1\right]\left[right\right] + a\left[A-left+1\right]\} (left \neq 0 \land right \neq 0 のとき)\\
dp\left[left\right]\left[right\right]  = dp\left[left\right]\left[right-1\right] + b\left[B-right+1\right] (left = 0のとき)\\
dp\left[left\right]\left[right\right]  = dp\left[left-1\right]\left[right\right] + a\left[A-left+1\right] (right = 0のとき)\\
>相手のターンのとき\\
dp\left[left\right]\left[right\right]  = min\{dp\left[left\right]\left[right-1\right],dp\left[left-1\right]\left[right\right] \}(left \neq 0 \land right \neq 0 のとき)\\
dp\left[left\right]\left[right\right]  = dp\left[left\right]\left[right-1\right](left = 0のとき)\\
dp\left[left\right]\left[right\right]  = dp\left[left-1\right]\left[right\right](right = 0のとき)\\

>自分のターンのとき\\
dp\left\[left\right\]\left\[right\right\]  = max\{dp\left\[left\right\]\left\[right-1\right\] + b\left\[B-right+1\right\] ,dp\left\[left-1\right\]\left\[right\right\] + a\left\[A-left+1\right\]\} (left \neq 0 \land right \neq 0 のとき)\\
dp\left\[left\right\]\left\[right\right\]  = dp\left\[left\right\]\left\[right-1\right\] + b\left\[B-right+1\right\] (left = 0のとき)\\
dp\left\[left\right\]\left\[right\right\]  = dp\left\[left-1\right\]\left\[right\right\] + a\left\[A-left+1\right\] (right = 0のとき)\\
>相手のターンのとき\\
dp\left\[left\right\]\left\[right\right\]  = min\{dp\left\[left\right\]\left\[right-1\right\],dp\left\[left-1\right\]\left\[right\right\] \}(left \neq 0 \land right \neq 0 のとき)\\
dp\left\[left\right\]\left\[right\right\]  = dp\left\[left\right\]\left\[right-1\right\](left = 0のとき)\\
dp\left\[left\right\]\left\[right\right\]  = dp\left\[left-1\right\]\left\[right\right\](right = 0のとき)\\

配列の括弧の表示が面倒ですね...

K-means法と画像の階調分類

K-means法とは類似したデータをいくつかのグループに分類するアルゴリズムの一つです。このアルゴリズムを利用して、画像の減色処理を行うプログラムを作りました。
この画像処理のコードについて、昔作ったjavaのコードですが引っ張り出してきました。

続きを読む