台所でできる核反応実験

面白い記事を見つけた。

水を2回沸騰させてはいけないという理由がここに!

… 同じ水を何度も沸騰させると、酸素の構造が変化し、…

… 水を何度も何度も沸騰させていると、化学構造変化の結果として、ヒ素や硝酸塩、フッ化物などの危険性のあるガスや毒性物質が生じる可能性があります。フッ化物が神経と脳に与える悪影響については多くの研究で証明されています。…

非常に興味深い話だ。もちろん、科学的な興味ではない。

人によっては説目するまでも無い事だと思うが、確認のために書いておこう。

まず、ヒ素の組成式は As、純粋なヒ素以外に、ヒ素化合物の事を「ヒ素」という事もあるかもしれないが、いずれにせよ As という原子を含んでいる。

同様に硝酸塩は硝酸 (HNO3)、と塩基性(アルカリ性)物質の化合物。フッ化物はフッ素 (F) を含む化合物。

どれも、純粋な水 (H2O) に含まれていない原子が必要だ。

不純物という言葉で好意的に解釈しようにも、前の部分で「酸素の構造が変化し」と明言している。

もっとも、不純物という言葉で簡単に片付けられるのは HNO3 だけだろう。

As なんて大変だよね。単体だろうが化合物だろうが超危険だ。飲料用の水ならば As 原子の絶対量で規制を受けて叱るべきだろう。化学変化以前の問題。

フッ化物も同様に無理がある。フッ素は電気陰性度が一番高い原子であり、他の物質と強く結合しやすい。例えフッ素原子が微量に存在していたとしても、既に他の物質と結合して非常に安定した状態になっているはずだ。常識的な飲料水に含まれている物質と 100 度前後の温度で人体に影響を与えるような化学変化が起きるとは思えない。

そして、極めつけは「フッ化物が神経と脳に与える悪影響については多くの研究で証明されています。」の一文。

歯医者さんではフッ素コーティングしてるのはどうなの?

そりゃ、フッカ物の中には人体に悪影響を与える物もありますけどね。もちろん、そういう研究も有るでしょう。

あえて誤解を招く書き方というか、「お前、分かっていて書いてるだろう」と記事を書いた人を問い詰めたい。

と、いうわけで水素水もビックリのとんでも記事に見えるわけだが、俺は「こいつ馬鹿だ」とディスっているだけの意識が低い男ではない。ここで華麗な解決策を考えてこそ、不可能を可能にする男の称号に相応しい。

記事の言うとおりに、例えば酸素をどうにかしてヒ素を作ることは不可能だろうか?

いや、できる!

どんな原子であっても、核反応が発生すれば別の原子になる。当然、酸素原子 (O) が核反応を繰り返せば、いつかヒ素原子 (As) が出来る可能性も有る。

ただ、核反応にはいくつか問題がある。まず、酸素原子から ヒ素原子を作るにはどこかで核融合が必要だ。核分裂ではない、核融合だ。

核反応には大きく 2 種類有る。核分裂と核融合だ。そして、核融合には非常に高い温度が必要なので難しい。

そのため、原子力発電など、現在の人間が使っているのは基本的に核分裂に限られている。核融合を使っている唯一の例外は水素爆弾(水爆)だ。(ちなみに、こいつは起爆するための温度を得るために核爆弾を使っている。)

その上ヒ素の原子番号は 33。ここも詳細を省くが、原子番号 33 の原子を核融合で作るために必要な温度は、水素原子同士の核融合でヘリウム (原子番号 2) を作成する水爆よりもずっと高い。

この反応を水が沸騰する温度で補うにはどうしたら良いか?

「圧力釜を用いてで水を 100 度以上にする」という案は魅力的だが、少し無理がある。1000 度まで加熱したところで状況は変わらない。引用元の記事は台所の料理をしている時の注意を述べているので、圧力鍋で核融合に必要な温度を補えというのは、あまりに馬鹿げている。

じゃあ、結局どうしたら良いのか?

待つしかない。

火をつけていなくとも遺跡から出てくる木が炭化しているように、悠久の時間がすぎれば、どんな反応でも少しずつ進む。

ここで次の問題だ。残念な事にヒ素原子は各エネルギー的に安定では無い。せっかく少量のヒ素が出来たとしても、人間に影響を与える程のヒ素が貯まる前に、出来上がったヒ素が再度核反応を起こして他の原子になってしまうだろう。残念ながらこの対策はすぐには思いつかなかった。

ついては、この問題を解決するための研究を行いたいので、政府は俺に予算をつけてはどうだろうか?

この研究がうまく行けば、常温核融合が大きく近づく。原発停止によるエネルギー問題なんて一発解消できるだろう。

研究と並行して行う実験には悠久の時間がかかる。予算の一括支払いが難しい場合は分割でもよい。とりあえず手付金として一億万年の給料を頂きたい。

もし予算をつけてくれるのならば、俺は命をかけてこの研究を行う事を誓う。研究成功の暁には、俺は反粒子と対消滅する事も厭わない。その対消滅エネルギーは東京電力に寄付する事を遺書としてここに残す。

単位が違う値は計算できるの?

知り合いの高校生と物理話していたら、途中で面白い質問が出た。

「単位の違う物を計算して良いんですか?」

一瞬、質問の意図が分からなかったので聞いてみると、学校の先生が「単位が違う物は計算できない」と言っていたとの事。う〜ん、先生が本気でそんな事言うとは思えないんだけどな。彼女が先生の言ったことの意味を勘違いしたか、先生が語弊のある言い方をしたのか。

正解をいうと、「単位の違う値同士の足し算、引き算はできない」、「単位の違う値同士の掛け算、割り算はできる」というのが正しい。

簡単な例から考えてみよう。当たり前からスタートして難しい例にたどり着くのは物事を理解する良い方法だ。

5 m の棒と 2 m の棒を考える。

両方とも単位は同じなので、足し算、引き算、掛け算、割り算何でもできるのだが、ここでは例として足し算と掛け算だけ考えよう。
(1): 5 (m) x 2 (m) = 10 (m x m)
(2): 5 (m) + 2 (m) = 7 (m)
(1) の式では、後の事を考えて m2 と書かずにあえて m x m と書いてみた。

計算のイメージとしては、例えばこんな感じだろう。

さて、では上記の例で単位を変えてみよう。

具体的には、2 m を 200 cm にしてみる。

掛け算は
(1'): 5 (m) x 200 (cm) = 1000 (m x cm)

今、1 cm = 1/100 m なので、
1000 (m x cm) = 1000 (m x 1/100 m) = 1000 x 1/100 (m x m)

これを (1′) と合わせると、
(1''): 5 (m) x 200 (cm) = 10 (m x m)

となり、(1) と同じ値になった。短い方の棒を 2 m と考えても 200 cm と考えても同じ値が出る。ここまでは、当たり前の事が当たり前にできる事の確認だ。

では、足し算はどうだろう?5 m と 200 cm を無理やり足し算してみる。
(2'): 5 (m) + 200 (cm) = 205 (m + cm) --- ???

う〜ん、無理やり計算してみると、おかしな値が出てきてしまった。

5 m の棒と 200 cm の棒を足し算すると 7 m になるはずだ。しかし、1 cm = 1/100 m という関係式をどう使っても 205 という数字から 7 という数字を導出できそうにない。

厳密な説明ではないが、単位の違う値の掛け算はできるが割り算は出来ない事が直感的に分かるだろう。

と、ここまで書いて思ったのだが、俺自身も単位の違う値の足し算が何で出来ないのか厳密な説明って知らない。高校生相手に偉そうな事言いながら、俺もまだまだだなと思った今日このごろ。

php empty 関数ではまった

このエントリーは IT エンジニア向けです。

何の因果か、最近 php を書いている。最後に php 書いたのいつだろう?確か iPhone アプリのサーバーサイドを実装した時かな。もう金輪際 php は使いたくないと思った日々が懐かしい。まあ、最近は type hint もついたし、php も昔ほど嫌いじゃないけどね。

そんな中、久しぶりに php 書いたら若干ハマったことが合ったので書いてみる。

俺は Bitcoin に代表される暗号通貨関連の仕事をしている分けだが、残念な事に php では関連するライブラリがまだ少ない。どっかのオープンソースから拝借しようかとも思ったが、php 製の有名なオープンソースも見つからなかった。(探せば有るんだが、わざわざソースをハックする信頼性や価値が有るとは思えなかった。)

ってな分けで、俺の感覚ではどっかのライブラリ使いたくなるような下回りのメソッドも今回は自力で実装するハメに。とはいえ、俺自身、暗号通貨についての知識はまだ浅いし中、下回りの実装は勉強にもなるので悪いことばかりではない。

半分イヤイヤ、半分ウキウキでライブラリの実装を行った。

ところが、このライブラリを使った環境で負荷検証でポチポチエラーが出てくる。エラーの原因は負荷ではないっぽい。プログラムのバグだ。

「エッヂケースかな?」と思い、色々な境界値を入れてテストしてみたが、正常に動く。分からん。

至る所に var_dump を入れ print デバッグを行っていると、巨大整数の取り扱いでエラーが起こっているような気がしてきた。

ご存知の方も多いかもしれないが、php ではネイティブで巨大な整数が取り扱えない。俺の環境では、整数は 64 bit の固定長だった。64 bit ではとても足りなかったので自前で巨大整数を扱う関数を作ったのだ。そこでエラーが発生しているらしい。

ただ、正直なところ最初は信じられなかった。

ここでエラーが起きると後で面倒な事は分かりきっていたので、テストも少し入念に行った。一方、これらの機能は副作用が無いのでテストはどれも簡単だ。それなのに、本当にここでエラーが起きるのか?

半信半疑で再度色々とやってみると、驚きの結果が。

なんと、48 という数字を用いた時だけ四則演算(足し算、引き算、掛け算、割り算)の結果がおかしくなっていたのだ。何でよりによって 48 ?全部エラーなら分かる。0, 1, 255, 256 というコンピューター的に特別な値だけでエラーが起こるのも、分かる。でも何で 48 ?

完全に混乱しながらデバッグを続けて、やっとわかった。

php 組み込みの empty 関数だ。

empty はデータが空かどうかを判断する。例えば、空の array や空の string を渡すと TRUE を返し、それ以外の場合は FALSE を返す。

と、思っていた。

だが実際には、少し例外が合ったようだ。

‘0’ という文字列 (数字の 0 を表す文字列) を渡した時も empty は TRUE を返す。

俺は大きい整数を扱うために整数を byte 列に変換し、string として保存していた。そして、その string が空の場合は数字の 0 として扱うよう、empty を使って文字列をチェックしていた。ところが 48 という数字を byte 列にすると php が文字列の ‘0’ と解釈し、empty が俺の意図に反する挙動を示したのだ。(‘0’ の ascii コードは 48)

つまり、48 という数字が所々で 0 に変換されていたため、計算結果がおかしくなっていた。php プログラマの間では常識なんだろうけど、知らなかった。

php の型は超弱い事は知っていた。だからこそハマるとしたらこういう所だと思って注意していたのに、それでも落とし穴を踏みぬいてしまった。なんか悔しい。