2018年5月29日火曜日

将皇レベル6

GoogleChromeをインストールしたら
Flash版将皇のレベル6が使えるようになった。

6枚落ちからスタートして現在は2枚落ちの下手。
下手から手を変えなければほぼ勝つことができる。レベル6でも1級はない感じ。

思考エンジンは同じで考慮時間のみ、かえているのかな。
下図のように全駒になることもある。
歩を打って終了だが王手ではないので反則にはならない?

気持ちのいい詰み。

Flashは終了するらしい。
こんなことももう最後なのか。


2018年5月25日金曜日

klue 3.0

kona linux u e

ウィンドウズにおさらばした文系中高年のページ
https://ameblo.jp/himajin-memo/entry-12378083706.html

によると

待望の3.0が発表されました。

DLには半日かかりました。

USBからの起動はできるがHDDへのインストールはできませんでした。(FMVノート)

どうしても無線Lanが必要になったらそのとき再検討しよう。

xfce版もDL可能になっています。


LiveCDのページではなく

https://docs.google.com/document/d/11Db6HCC-X25rH_INhkw5G4gofliGM7GU9MWsmzZpWHA/edit

からDLしました。数分で完了しました。


早速LiveUsbを作成して起動。
手持ちの無線Lan子機の作動も確認しましたが、
非常に動作が鈍い。Lxde版も同様でしたのでHDDへのインストールは見送ることに。

2018年5月11日金曜日

xgamma

画面が明るすぎて見にくい時、ガンマ値を下げればよい。

$ xgamma -gamma 0.5

ところがこれでは画像を見るには暗すぎるので

$ xgamma -gamma 1

Haskellで書いたGuiのフロントエンドもあるのですが、

http://hhg2the-haskell.blogspot.jp/2017/10/xgamma.html

瞬時に切り替えるにはキーボードショートカットの方が使いやすい。

コマンドを適当な名前でスクリプトにしておく。

$ echo "xgamma -gamma 0.5" > g5
$ cat g5
xgamma -gamma 0.5
$ chmod 777 g5

~/.config/openbox/trisquel-mini-rc.xml

に次のように書き足す。
(g5が仮に /home/bin/ にあったとして)

<!-- xgamma -->
    <keybind key="C-F5">
      <action name="Execute">
        <command>/home/bin/g5</command>
      </action>
    </keybind>
    <keybind key="C-F9">
      <action name="Execute">
        <command>/home/bin/g10</command>
      </action>
    </keybind>

(以上、Lxde DTE の場合)




2018年5月6日日曜日

2の平方根



四角数は整数nの2乗です。
2の平方根は200に一番近い四角数を探し、そのもととなったnの桁をずらせば求まります。
Haskellで計算しますと

*Main> takeWhile (\(a,b) -> b < 200) $ map (\x -> (x , x*x)) [1..]
[(1,1),(2,4),(3,9),(4,16),(5,25),(6,36),(7,49),(8,64),(9,81),(10,100),(11,121),(12,144),(13,169),(14,196)]
*Main>

200に一番近い四角数は196でnは14。
桁をずらして1.4。

これは2の平方根の近似値です。
偶然ですがとてもよい近似値です。

*Main> 1.4*1.4
1.9599999999999997
*Main>

さらに200を百倍して20000に一番近い四角数を探しますと

*Main> last $ takeWhile (\(a,b) -> b < 20000) $ map (\x -> (x , x*x)) [1..]
(141,19881)
*Main>

ともう一桁詳しい√2が求まります。

これを関数化しますと

*Main> let f k = last $ takeWhile (\(a,b) -> b < 2*100^k) $ map (\x -> (x , x*x)) [1..]
*Main> f 3
(1414,1999396)
*Main> f 4
(14142,199996164)
*Main> f 5
(141421,19999899241)
*Main>

ただしkを大きくとると四角数のリストを作るのに負担が増えて現実的ではありません。

少し工夫を加えたのが折り紙をつかった計算法です。

正方形の折り紙を2枚用意します。
1枚を台紙に貼ります。
もう1枚を100等分します。

小さな折り紙が100枚できたことになります。

最初の折り紙の下辺、右辺に沿ってこの小さな折り紙を並べていきます。

下辺に10枚、右辺に10枚、角に1枚、合計21枚並べることができました。
こうしてできた図形はやはり正方形です。

まだ小さな折り紙がのこっているので同様の作業を繰り返します。

こんどは下辺に11枚、右辺に11枚、角に1枚、合計23枚並べることができました。

この作業は計4回繰り返すことができます。

この4回という数字を記録しておきます。
√2の一桁目の値です。

*Main> 21+23+25+27
96

100−96=4

ですので小さな折り紙が4枚あまります。

その4枚の小さな折り紙をそれぞれ、再び100等分します。

同様の作業をしますと
こんどは下辺に140枚、右辺に140枚、角に1枚、合計281枚並べることができました。
数がたりないので1回だけ並べることができます。

1を記録します。√2の次の桁の値です。

余った219枚をさらに百等分して・・・

とこの作業を無限に繰り返せば無限に詳しい2の平方根が求まります。
StateMonadを使ってアルゴリズムに忠実に書くとこうなります。

実行例

$ runghc root2.hs
(10,100,0,0,0,1)
(10,100,21,0,1,1)
(10,100,44,21,2,1)
(10,100,69,44,3,1)
(10,100,96,69,4,1)
(10,100,125,96,5,1)
4
(140,400,0,0,0,2)
(140,400,281,0,1,2)
(140,400,564,281,2,2)
1
(1410,11900,0,0,0,3)
(1410,11900,2821,0,1,3)
(1410,11900,5644,2821,2,3)
(1410,11900,8469,5644,3,3)
(1410,11900,11296,8469,4,3)
(1410,11900,14125,11296,5,3)
4
(14140,60400,0,0,0,4)
(14140,60400,28281,0,1,4)
(14140,60400,56564,28281,2,4)
(14140,60400,84849,56564,3,4)
2
(141420,383600,0,0,0,5)
(141420,383600,282841,0,1,5)
(141420,383600,565684,282841,2,5)
1
(1414210,10075900,0,0,0,6)
(1414210,10075900,2828421,0,1,6)
(1414210,10075900,5656844,2828421,2,6)
(1414210,10075900,8485269,5656844,3,6)
(1414210,10075900,11313696,8485269,4,6)
3
(14142130,159063100,0,0,0,7)
(14142130,159063100,28284261,0,1,7)
(14142130,159063100,56568524,28284261,2,7)
(14142130,159063100,84852789,56568524,3,7)
(14142130,159063100,113137056,84852789,4,7)
(14142130,159063100,141421325,113137056,5,7)
(14142130,159063100,169705596,141421325,6,7)
5
(141421350,1764177500,0,0,0,8)
(141421350,1764177500,282842701,0,1,8)
(141421350,1764177500,565685404,282842701,2,8)
(141421350,1764177500,848528109,565685404,3,8)
(141421350,1764177500,1131370816,848528109,4,8)
(141421350,1764177500,1414213525,1131370816,5,8)
(141421350,1764177500,1697056236,1414213525,6,8)
(141421350,1764177500,1979898949,1697056236,7,8)
6
(1414213560,6712126400,0,0,0,9)
(1414213560,6712126400,2828427121,0,1,9)
(1414213560,6712126400,5656854244,2828427121,2,9)
(1414213560,6712126400,8485281369,5656854244,3,9)
2
(14142135620,105527215600,0,0,0,10)
()

計算はこちらで見れます。





2の平方根だけではなく任意の整数Nの平方根を求めるHaskellのコードが

http://hhg2the-haskell.blogspot.jp/2017/10/blog-post_26.html

さらに折り紙ではなくサイコロを1000等分して並べる方法でNの立方根も計算します。


2018年5月3日木曜日

hanoiの塔

ハノイの塔の最小解き手順数は次のようなHaskellのコードで計算できます。

h 1 = 1 
h n = h (n-1) + 1 + h (n-1)

円盤の枚数が(n-1)のときの手順数がわかれば、円盤の枚数がnのときの手順数はいつでも計算できる、ということから再帰的に書くことができます。

計算してみます。

$ ghci

GHCi, version 8.0.1: http://www.haskell.org/ghc/  :? for help
Prelude> :l h.hs
[1 of 1] Compiling Main             ( h.hs, interpreted )
Ok, modules loaded: Main.
*Main> h 1
1
*Main> h 2
3
*Main> h 3
7
*Main>

枚数が多くなると非常に時間がかかるようになります。

*Main> map h [1..64]
[1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535,131071,262143,524287,1048575,^CInterrupted.
*Main> 

これはこのコードの構造がHanoiの塔を解くプログラムと同じだからです。
(円盤を動かすたびにカウントしているのと同じ)

このようなときはfold系の関数を利用します。

*Main> scanl (\x _ -> x + 1 + x) 0 [1..64]
[0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535,131071,262143,524287,1048575,2097151,4194303,8388607,16777215,33554431,67108863,134217727,268435455,536870911,1073741823,2147483647,4294967295,8589934591,17179869183,34359738367,68719476735,137438953471,274877906943,549755813887,1099511627775,2199023255551,4398046511103,8796093022207,17592186044415,35184372088831,70368744177663,140737488355327,281474976710655,562949953421311,1125899906842623,2251799813685247,4503599627370495,9007199254740991,18014398509481983,36028797018963967,72057594037927935,144115188075855871,288230376151711743,576460752303423487,1152921504606846975,2305843009213693951,4611686018427387903,9223372036854775807,18446744073709551615]
(0.02 secs, 709,992 bytes)
*Main> 

最初のコードが非効率だったのは二股再帰しているからです。

次のように書き換えればよい。

h2 1 = 1
h2 n = h2 (n-1) * 2 + 1

*Main> h2 64
18446744073709551615
(0.02 secs, 112,688 bytes)
*Main>


円盤の数がN枚のときのハノイの塔は、2のN乗マイナス1回の動きで解けることが知られています。
Prelude> 2^64-1
18446744073709551615
「最初に一番下にあった円盤はただ1回、元の位置から目的地に移動しているだけ」 ということが関係しています。 つまり円盤が何枚積まれていても一番下の円盤が持ちうる状態は2つ。 です。 すべての円盤についてそうですので、N枚の円盤が持ちうる状態をすべて数え上げれば 2のN乗になります。 一番最初の状態を加えていないので 2のN乗マイナス1 です。

64枚の円盤に上から順番に番号をつけます。一番上が1番一番下が64番です。 64番はただ一回A塔からB塔に移動しているだけです。 つまり64番の持ちうる状態は2つ。 つぎに63番から1番までの動きををみてみますと、64番を移動させるために、一旦全部C塔に移動しています。 このとき63番だけをみますと、ただ一回A塔からC塔に移動しているだけです。 つまり63番の持ちうる状態は2つ。 で64番がB塔に移動したあと、すべてB塔に移動するのですが、やはり63番はただ一回C塔からB塔に移動しているだけです。 このとき、63番の持ちうる状態は2つです。 つまり64番の持ちうる状態それぞれについて63番が持ちうる状態は2つづつ。 つまり2x2、2の2乗です。 62番については面倒なので省略しますが、同じことが言えます。 ハノイの塔のルールにしたがって(最小手順で)動かした場合、自分より下の円盤が持ちうる全ての状態それぞれについて2つづつの状態を持ちうるということです。 64番と63番が持ちうる状態が2x2でしたので、2x2x2、2の3乗。 一般に
ハノイの塔のルールにしたがって(最小手順で)円盤を動かした場合、 N番目までの円盤が持ちうる状態は 2の(Nマイナス1)乗 かける 2 つまり 2のN乗です。 1番の円盤は下から数えて64枚目ですので、 2の64乗 最初の状態を勘定にいれないので、 2の64乗マイナス1

(これは64bitのメモリーが0〜18446744073709551615までの整数を表わせることと等価です。)

さてソロリ新左衛門がなぜ大金持ちになったかですが、
決して「戦場でサンタフェを売った。」からではありません。

有名なのは将棋盤と米粒の話しです。

最初のマスに1粒、次に2倍の2粒、さらに2倍の4粒・・・米粒をのせていきます。
将棋盤は9x9の81マスなので、

*Main> scanl (\x _ -> x * 2) 1 [2..(9*9)]
[1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144,524288,1048576,2097152,4194304,8388608,16777216,33554432,67108864,134217728,268435456,536870912,1073741824,2147483648,4294967296,8589934592,17179869184,34359738368,68719476736,137438953472,274877906944,549755813888,1099511627776,2199023255552,4398046511104,8796093022208,17592186044416,35184372088832,70368744177664,140737488355328,281474976710656,562949953421312,1125899906842624,2251799813685248,4503599627370496,9007199254740992,18014398509481984,36028797018963968,72057594037927936,144115188075855872,288230376151711744,576460752303423488,1152921504606846976,2305843009213693952,4611686018427387904,9223372036854775808,18446744073709551616,36893488147419103232,73786976294838206464,147573952589676412928,295147905179352825856,590295810358705651712,1180591620717411303424,2361183241434822606848,4722366482869645213696,9444732965739290427392,18889465931478580854784,37778931862957161709568,75557863725914323419136,151115727451828646838272,302231454903657293676544,604462909807314587353088,1208925819614629174706176]
(0.03 secs, 1,033,184 bytes)

ソロリ新左衛門が求めたのはその合計ですので

*Main> sum it
2417851639229258349412351
(0.01 secs, 109,800 bytes)
*Main> 

2杼4178垓5163京9229兆2583億4941万2351粒です。

ある方の計算によると1俵は2666666粒なのだそうです。
とすると2杼4178垓5163京9229兆2583億4941万2351粒は約90京俵。
日本の現在の年間生産量は1億数千万俵。

同様の話しがインドの王様とチェスの発明者の話しとして伝わっています。
こちらはチェス盤と麦です。

*Main> scanl (\x _ -> x * 2) 1 [2..(8*8)]
[1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144,524288,1048576,2097152,4194304,8388608,16777216,33554432,67108864,134217728,268435456,536870912,1073741824,2147483648,4294967296,8589934592,17179869184,34359738368,68719476736,137438953472,274877906944,549755813888,1099511627776,2199023255552,4398046511104,8796093022208,17592186044416,35184372088832,70368744177664,140737488355328,281474976710656,562949953421312,1125899906842624,2251799813685248,4503599627370496,9007199254740992,18014398509481984,36028797018963968,72057594037927936,144115188075855872,288230376151711744,576460752303423488,1152921504606846976,2305843009213693952,4611686018427387904,9223372036854775808]
(0.02 secs, 685,632 bytes)
*Main> sum it
18446744073709551615


1844京6744兆737億955万1615粒

なぜかハノイの塔の解き手順と一致しました。

将棋盤やチェス盤ですのでこの程度の数でおさまっていますが、これが囲碁の盤だったらどうなるでしょうか。

*Main> sum $ scanl (\x _ -> x * 2) 1 [2..(18*18)]
34175792574734561318320347298712833833643272357706444319152665725155515612490248800367393390985215
(0.02 secs, 276,408 bytes)
*Main>

34,175,792,574,734,561,318,320,347,298,712,833,833,643,272,357,706,444,319,152,665,725,155,515,612,490,248,800,367,393,390,985,215

サイエンティフィック・ノーテーションでは

3.417579257473456e97

3のあとに0が97個並びます。

実際にハノイの塔を解くHaskellのプログラムは


参考
Emacsにはテキストベースながらグラフィカルにハノイの塔の動きをシミュレートするマクロが搭載されています。(有名です。)
多分そのソースコードとおもわれるLispプログラムが
に公開されています。(かなり複雑)
またVimのマクロもあり(これは初耳)、
Kona 3.0では
/usr/share/vim/vim74/macros/hanoi
にありました。(使用法は同ディレクトリーのClick.meというファイルを開いてください。)

ユニクスの塔

プリンストンという所にある「ユニクス寺院(和名『宦官寺』)には3本の塔が立っており、
32枚のシリコンでできた円盤がささっている。
この寺院の僧には円盤をすべて別の塔に移し替えることが修行として課せられている。
その修行は,1970年1月1日午前0時0分0秒に始まっており、
計算では2038年1月19日3時14分7秒に31枚の円盤を移し終え、最後の1枚にとりかかったところでタイムオーバーとなり、
その瞬間システムはリブートするといわれている。(hanoi.elの注釈より)

*****という所にある「***の塔」には3本の塔が立っており、世界中から集められたコインでできた32枚の円盤がささっている。
この円盤はなにやら怪しげな動きを繰り返しているが
(なんと「ユニクスの塔」の1000倍のスピードで)
「黒い箱」で覆われているため、その動きは小さな「窓」を通してしか、うかがい知ることができない。
どうやら円盤は隣の塔に移動しようとしているようだ。
そしてすべて移動し終わったとき、システムはフリーズする。

2018年5月2日水曜日

三菱ユニ

鉛筆は三菱ハイユニの10Bを使っています。
実は三菱ユニは初めて買ったんです。
僕らの小学生時代はお金モチの坊っちゃんしか買ってもらえませんでした。
なぜか1ダース入りの専用ケースをみせびらかすように机に置いていたり・・・

三菱鉛筆はあの三菱とはなんの関係もないと知った時の衝撃は
「アサヒ芸能」が朝日新聞と無関係と知った時のそれと匹敵しました。

一説にはアサヒと名のつくマスコミでまともなのはアサ芸だけだとか。