2014-12-15

素数腕立て伏せ Advent Calendar 15日目 #prime_num_pushups

素数腕立て伏せってなんじゃ?という方はまずこちらをどうぞ。
素数腕立て伏せについて : サルノオボエガキ


「アウトドア素数腕立て伏せ」という電波を受信したが受信拒否した。

15日目
47回で勝ち(素数)


宣言通りの47回の勝利。48の途中で潰れた。今の腕力は45〜48ぐらいのところに限界があるみたいっすね。

WolframAlpha先生によると47は8番目のLucas数とのこと。


47 is the 8th Lucas number (L_8).
47 - Wolfram|Alpha

ルーカス数じゃなくてリュカ数って読むみたい。フィボナッチ数列の親戚みたいなようですね。
リュカ数 - Wikipedia


素数腕立てニストからのお願い
道端で突然腕立て伏せをはじめる人がいてもなるべくスルーしてください。人間には健康で文化的な最低限度の腕立て伏せをする自由があるのです、たぶん。

2014-12-14

素数腕立て伏せ Advent Calendar 14日目 #prime_num_pushups

素数腕立て伏せってなんじゃ?という方はまずこちらをどうぞ。
素数腕立て伏せについて : サルノオボエガキ




14日目
46回で負け(合成数)


40を超えたあたりから目がチカチカしだして素数回がどうこうとかアタマから抜けてしまった。地味に記録は伸びてるので明日は47回(素数)越えを目指そう。

$ 46 = 4^0(8*5 + 6) $なので3つの平方数の和で表せる。うーん、$ 46 = 1^2 + 3^2 + 6^2 $か。
ほかにも特徴はないかな〜、WolframAlpha先生!

46 is the number of integer partitions of 18 into distinct parts (q(18)).
46 - Wolfram|Alpha

46は18を異なる整数に分割する数? Wikipediaによるとこういう分野があるみたいですね。

数学の各分野、特に数論および組合せ論において、正の整数 n の分割(ぶんかつ、英: partition)あるいは整分割 (integer partition) とは、与えられた正整数 n を正整数の和として表す方法をいう。
自然数の分割 - Wikipedia

オイラーの分割恒等式が気になるゾ。



素数腕立て伏せ一言メモ
合成数もそれぞれ特徴があって惹かれそうになりますが、飽くまで素数腕立てニストは素数のみを追求べし。合成数ダメ、ゼッタイ。

素数腕立て伏せ Advent Calendar 13日目 #prime_num_pushups

素数腕立て伏せってなんじゃ?という方はまずこちらをどうぞ。
素数腕立て伏せについて : サルノオボエガキ



二日酔いをしたことがない、というか二日酔いを自覚したことがない。

13日目
32回で負け(合成数)



変なタイミングで力が抜けてしまった。素数腕立て伏せも他のスポーツと同じく呼吸が大事です。なんか力は残ってるのにすっと潰れてしまう時がある。



ところで昨日の記録35回は「5通りの方法で3つの異なる素数の和で表せる最小の数字」とのことでした。

AC記事を上げたあと、つらつらと考えてみました。
もうちょい単純な条件で「2通りの方法で2つの異なる素数の和で表せる最小の数字」って何かなっと。
偶数の素数は2しか無いので奇偶を考えると2は使えない。
「うーん、ちょうど同じだけ離れた素数の組みがあれば、それぞれ組合せて同じ数に出来るんでは?」と考えた。
$(3,5), (11,13)$はちょうど2ずつ離れた素数の組だ(さらに全部異なる素数だ)。
ということは、$ 3 + 13 = 5 + 11 = 16 $ となるから、16が「2通りの方法で2つの異なる素数の和として表せる最小の数字」じゃないか!?
WolframAlpha先生に訊いてみたらやっぱりそうだった。やったぜ!

16 is the smallest number with 2 representations as a sum of 2 distinct primes:
16 = 3+13 = 5+11
16 - Wolfram|Alpha


さらに言えば、2通りの方法でn個の異なる素数の和として表せる最小の数字は、n個の異なる双子素数を見つければ良いんではないか?
そういや双子素数が無限にあるらしいという研究は、最近大きく前進したとのニュース記事があったなぁ。

無名の数学者、双子素数の問題で大きな前進
双子素数予想に進展があった - hiroyukikojimaの日記

これってゴールドバッハの予想とも関係あるらしいようで、初等整数論ってちょっと考えただけで超弩級難問にブチ当たるので怖いなと思いました(小並感)


素数腕立て伏せ一言メモ
呼吸大事とても大事。筋肉を使った後は脳みそ使う、チェスボクシングのごとく。

2014-12-13

素数腕立て伏せ Advent Calendar 12日目 #prime_num_pushups


素数腕立て伏せってなんじゃ?という方はまずこちらをどうぞ。
素数腕立て伏せについて : サルノオボエガキ



忘年会シーズンですね。私は今日、シャンパンを目に入れるとパチパチして痛いこと、目からでも酒は飲めるし酔うことを学びました。
さてもう21時半すぎなので、素数腕立て伏せを始めましょう(当ACではインド標準時を採用しています)。


12日目
35回で負け(合成数)



途中でちょっと気持ち悪くなったのでギブ。無理をするのが素数腕立て伏せなんですが、、、あ、明日がんばるから!


WolframAlpha先生によると、35は「5通りの方法で3つの異なる素数の和で表せる最小の数字」とのこと。

35 is the smallest number with 5 representations as a sum of 3 distinct primes:
35 = 3+13+19 = 5+7+23 = 5+11+19 = 5+13+17 = 7+11+17
35 - Wolfram|Alpha

3つの異なる素数の和ってことは、偶数なら必ず2を含まなくちゃいけないから「5通りの方法」だと35より大きくなりそうですね。ということは「5通りの方法で2つの異なる素数(ただし2は除く)の和で表せる最小の数」が分かれば、「5通りの〜最小の偶数」が分かりそうだなぁ。


素数腕立て伏せワンポイントアドバイス
飲んだら無理するな、最悪ウェーした物体に突っ込むことになる

2014-12-11

素数腕立て伏せ Advent Calendar 11日目 #prime_num_pushups


素数腕立て伏せってなんじゃ?という方はまずこちらをどうぞ。
素数腕立て伏せについて : サルノオボエガキ



今日も昨日と同じく2セットやるよ!

11日目
1セット目 41回
2セット目 22回
41 + 22 = 63回で負け(合成数)


今日の2セット目は昨日と変えて42からカウントする方式にしてみた。62回で潰れそうになって「昨日と同じ記録は嫌だ」という気持ちが働いて+1回できました。
1セット目の調子が良すぎたせいか、2セット目で疲れてしまったみたい。
$63 = 4^0(8*7 + 7)$ なので3個の平方数の和では表せませんね。

ところでWikipedia先生のページで興味深い記述が。

$63 = 2^6 - 1$。一般に n が合成数のとき$2^n-1$は合成数になる。
63 - Wikipedia


うーん、なんでだろ? n が 素数-1(合成数)の場合はフェルマーの小定理から明らかだよなー。
なんか関係あるかも、とメルセンヌ数のページを見てたら理由が書いてありました。オゥフ、高校数学を忘れてたでござる。

前者の対偶である命題「n が合成数ならば Mn は合成数である」は次の式から示される[3][8]。
\[2^{ab}-1 = (2^a - 1)\{1 + 2^a + 2^{2a} + ... + 2^{(b-1)a}\}\]
メルセンヌ数 - Wikipedia



2014-12-10

素数腕立て伏せ Advent Calendar 10日目 #prime_num_pushups

素数腕立て伏せってなんじゃ?という方はまずこちらをどうぞ。
素数腕立て伏せについて : サルノオボエガキ


いつか1729回の腕立て伏せをやって「今日は負けだな〜、1729なんて2通りの方法で2つの正の立方数の和で表せる最小の数字ってだけで合成数だもんね☆(ラ並感)」と言ってラマヌジャンごっこがしたいです!

10日目
1セット目 36回
2セット目 26回
36 + 26 = 62回で負け(合成数)


今日は昨日のACで宣言したとおり2セットやりました(一分ぐらいインターバルをおいてみた)。

2セット目のカウントのはじめは 37 or 1 で少し迷った。
けっきょく1から数えたわけですが、これだと常に現在の腕立てカウントと+36して素数判定をしなくちゃいけないので、もう少し訓練が必要ですね。

たしか『ご冗談でしょう、ファインマンさん』のエッセイで、モノをカウントするときに声で数えるタイプと数字を思い浮かべるタイプがいる、という話しがあったと思います。
訓練すれば脳内に36からのカウントと1からのカウントを同時に浮かべて、なおかつ素数判定の暗算ができるようになるのかなぁ〜。
$62 = 1^2 + 5^2 + 6^2$




素数腕立て伏せ一言メモ
記録の数字がどんな特徴をもっているか知りたいときはWolframAlphaかWikipediaでみるといいです。
Wikipediaは雑学含めて教えてくれるのでそういうのが好きな人はどうぞ。

62 - Wolfram|Alpha
62 - Wikipedia

今回みたいに複数回やる場合は数列になるので、オンライン整数列大辞典で検索するのも面白いかも。

36, 26 - OEIS








2014-12-09

素数腕立て伏せ Advent Calendar 9日目 #prime_num_pushups

素数腕立て伏せってなんじゃ?という方はまずこちらをどうぞ。
素数腕立て伏せについて : サルノオボエガキ



こんばんは! 将来的には素数腕立て伏せサイエンティスト協会を作ってトレーナー認定やセミナーなど資格商売でウハウハしようと思ってるdeltamです!

9日目
31回で勝ち(素数)


やはり31が山ですね。今回は40台までいこうと思ったんですが、今の腕力だと30前後で限界が来て「31か素数だ」と思うと一瞬気が抜けて潰れやすくなります。
(そろそろ30台の数字は飽きてきたんだけど...。)

無益な行為は楽しくなければ正しくない。明日の素数腕立て伏せは試験的に腕立て伏せ2セットの合計値で勝ち負けを決める方式をやってみます。これなら50台ぐらいまでいけるかなー。


素数腕立て伏せ一言メモ
いちおうルールは決めましたが、合わないと思ったら自分ルールをプラグインしてみましょう。
もともとは普通の筋トレに飽きてきたから素数回ジャッジを始めたわけで、まぁだいたいなんでもOKです。飽きないこと大事ね。

2014-12-08

素数腕立て伏せ Advent Calendar 8日目 #prime_num_pushups

素数腕立て伏せってなんじゃ?という方はまずこちらをどうぞ。
素数腕立て伏せについて : サルノオボエガキ



おっともう20時か〜(インド時間)

8日目
37回で勝ち(素数)



31からがキツかった〜。37は2日目と同じ記録。
30番代の記録が多かったせいか、$37=1^2+6^2$というのはすっと計算できるようになってきた。
あと重み付き平方和だと
\[ 37 \equiv 1 \; (\operatorname{mod}\;12) \]
なので
\[ 37 = 5^2 + 3*2^2 \]
と書けますね。


素数腕立て伏せワンポイントアドバイス
私だけかもしれないですが、無酸素運動の最中だと記憶したものを思い出すのが難しいです。
なので素数腕立て伏せをしているときは暗算で素数判定しながらやってます。

とはいえ大した計算じゃありません。偶数は即NGで奇数は3,5,7のどれかで割れるか試すだけ。
いまの腕力だとどう頑張っても100回は行きません。自然数Nの素因数は$\sqrt{N}$以下なので、10以下の素数で割ればOK。

まぁ、こんなことやるより素数表でも置いときゃ良いんですが、効率を求めてたらこんな筋トレやりませんって。


コンピュータと素因子分解

素数腕立て伏せ Advent Calendar 7日目 #prime_num_pushups

素数腕立て伏せってなんじゃ?という方はまずこちらをどうぞ。
素数腕立て伏せについて : サルノオボエガキ



はっ寝てた。
AC的には失敗ですが、しょうがないのでこのACでは最初から「インドのタイムゾーンを使用していた」ことにします。ハハッ、まだ21時だ。

7日目
29回で勝ち(素数)



昨日、2セットやったのが響いているのかちょっと腕がつらかった。28で潰れそうになったのを素数力を振り絞り+1回やりました。


ところで29は4で割って1余る素数なので2平方和定理より2つの平方数の和で表せます。

\[ 29 = 2^2 + 5^2 \]

2平方和定理を初等的に証明する方法はいろいろあるみたいですが、Zagier先生の一文証明が面白いですね。

有限集合$S=\{(x,y,z)\in\mathbb{N}^3|x^2+4yz=4n+1\}$上の対合
\[ (x,y,z) \mapsto \begin{cases}
(x+2z,z,y-x-z) & \mbox{if; } x<y-z \\
(2y-x,y,x-y+z) & \mbox{if; } y-z<x<2y \\
(x-2y,x-y+z,y) & \mbox{if; } 2y<x
\end{cases}
\]
は必ず一個の不動点を持つから、集合Sの元の個数は奇数であり、対合
\[(x,y,z)\mapsto(x,z,y)\]
も不動点を持つ。

二個の平方数の和 - Wikipedia


たしかこの証明を初めて知ったのは数学セミナーの記事でした。一見意味不明ですが、ちゃんと計算してやるといい感じに収まります。
※ 対合=2回やると元の要素に戻る写像。

たしか最初の対合がちょうど一つの不動点を持つと確かめるのに計算が面倒だった気がする。
対合はいわゆる「はーい、二人組を作って〜」ってやつなので不動点=ぼっちが1人いることを示せれば集合Sの要素数は奇数だと言える。そんで2番目の対合にもぼっち、じゃなかった不動点があるので $4n+1=x^2+4yz=x^2+(2y)^2$と書けてQEDという流れです。



素数腕立て伏せ一言アドバイス
メシ食う前にやるべ。眠くなっからな。

2014-12-06

素数腕立て伏せ Advent Calendar 6日目 #prime_num_pushups

素数腕立て伏せってなんじゃ?という方はまずこちらをどうぞ。
素数腕立て伏せについて : サルノオボエガキ




豚バラ白菜鍋を作るのに夢中になっていたらこんな時間じゃないか! 鍋が煮えるあいだに素数腕立て伏せすっぞ!
(昨日の反省を踏まえてメガネは取った)


6日目
33回で負け(合成数)


31で一山越えて32で潰れそうになったが踏みとどまった。だけど34には勝てなかったよ......。
まだ鍋が煮えてないのでもう一回やってみる。

6日目(2セット目)
22回で負け(合成数)


1日で二度負けちゃったよ、勇次郎に怒られそうだよ......。だけど鍋は美味そうに煮えてきたよぉ。

最近、腕の筋肉痛が無くなってきたので2セットやってみましたが、キーボード打つ手がぷるぷるしてきたので今日はここまでにします。


素数腕立て伏せ一言PR
寒いですね、素数腕立て伏せです!
筋トレしたいけど時間がない? 素数腕立て伏せです!
クリスマスに予定がない? 素数腕立て伏せアドベントカレンダーです!

※ 当方では素数腕立て伏せアドベントカレンダー参加者を随時募集しております。
参加登録とかしゃらくさいものは要りません。素数腕立て伏せをやったら #prime_num_pushups をつけてツイートしましょう!

#prime_num_pushups - Twitter検索

2014-12-05

素数腕立て伏せ Advent Calendar 5日目 #prime_num_pushups

素数腕立て伏せってなんじゃ?という方はまずこちらをどうぞ。
素数腕立て伏せについて : サルノオボエガキ


自然数に0を含めるうんぬんを調べてたらますます分からなくなってきたので、明日は積読になってたこの本を読んでみよう。

数とは何かそして何であるべきか (ちくま学芸文庫)




5日目
28回で負け(合成数)


「自然数に0を含めるのか」を考えながら素数腕立て伏せを始めたらメガネをかけっぱなしであることに気づいて動揺してしまった。他事に気を取られては記録は伸びぬ。28回は1日目と同じですね。


28 - Wolfram|Alpha
1日目ではスルーしてましたが、28は完全数でもあるんですね。うーむ、完全数腕立て伏せをやったら28の次が496なので、すごく記録が伸びづらくなるなぁ。素数は程よく散らばってて良い!



素数腕立て伏せ一言アドバイス
メガネは外せ、腕立て伏せをはじめる前にメガネを外すのだ(4日ぶり2回目)



【自然数に0を含めるか関係リンク】
自然数 - Wikipedia

「先生、0って自然数ですか?」|多摩英数進学教室 栗平校
0は自然数か | 東海大学理学部情報数理学科

#0は自然数 - Twitter検索

2014-12-04

素数腕立て伏せ Advent Calendar 4日目 #prime_num_pushups

素数腕立て伏せってなんじゃ?という方はまずこちらをどうぞ。
素数腕立て伏せについて : サルノオボエガキ



大寒波が来るみたいですが、あいも変わらず素数腕立て伏せを続けていきますよ。


4日目
32回で負け(合成数)


3日目は31回を目指して30回で潰れましたが、今日は31回を越えて気が緩んでしまったようです。次の37まで続ける素数力が足りなかったぜ......。




ところで3日目記事で「自然数を3つの平方数の和で表せる条件ってなんなんだろね」と書きましたが識者より情報を頂きました!



自然数$N$が三個の平方数の和で表されるための必要十分条件は、$n\ge0,k\ge0,a\in\{1,2,3,5,6\}$により、$N=4^n(8k+a)$と表されることである。逆に、$N=4^n(8k+7)$で表される自然数は三個の平方数の和で表されない。これはディオファントスの時代から研究されてきた[1]ことであるが、1798年、ルジャンドルによって証明された。

三個の平方数の和 - Wikipedia

$30=4^0(8*3+6)$となるので3平方和で表せるということですね。今日の32は$32=4^2(8*0+2)$となるので3平方和に表せる。毎度WolframAlpha先生に聞くのもアレなので3つの平方数を計算してみます。

32未満の平方数は$\{1,4,9,16,25\}$ですね。……あっれー、0を含めないと3平方和で表せなくね???

\[32=0^2+4^2+4^2\]

WolframAlpha先生も3平方和は出してくれないし...。
32 - Wolfram|Alpha

自然数に0を含めるうんぬんのアレなんですかねぇ。時間がギリになったので一旦棚上げしますが。


[2014-12-07追記]
これって単純に平方数に$0^2$を含めてなかっただけですね、自然数と0は関係ない。筋トレ直後の酸欠で脳みそがアレだったから間違えちゃった(・ω<)☆

2014-12-03

素数腕立て伏せ Advent Calendar 3日目 #prime_num_pushups

素数腕立て伏せってなんじゃ?という方はまずこちらをどうぞ。
素数腕立て伏せについて : サルノオボエガキ



今回はちゃんと腕を90度曲げたぜ!

3日目
30回で負け(合成数)


20回までは勢いでいける、「23か29あたりで妥協しようかなー」という気持ちが湧いてくるのでそれを振り払うのが一山。あと必死にやってると一瞬、「27が素数なのでは」と思ってしまうが$27=3^3$なので気をつけよう。29の誘惑を振りきった後、あと1回が続かなかった。無念。

WolframAlpha先生に聞く前に素因数分解してみると $30=2*3*5$となり、1日目記事を参考にすると「合成数かつ3を平方で素因数に持ってない」ので2つの平方数の和としては表せないってことが分かります。
30 - Wolfram|Alpha

ところが先生によると$30=1^2+2^2+5^2$と表せちゃう。自然数を3つの平方数の和で表せる条件ってなんなんだろね。


素数腕立て伏せ一言アドバイス
「せっかくだからBGMはクセナキスを流してみっか」とか思ってもやらんほうがいいです(テンション上がらない)。素数腕立て伏せだろうが筋トレBGMはロッキーのテーマが定跡のようだ。



2014-12-02

素数腕立て伏せ Advent Calendar 2日目 #prime_num_pushups

素数腕立て伏せってなんじゃ?という方はまずこちらをどうぞ。
素数腕立て伏せについて : サルノオボエガキ



MathJaxを導入して数式がキレイに表示できるようにしてみた。昨日のAC1日目の記事もちょいと修正してみました。すこしTeXの書き方を覚えるだけでLife Changingだなこりゃ。


2日目
37回で勝ち(素数)


昨日の素数腕立て伏せの筋肉痛のせいか、腕の曲げ角がすこし鈍角になっていたように思う。今回は素数回までいけたが、回数が多いほうが良いわけではなく限界まで続けるのがキモなので、明日は回数の多さにこだわらず鋭角に腕を曲げよう。


今日もWolframAlpha先生に37について聞いてみよう。
37 - Wolfram|Alpha

37は原子ピタゴラス数の斜辺の数であるとのこと。

\[37^2 = 12^2 + 35^2\]

斜辺が37で1辺が35ってことは、かなり鋭角な直角三角形ですね。……まさか腕をこの直角三角形の斜辺のごとく鋭角に曲げよとの啓示なのか!



素数腕立て伏せ一言メモ
最後は床に伏せることになるんで床が汚いとツライ。素数腕立て伏せを続ければクイックルワイパーする習慣がつくのでは。




【MathJax参考サイト】
Irreducible representation: MathJax in Blogger (II)
BloggerでMathJaxを使ってTeXっぽく数式を入れる方法 - Ichiro Maruta Homepage

2014-12-01

素数腕立て伏せ Advent Calendar 1日目 #prime_num_pushups

素数腕立て伏せってなんじゃ?という方はまずこちらをどうぞ。

素数腕立て伏せについて : サルノオボエガキ
素数腕立て伏せ進行状況 - Togetterまとめ

このアドベントカレンダーでは今日から毎日、素数腕立て伏せをしてその実施報告をしていきます。誰が得をするのか分からないけど、今日の昼頃に急に思い立ったのでしょうがない。インターネットでは誰かが得をすることはもう誰かがやっているので、私がやる必要はないのです。

1日目
28回で負け(合成数)。

1日目から負けとは悔しい。23回あたりで「29回までならイケるやろ」と気を抜いたのがダメだったみたい。ひさしぶりだったせいか、素数力(素数回目までがんばろうという気力)の出し方を忘れているようだ。

負けだけど、せっかくなので28をWolframAlpha先生に聞いてみよう。
28 - Wolfram|Alpha
28は3通りの方法で4つの平方数の和で表せる最小の数字。だけど3つの平方数の和で表すのは不可能だそうです。なんでだろね?(※)


素数腕立て伏せ一言アドバイス
メガネは外しておきましょう。力尽きた時に刺さります。(危なかった)


なおこのACは29日か31日まで続けます。25は5*5だからヤダ。




※ 長風呂してちょっと考えてみた。
二乗して28より小さい自然数は1〜5。28は偶数だから3つの平方数は$(偶,偶,偶)$か$(偶,奇,奇)$の組み合わせになるはず。つまり最低一つは偶数が含まれる。その偶数を$2a$として表そう。$b,c$を3つ組みの残りとして次のように式変形してみる。

\[
\begin{eqnarray}
28 = 2^2*7 & = & (2a)^2+b^2+c^2 \nonumber \\
2^2(7-a^2) & = & b^2+c^2 \nonumber
\end{eqnarray}
\]

$2a = 2 \ or\ 4$ だから $a=1\ or\ 2$。ということは次の2つの場合が不可能と言えればOKそう。

\[
\begin{eqnarray}
2^2(7-1^2) = 2^3 *3 & = & b^2+c^2 \\
2^2(7-2^2) = 2^2 *3 & = & b^2+c^2
\end{eqnarray}
\]

ここまで考えてよく分かんなくなってきたので、Wikipediaのこのページでカンニングした。
二個の平方数の和 - Wikipedia

(1)の場合は合成数についての証明に「素因数として3を平方以外で持ってる数は二平方和で表せない」とあるので大丈夫。
(2)も同じ理由で不可能。
これで証明終了できた...っぽい。

2013-12-14

生まれて約三時間目のHashlog

これはClojure Advent Calendar 14日目のエントリです。


(最近自作したライブラリ、Hashlogについて書きます。)


複雑な難しいプログラムを書くのはつらくとも面白いけど、煩雑なプログラムを書くのはつまらないです。

煩雑
事柄がこみいっていてまとまりがつかず,わずらわしいこと(さま)。

例えばこんなコードを読んだことが有ります(実物じゃないですよ)。

// 擬似コードです
function calc($value1,$value2,$value3,$flag)
{
  if($value1>0) {
    if($value1>=5)
      return  5;
    elseif($flag===true)
      return 4;
  }
  elseif($value2>0)
    return 3;
  elseif($value3>0)
    return 2;
  else
    return 1;
}


ある計算をする関数なんですが、if-ifelse、ifのネストで返り値を決めています。
これコード自体は「まぁしゃーない」で済ませられると思います。
しかしこの関数が30箇所にベタ書きで書いてあって、微妙な違い($value5まである/$value2までしかない、$flag2がある)があったらどうでしょう。
さらに30のなかの5個ぐらいはまったく違う引数を取って、別々の数式で返り値を計算している。

ビルの屋上で「F****CK!」と叫びたくなってきます。



if-elseif、ifのネストの何がダメなのか


2013-12-11

core.unify - 単一化をサポートするClojureライブラリ

(この記事はClojure Contrib Library Advent Calendar 2013の11日目の記事です)


概要

core.unifyは「単一化」をClojureで扱うためのライブラリです。作者は『Joy of Clojure』の著者の一人、Fogusさんです。

単一化はPrologなど論理プログラミングなどで使われる処理で、与えられた条件から未知の値を推論する仕組みです。単一化自体について詳しく説明するのは私には難しいので、詳しくはWikipedia等で調べて下さい;−)

ユニフィケーション - Wikipedia

抽象度が高いライブラリなので利点が分かりにくいですが、同じくFogusさんの作ったcore.constractsで使われているそうです。

fogus: Using unification to write readable Clojure macros?



Clojure Contirib Libraryにはcore.logicという論理プログラミングをするためのライブラリがあり、そちらでも単一化の機能は提供してます。ではなんでcore.unifyがあるんでしょう?
READMEを読むとcore.logicとの違いについて次のように書いてあります。

2012-05-07

#残パン会 に残念ながら参加してきました

残念言語ハッカソン&貧民パンの会」、略して残パン会に参加してきました。まったくひどい略称ですね、誰がつけたんだろう???

当日は朝から大雨が振っており、かなり濡れながら会場に到着しました。
そこには床に新聞紙を広げて胡座をかいてノートPCを弄っている数人の男性と、床の上に無造作に並べられたパンが…。あぁ、ATNDの説明はネタじゃなかったのか。

6時間以内に何か発表できるものを作らないとってことだったので、みんな黙々とハッカソンを進めてました。
止まった空調、雨で濡れた衣服、男どもが18人も一箇所に集まっている…。
「俺は大切なGWに何をしてるんだろうか」という思いはみんな感じていたと思うんですが、それは言わない約束です。


私はZozotezというLisp実装をつかって何かできないかな〜と思って会場にやってきたんですが、処理系を動かすまでに予想以上に時間がかかってしまい、時間までに大したことできないまま終わってしまいました。残念というか無念!
ちなみにZozotezというのはBrainf*ck上で動くLisp実装です。作者はZozotezを作るためにEBF(Extended Brainf*ck)という拡張言語まで作ってます。
EBF自体がEBFで書かれており、Pure Brainf*ck(変な言葉)にコンパイルすることが可能。なんというか、すべてをBrainf*ck上でやってしまおうという哲学が垣間見えますね。

当初の目標はZozoez上で動く簡単な言語(逆ポーランド記法計算機など)を作って、Hoge言語 on Zozotez on Brainf*ckをやろうと思ってたんですが、Zozotezがmakeでコケる・同梱のバイナリがMacで動かないなどいろいろありまして、Zozotezコードを書けるようになったのが残り2.5時間ぐらい。
けっきょくMacでは動かせずVirtualBox上でUbuntuを立てて同梱のバイナリを動かしました。

まずは1+1を書くかと思ったらZozotezには数値リテラルがないと。Zozotezはいわゆる純Lispで、シンボルとリストしかない。だからまずは数字表現から決めてやらないといけない。
そこでいろいろやった結果、なんとか1+1を書くことに成功。ここまででだいぶ力尽きました。
だって会場が蒸し暑いし、足がしびれてくるし、ちょっと体力の限界に近づいてたんですよ!



残パン会で使う言語を決めるためにいろいろなマイナー言語を調べるのは面白かったです。他の参加者の発表を見て、HSPForthLazy Kはちょっと使ってみたいなって思いました。
マイナー言語ってそれぞれ独特な哲学があります。そこに触れるだけでも新たな視点を知ることが出来てよかったと思います。
私もBrainf*ckのことを考えると胸が高鳴るようになってしまって…。この気持、恋かな?(ヒント:ストックホルム症候群



もう一度、残パン会が開かれることがあったら、ぜひとも参加することを前向きに検討しないでもないと思います!!


【参考リンク】
まとめ
#残パン会 貧民パンを食べながら残念な言語でハッカソンする何か - Togetter

会場の雰囲気はこのツイートが一番正確に表している。


2011-12-25

fill-queueでお手軽非同期処理

この記事はClojure Advent Calendar 2011の25日目の記事として書いています。
あんまりホリデイっぽくないので、Overtoneの記事と入替えて読むとちょうどいいですよ。

前にClojureのシーケンス操作関数の使い方一覧を書いたけど、最後に例示を挙げられなかったものがふたつ残りました。
seq-onは「何かをシーケンスとして扱いたいとき」というわり合い特殊なものなので良いとして、fill-queueはもう少し便利に使えそうなものなので何とか例示ができないかなーと思って簡単なファイルの変更監視スクリプトを書いてみました。

まずはfill-queueのdocを見てみましょう。
user=> (doc fill-queue)
-------------------------
clojure.contrib.seq/fill-queue
([filler-func & optseq])
  filler-func will be called in another thread with a single arg
  'fill'.  filler-func may call fill repeatedly with one arg each
  time which will be pushed onto a queue, blocking if needed until
  this is possible.  fill-queue will return a lazy seq of the values
  filler-func has pushed onto the queue, blocking if needed until each
  next element becomes available.  filler-func's return value is ignored.
nil

どうやら別スレッドで実行させる関数filler-funcを指定して、その関数でゴニョゴニョした値をqueueシーケンスとして受け取れるということらしい。filler-func内から値を返すときは引数fillに渡す。
非同期処理をシーケンスの流儀で取り扱えるっていうやつみたいですね。

これだけだとイメージが沸かないので使用例をぐぐってみたらこんな記事が見つかりました。
The Infolace Story: Simple webhooks with Clojure and Ring
この海外記事を読むとRingサーバー処理になにかフックさせるときに使ってる。途中の図がわかりやすい。

これでも使用例としてはいいんですけど、もうちょっと手元でいじれる例が欲しいのでファイルの最終更新日時を監視するスクリプトを書いて見ました。



watching-loopがfiller-funcで実行される本体です。ループで1秒ごとにファイルの最終更新日時を監視、変わっていたらfillにプッシュ。スレッド名を出力するコードを入れてるので別スレッドで実行されてることがはっきりしますね。
実行するとこんな感じ。


$ echo happy > test.txt
$ clj watch-file-status.clj test.txt
watching... (seq-test.txt)
main thread: main
watching-loop thread: pool-2-thread-1
;; $ echo chrismas! >> test.txt
modified: seq-test.txt
datetime: 2011-12-25 11:29:28
;; Ctrl-C
$ cat test.txt 
happy
chrismas!


これでfill-queueの使用例を書くことができました。前々から気になってたのをアウトプットできてスッキリ。
もうクリスマスがどうとか言ってる時期じゃないよ! 大掃除、棚卸しが大事だよ! リア充が爆発したら掃除が大変だよ!

ではみなさん良い年末を。俺は年賀状を書きます。

2011-12-10

Overtone: Clojureで音楽を書こう


この記事はClojure Advent Calendar 2011の10日目の記事として書いています。

12月1日からクリスマス25日まで毎日1ネタ、Clojureの記事を書くというこの企画。
せっかくなので前々から興味のあったOvertoneというライブラリの紹介をしてみようと思います。
Home // Overtone
overtone/overtone - GitHub

Overtoneは"Programmable Music"を目標とするシンセサイザーです。普通のシンセサイザーの操作とは違い、Clojureコードで音を作り音楽を書くことができます。
プログラマブル・シンセサイザーとしてはSuperColliderというのが前からあるそうで、それをClojureでラップした作りのようですね。
この記事では導入の仕方と簡単な音の作り方、最後にとあるクリスマスソングをOvertoneで書いてみたいと思います。