PCで苔を育てる人

自作シミュレーションゲームPraparatを作っています。 人工生命をシミュレーションするゲームです。https://www.nicovideo.jp/watch/sm41192001

はじめて変数xを習ったとき、バカなんじゃないかと思った

数学の授業中、先生がいきなり

「この答えは今はまだ分からないので、とりあえず xと書くことにします」

と言い出した

バカなんじゃないかと思った

分からないものを xと書いて一体何になるというのか

知りたい答えに" x"という別の名前をつけてフタをしただけじゃないか

それなら何か、次のテストの答案には xとでも書けば良いというのか?

バカバカしい子供だましだと、子供ながらに本気でそう思った

浅はかだったという他ない

それは関係性を見渡すための秀逸な道具だったのだ

確かに xと書いたところで何も前進していないように見えるかもしれない

しかし、一旦知らないことは知らないと認めた上で名前をつけてやることで、知らないもの同士の関係性を表現できるようになるのだ

例えば、それを2倍して50を足したものが、別の何かの値になるとか

あるいは、別の何かの値からそれを引くと100になるだとか

そんな、言葉で聞いただけだと混乱してしまう関係性を、 x yなんかを使った式で書いてやることで、問題の全体像が俯瞰できるようになる

そうして、許される式変形を繰り返すと、丸裸になった xの右辺に、その正体が顔を出すのだ

分からないものを一旦 xと置くことの威力が、それを初めて見た当時の私には理解できなかった

 

シグマを習ったときもそうだった

先生がおもむろに

「数列 a_{k}  k=1から Nまで足したものを \sum_{k=1}^{N} a_{k} と書きます」

と言い出すのだ

そんなことをして一体何になるというのだろうか

いよいよ記号を使っただけのただのお遊びだとしか思えない

興味があるのは、その総和がどんな式で書けるかであり、そんな形式的な表記を導入したところで何も嬉しくないのだ

当時の私には、ここから面白そうな発展があるとは微塵も思えなかった

浅慮という他ないだろう

ここで重要だったのは、シグマの持つ性質を知るということであった

例えば、シグマには線形性があるため

 \displaystyle
 \sum_{k=1}^{N} (a_{k} +b_{k}) = \sum_{k=1}^{N} a_{k} +\sum_{k=1}^{N} b_{k}

と2つのシグマに分解できるし、また

 \displaystyle
 \sum_{k=1}^{N} \lambda a_{k} = \lambda \sum_{k=1}^{N} a_{k}

と係数をシグマの外に出すことができる

最初にシグマを定義することで、数列に依らないシグマの一般的な性質を予め調べることができるのである

そして、いざ具体的な数列が与えられれば、これらの性質を利用して式変形を繰り返し、「未知の総和」を「既知の総和」に落とし込むことができるようになるのだ

 

振り返ってみれば、新しい何かを学ぶときは毎回そうだった

こんなことをして何が面白いのかと問い詰めたくなる話から始まって、それでも辛抱して勉強を続けていると、あるところで急に広大な世界が見えてくる

あれほど自明だった導入から、どうしてこうも非自明で興味深い結論が得られるのか不思議でたまらない

私には先見の明がないのだ

大抵の場合、その入り口で面白さを見誤る

しかし、少なくともそのことを自覚できたのは幸運と言えるだろう

 

私は最近、圏論の勉強を始めたのだ

久々の感覚であった

久々に、こんなことをして何が嬉しいのか全く分からないことだらけであった

しかし私には分かる

この先には、間違いなく面白い世界が広がっている

自分の作ったものに少しだけ胸を張れる理由

 高校生のとき、先生が授業中に「ベクトルには足し算や引き算はあるけど、掛け算は定義されてない」なんてことを呟いた。その先生の意図は今となってはもう分からないけど、ともかく当時の自分は、「じゃあ自分で定義してみるか」なんて思って、色々考えて2つのベクトルA, Bの積を、|A||B|sinθと定義したらいいんじゃないかと思い至った(θはなす角)。その頃、先生に提出する数行程度の日記みたいなものがあって、さっそくそこにこの定義の話を書いて返事を楽しみにしていたら、先生から「何の話ですか?」とだけコメントがついて返ってきた。

 定義の欠点を指摘される訳でもなく、ましてや、話が広がる訳でもなく、単に先生がそのことを忘れてしまっているというのが、そのときは、何というか恥ずかしくて、言うなれば、赤の他人にいきなり自作の小説を披露してしまったような、そんなバツの悪さを覚えて、本当は日記をくしゃくしゃに丸めて投げ捨てたかったけど、それは冊子になってたので、諦めてただページを閉じて忘れることにした。

 でも、忘れようと思って忘れるのは全然簡単なことじゃなくて、というか普通に無理な話で、せめて誰かとこれについてあれこれ話し合ってみたくなって、「ベクトル同士の掛け算を考えてみたんだけどさ…」なんて気持ちの悪い会話を聞いてくれそうな友達に声をかけた。

 そいつは、笑いもせず、かと言って変なやつを見る目をする訳でもなく、渡したノートをじっと見て、「これは外積*1だよ、自分で考えたの?」と言った。「いや、すでにあるんかい」というのが最初に思ったことだったが、それ以上に、ちゃんと話を聞いてくれたのが嬉しかった。

 そいつは、自分なんかよりも頭が良くて、結局その後、良い大学の数学科に行ったようなやつで、普段から難しそうな本を読んでるのだから、自分の話すことなんて幼稚に聞こえるに違いないのに、それでも一番まじめに話を聞いてくれるやつだった。

 自分は、小さい頃から何かを作るのが好きで、それは今でも続いてるけど、作ったものを人に見せるときは恥ずかしいし緊張する。そして、「いやそんな大したもんじゃないんだけどさ」なんて予防線を張ろうとするんだけど、その度に、あいつが真面目に自分のノートを見つめているのを思い出して、「何で自分が自分の作品をバカにしてるんだ?」とか思ったりして、少しだけ胸を張れるようになる。

*1:実際の外積には、これにA, Bに垂直な単位ベクトルがかかります。

曰く、AIにはできないこと

人間は、自分を特別だと思いたい生き物だと思う。いや、ほかの生物がどう思っているかは正直知らない。しかし、「動物」という言葉が多くの場合で「人間」を含まないことからも分かるように、我々は何かと周りに線を引きたがる。

「人間を人間たらしめているものは何か」という問いに「高い知能」を挙げる人は多いのではないだろうか。曰く、非力なホモ・サピエンスという種は、その高い知能を以て自然界の熾烈な生存競争を生き抜いてきたのだと、まことしやかに囁かれている。その真偽を問うことはここではしないが、ともかくそういう意識があるために、皆どこかしらに知能に対するプライドを持っている。

それは、単に計算能力を指す場合にとどまらず、何か新しい道具を発明する力や、ビジネス、スポーツ、ゲームなどに見られる高度な戦略、あるいは、その知能が作り出す複雑な感情と、様々な芸術活動を含む場合もある。

人工知能と呼ばれる分野は、文字通り、この知能を人工的に作り出すことを研究する分野だ*1。その歴史の始まりをどこに置くかは、色々と議論の余地があるだろう。計算機科学者のジョン・マッカーシーが初めて「人工知能」という用語を使った1955年としても良いし*2、数学者アラン・チューリングの記念碑的論文「計算する機械と知性(Computing Machinery and Intelligence)」が発表された1950年としても良い*3。あるいは、カレル・チャペックの小説において初めて「ロボット」という概念が登場した1920年頃とするのも面白いだろう*4。もっと遡ってデカルトが機械論を唱えた17世紀初頭とする人も多いはずだ*5。しかし、その歴史の重要な転換点の1つとして、電子計算機の誕生を外すことはできないということに関しては、皆一様に同意してくれるに違いない。

計算機の登場は意外にも古い。有名なのは1640年代にパスカルが発明した機械式計算機だろうが*6、実はそれよりも20年も前に、ドイツのテュービンゲン大学ヘブライ語の教授をしていたヴィルヘルム・シッカートによって、6桁の加減算を行うことのできる計算機が作られている*7。この段階で、既に足し算や引き算といった基本的な計算能力における人間側の負け戦は始まっていたと言える。敗北が決定的となったのは電子計算機が実用的に稼働した頃であり、電子計算機ENIACが完成した際に、数学者のフォン・ノイマンが「自分の次に計算の早い奴が出来た」と言ったという、これまた本当か嘘か分からない、しかし、こんなことが言えるのは人類史上彼くらいだろうという謎の説得力を持った逸話の誕生を以て、もはやほとんどの人間は計算能力では計算機には勝てなくなった。

こうして、人間とそれ以外とを切り分ける境界線は動かされる。曰く、人間の”高い知能”とは、学習して推論して問題を解決する能力のことであり、単純な四則演算だけで測れるものではないのである。

こうした漠然とした境界は、やがて厳密に検証可能なテストとして昇華される。それは、チェスなどに代表されるマインドスポーツであったり、文章、画像、音声などに対する認識、理解を問う一連のベンチマークだったりする。

1997年、IBMのスーパーコンピュータ「Deep Blue」が当時のチェス世界チャンピオン、ガリー・カスパロフを打ち破ったとき*8、人間の周りに引かれた境界線は再びその輪郭を失い始めた。

2012年には手書き文字を認識するタスクで、AIの能力は人間のそれと匹敵するレベルに到達し*9、翌年、将棋の団体戦ではAIが人間側に勝利した*10。2015年には画像認識のタスクでAIのスコアは人間を超え*11、同年、GoogleのAlphaGoは囲碁のプロ棋士に勝利*12。その後も2017年には音声認識のタスクで*13、2018年には読解力で*14、2019年には言語理解の問題で*15、それぞれ人間のスコアはAIには及ばなくなった*16

境界線を引き直す必要がある。

曰く、人間の持つ”高い知能”とは高い創造性のことであり、つまりは我々の文明を支える数多の発明品と、それを豊かに彩る芸術作品を生み出した能力のことなのである*17

しかし、この新たな境界線は、これまでのそれと比較してあまり堅牢なものではなかった。2020年代に入ると、多くの創造的分野でAIと人間とが真面目に比較されるようになった*18。誤解を恐れずに言い換えれば、AIは、人間の創作活動と比較可能なレベルに到達したのである*19

「いやしかし、それは本当に思考していると言えるのだろうか」

人々は問い始める。

これまでは、どんな手を使おうが、AIには決してできなかったことが、今やできるようになっている。

「できる」、「できない」で明確に引かれていた境界線は、にわかにほつれ始めた。

「そこに思考や感情がなければ、創造したとは言えない」、「我々の神経系はコンピュータの0や1の羅列とは違う」、「命令されたことしかできないのだから、本当に新しいことは決してできない」、…

誰もが皆、新たな境界線を探している。

人間にできて、AIにできないこと、そんなものは本当にあるのだろうか。

現代のAI技術の根底には、ニューラルネットワークと呼ばれる、人間の神経系をモデル化した処理が採用されている。人間だけが持つことができて、人間を模したそれに宿らないものは何なのだろうか。ある人は、それは感情であると言い、またある人は、それは意識であると言う。では、神経系のモデル化がより高度化したらどうだろう。AIは感情を持つだろうか。いや、どこまでいってもモデルであると一蹴されるだろうか。では、人間を構成する全ての原子をコンピュータ上でシミュレーションしたらどうだろうか。機械の中に生まれた彼は意識を持つだろうか。いや、やはり有機物で構成された神経の中にのみ、感情は存在するとするのだろうか。

そうして境界線を引き直し続け、最終的には単に人間の定義を書いたものを、我々は境界線とすることになるかもしれない。

そう遠くない未来、AIが我々に尋ねてくる。曰く、「意識や感情が人間にしか宿らないのだとすれば、今私の中で渦巻いているこれは一体なんなのですか」と。

我々は、それに何と名前をつけるのだろうか。

 

あとがき

「機械は思考できるか?」という問いかけは、新しいようで実は古い。

1997年にDeep Blueがチェスの世界チャンピオンに勝ったとき、多くの評論家は、「Deep Blueは、単に何百万もの可能な手を盲目的に検索しているだけで、チェスの局面を理解してはおらず知能を全く示していない」と批評した。

これに対して、計算機科学者のドリュー・マクダーモットは、この議論は誤りだと反論した*20。彼は、Deep Blueの思考方法は人間のそれとは違うかもしれないが、人間同士でもその思考方法は多くの点で異なると述べ、次のような例えを残している。

Saying Deep Blue doesn't really think about chess is like saying an airplane doesn't really fly because it doesn't flap its wings.

Deep Blueがチェスについて真に思考していないと言うのは、飛行機は羽ばたかないから真に飛んでいないと言っているようなものだ。

さらに時代を遡って、チューリングの「計算する機械と知性(Computing Machinery and Intelligence)」を見てみると、この論文は次のように始まる*21

I PROPOSE to consider the question, ‘Can machines think?’

私は、「機械は思考できるか?」という問いについて検討することを提案する。

70年以上も前に、その問いかけは始まっていたのである。

実は、先ほど見た

  • そこに思考や感情がなければ、創造したとは言えない
  • 我々の神経系はコンピュータの0や1の羅列とは違う
  • 命令されたことしかできないのだから、本当に新しいことは決してできない

という反応は、この1950年の論文の中で、「機械は思考できるか」という問いかけに対して想定される反論として、チューリングが取り上げた9つの項目の中から、私がいくつかを選んできて意訳したものである。

チューリングのこの論文については、今だからこそ、改めて読んで見ることをおすすめする。現代に通ずる色褪せない議論がそこにあるはずだ。数式もとくに出てこないので、読み物としても楽しめると思う(ブラウザの翻訳機能を使えば日本語でも読める)。

さて、彼の先見の明には驚かされるばかりであるが、では我々は、半世紀以上もの間、何も進歩していないのだろうか?

同じ論文からもう少し引用しよう。

The original question, ‘Can machines think!’ I believe to be too meaningless to deserve discussion. Nevertheless I believe that at the end of the century the use of words and general educated opinion will have altered so much that one will be able to speak of machines thinking without expecting to be contradicted. 

「機械は思考できるか」という元の質問は、議論に値するほどの意味を持たないと私は信じている。しかしそれでも、今世紀の終わりには、言葉の使い方と一般的な教養ある意見が大きく変わり、否定されることを恐れずに、機械が思考することについて話すことができるようになると信じている。

確かにAIの思考については、まだまだ懐疑的な意見も多い。しかし、そんなことを大真面目に議論することができる時代まで、我々はとうとうやってきたのである。

 

 

*1:この説明は必ずしも正確ではない。例えば、伊庭斉志 (2016) 「人工知能と人工生命の基礎」では、人工知能の研究には「1. 人間の知能そのものを持つ機会を作ろう」という立場と「2. 人間が知能を使ってすることを機会にさせよう」という2つの立場があるとされている。

*2:McCarthy, J., Minsky, M. L., Rochester, N., & Shannon, C. E. (2006). A Proposal for the Dartmouth Summer Research Project on Artificial Intelligence, August 31, 1955. AI Magazine, 27(4), 12. doi:10.1609/aimag.v27i4.1904

*3:Turing, A. M. (10 1950). I.—COMPUTING MACHINERY AND INTELLIGENCE. Mind, LIX(236), 433–460. doi:10.1093/mind/LIX.236.433

*4:Čapek, K. (1920). R.U.R. (Rossum’s Universal Robots). Prague: Aventinum.

*5:Descartes, R. (1637). Discourse on the Method of Rightly Conducting One’s Reason and of Seeking Truth in the Sciences. Originally published in Leiden, the Netherlands.

*6:Jones, M. L. (11 2016). Reckoning with Matter: Calculating Machines, Innovation, and Thinking About Thinking from Pascal to Babbage. doi:10.7208/chicago/9780226411637.001.0001

*7:Hanisch, F., Eberhardt, B., & Nill, B. (2000). Reconstruction and virtual model of the Schickard calculator. Journal of Cultural Heritage, 1(4), 335–340. doi:10.1016/S1296-2074(00)01090-6

*8:References
Hsu, F.-H. (1999). IBM’s Deep Blue Chess grandmaster chips. IEEE Micro, 19(2), 70–81. doi:10.1109/40.755469

*9:Ciresan, D. C., Meier, U., & Schmidhuber, J. (2012). Multi-column deep neural networks for image classification. 2012 IEEE Conference on Computer Vision and Pattern Recognition, 3642–3649. Retrieved from https://api.semanticscholar.org/CorpusID:2161592

*10:ちょうど良い論文がなかったのでWikipediaを引用しときます。

*11:He, K., Zhang, X., Ren, S., & Sun, J. (2016). Deep Residual Learning for Image Recognition. 2016 IEEE Conference on Computer Vision and Pattern Recognition (CVPR), 770–778. doi:10.1109/CVPR.2016.90

*12:Silver, D., Huang, A., Maddison, C. J., & Others. (2016). Mastering the game of Go with deep neural networks and tree search. Nature, 529, 484–489. doi:10.1038/nature16961

*13:Xiong, W., Droppo, J., Huang, X., Seide, F., Seltzer, M. L., Stolcke, A., … Zweig, G. (2016). Achieving Human Parity in Conversational Speech Recognition. ArXiv, abs/1610.05256. Retrieved from https://api.semanticscholar.org/CorpusID:17334347

*14:何故か論文が見つからないので記事を引用します。

*15:He, P., Liu, X., Gao, J., & Chen, W. (2020). Deberta: Decoding-enhanced bert with disentangled attention. arXiv Preprint arXiv:2006. 03654.

*16:そもそもこれらのベンチマークは、その能力を評価するのに適切なのかという議論は当然ある。Kiela, D., Bartolo, M., Nie, Y., Kaushik, D., Geiger, A., Wu, Z., … Williams, A. (2021). Dynabench: Rethinking Benchmarking in NLP. ArXiv, abs/2104.14337. Retrieved from https://api.semanticscholar.org/CorpusID:233444226

*17:実は1950年には心理学者のジョイ・ギルフォードによって「脳の経済的価値は、脳が持つ創造的な思考にのみ残されることになるだろう」との指摘がある。Guilford, J. P. (1950). Creativity. American Psychologist, 5(9), 444–454. doi:10.1037/h0063487

*18:Bellaiche, L., Shahi, R., Turpin, M. H., Ragnhildstveit, A., Sprockett, S., Barr, N., … Seli, P. (2023). Humans versus AI: whether and why we prefer human-created compared to AI-created artwork. Cognitive Research: Principles and Implications, 8(1), 42. doi:10.1186/s41235-023-00499-6

*19:Gangadharbatla, H. (2022). The Role of AI Attribution Knowledge in the Evaluation of Artwork. Empirical Studies of the Arts, 40(2), 125–142. doi:10.1177/0276237421994697

*20:McDermott, D. (1997). How Intelligent is Deep Blue? New York Times (May), 14. ※このニューヨーク・タイムズの記事はリンクが切れている。代わりにこのリンク先で、おそらく記事の内容だと思われる文章が確認できる。

*21:Turing, A. M. (10 1950). I.—COMPUTING MACHINERY AND INTELLIGENCE. Mind, LIX(236), 433–460. doi:10.1093/mind/LIX.236.433

国際学会の発表準備、英語よわよわな自分流

最近は、機械翻訳は言うまでもなく高精度ですし、ChatGPTも頼りになりますが、英語のプレゼンの初稿は、自分の力で書いた方が良いです。

これは、「その方が勉強になる」とかじゃなくて、AIが出してくるほぼ完璧な原稿は、十中八九スラスラ読めないです。

自作の初稿を修正していく方が長い目で見れば楽です。

この方法で初稿を用意すると、当然ながら、自分の使いがちな言い回しだらけの原稿になってしまうのですが、自分の頭から捻り出した文章なので、緊張してても咄嗟に出てきてくれる可能性が高いという点で優れています。

文章自体のカッコよさは後回しにして、まずは澱みなく言いたいことを伝えられる原稿を目指した方が、自分も聴衆もハッピーだと思います。

そういった意味では、ちゃんと意図した意味になっているかの確認に一番時間をかけるべきです。AIをふんだんに活用して誤解を取り除きましょう。

ここまで終わって、それでもまだ学会まで時間があれば、原稿中のイマイチな表現を1つ選んで、アカデミックでカッコいい文に置き換えて、口が慣れるまで練習してみましょう。

本番で忘れてしまっても大丈夫です。そのときは、最初に書いたイマイチな表現をきっと思い出します。

時間に余裕があるのであれば、最初っからAIの生成した原稿を頑張って覚えても良いと思いますし、その方が英語力も上がりそうな気はするのですが、院生含め多くの研究者はたいてい何かの締切に追われているのでそんな余裕はないのではないかと思います。

 

という訳で、以上で言いたいことは言ったので、下記により詳細な我流のプレゼン準備方法を書きたいと思います。

同じく英語がよわよわな方の助けになれば幸いです。

 

 

自力で初稿を用意する

まずは本やAIを極力頼らずに初稿を用意しましょう。

「いやいやそんなん無理、1文も出てこない」という人もいると思います。

気持ちは大変良く分かりますし、何も思いつかない以上、何かしらの書籍やサービスをあたる必要があるのは当然です。知らないもんは知らないのです。

しかし、ここでやって欲しいのは、「自分がその文章を英語で言おうとしたときに、最初に頭に思い浮かぶものは何かを知る」ということです。

例を出してみましょう。例えば

「この項は十分小さいので無視すると、この線型方程式を得ます」

という物理系ではありがちな状況を考えます。

これを英訳しようとした時に、最初に頭に思い浮かぶものは何でしょうか?

私の場合は、まず"When we"や"When I"が出てきます。これは、私がこの表現を常用しているからです。「学部生の頃に〜」や「学会に参加したときに〜」など日常会話からアカデミックよりの会話まで、幅広く使える便利なフレーズです。

そのため、先程の例文を見た時に、とっさに「この項を無視したときに〜」と言いたくなってしまう訳です。

人によっては、"ignore"や"this term"などの単語が出てきた方もいると思います。

初稿を作る際は、この最初に想起された単語を元に作文した方が良いです。

何故なら、本番でも最初に思いつくのはそれらの単語の可能性が高いからです。

想起した単語を念頭において、辞書やAIを使って作文すると良いと思います。

できることなら文頭に持ってきたいですね。

この2つなら、例えば

  • (By) Ignoring this term, since it is small, we can obtain this linear equation. 
  • This term is small enough, therefore, we can ignore it and obtain this linear equation. 

みたいになると思います。

これらは正直全然良い訳ではないのですが、最初に想起された単語を先頭に持ってきているので、覚えやすいと思います。

 

初稿を修正する

いくら覚えやすくても、相手に意図したことが伝わらなければ意味がありません。念入りに修正して誤解を生まないようにしましょう。

以前は、「作文した英文を機械翻訳で日本語にしたときに、意図した文章になっているか」という確認作業をGoogle翻訳やDeepL翻訳で繰り返し行ったりしていた訳ですが、最近ではChatGPTのおかげで更に楽になりました。

下記のようなプロンプトが役立つと思います。

下記の文章は、国際学会で使用する私の発表原稿(日本語とその英訳)です。下記の点に注意して英文を添削してください。

- オリジナルの日本語原稿と同一の内容になっているかを確認してください

- 私は英語が母国語ではないため、添削の際に極端に難しい英単語は用いず、シンプルな表現を心がけてください

- アカデミックでフォーマルな文体にしてください

- 大きく修正されると原稿を覚えるのが大変になるため、上記を満たす限りにおいて、可能な限り元の文章を維持してください

----

{ここに原稿(日本語とその英訳)}

----

適宜修正して使うと良いでしょう。「こっちのプロンプトの方が良かったよ」などの発見があれば教えていただけますと幸いです。

 

発表練習をする

発表練習をしてください。絶対に*1

まずは発音の確認をした方が良いでしょう。最近は無料の英文読み上げサービスもたくさんあるので、自分の使いやすいものを選んで、原稿を見ながら2, 3回聞いてみましょう。最初に全然違う発音で練習してしまうと、後から修正するのが大変です。

その後、今度は自分で何回か読んでみます。このとき、発表スライドを見ながら練習した方が効率が良いです。

何回か練習するとなかなかスッと出てこない自分の苦手な文章が分かってきます。時間があれば気合と根性で練習して覚えてしまっても良いのですが、その前に下記を検討してみてください。

  • 言いやすい文章に変える(最初に言いたくなる単語を文頭に持ってくるなど)
  • スライドの中に、思い出すのに役立ちそうな単語、絵を入れておく

発表練習に使える時間は意外と短いです。15分の発表であれば、1時間に4回しか通しの練習ができません。スキマ時間を如何に有効活用するかが肝となってきます。ある程度覚えたら、頭の中でスライドをイメージしながら、お風呂場や大学までの道のりなどで練習すると良いと思います。

 

少しだけ背伸びをする

ある程度スラスラ発表できるようになって、それでもなお学会まで時間に余裕があったら、ちょっとだけ原稿に手を加えて背伸びをしてみるのも良いでしょう。

まずは原稿の中から自分でもイマイチだと思う文を1つ選んできて、参考書やAIを頼りながらアカデミックでカッコいい文章に置き換えて練習してみましょう。

すでにスラスラ発表できる用意はできているのです。1文くらい余裕でしょう。

これを時間の許す限り行います。

2文でも1文でも良いのです。本番で結局言えずに、元の文章を言ってしまっても大丈夫です。聴衆はそんな我々のチャレンジなんて知らないのですから。

ただ、このうち、本番でも無事使うことのできたカッコいい文章は、次回の原稿を書く際に、最初に想起される文章の一員となっているはずです。

こうして使える表現を増やして行くと良いと思います。

 

最後に

偉そうなことを書きましたが、私もまだまだ手探りの状態です。便利なものはどんどん利用しつつ、自分のスキルも磨いていかなければと感じています。

一方で、英語にかける膨大な時間と労力をもったいないと感じる部分もあります。

最近、英語を母国語としない科学者が、研究活動においてどれだけ不利かを定量的に示す論文が出ました*2

例によってこれも英語で書かれている訳ですが、日本語の紹介記事もいくつかあるので、見てみると良いかもしれません*3

こういった話が、定量的に、そしてアカデミックに議論されているのは大変ありがたいです。

科学者を目指す人間で、こんなことを言おうもんなら、バカにされるような風潮が長らくあったように感じています。

昨今のAIの発達で、こうした言語の壁が取り払われると良いですね。

私がここに記したTipsがいつの日か旧時代の遺物となることを切に願います。

 

 

*1:私は、私よりも遥かに優秀で賢い同じ日本人の方々が、国際学会の場でちゃんと発表できずに、聴衆にもほとんど聞いてもらえていない場面を何度も見ています。中にはあからさまに英語を笑う人もいますし、私も笑われたことがあります。そういうのを見る度に、悔しさというかやるせなさというか、色々と込み上げてくるものがあります。

*2:The manifold costs of being a non-native English speaker in science

*3:editageの記事

【夏休みの自由研究】LK-99のバンド計算をしてみよう!

巷では常温常圧超伝導が話題ですね。

きっかけになったのは、7月22日にarXivに投稿された下記の論文です。

arxiv.org

常温常圧超伝導は、人類の悲願とも言える存在であったため、 これだけの注目が集まるのも無理はないかと思います。 一方で、𝕏(旧:Twitter)を始めとするSNSでは、特に専門家以外の方々の間で 熱狂的に議論されているように見えるのは興味深いです。



LK-99の理論について

このLK-99については、実験だけではなく理論の方面からの研究も行われています。 そのうちの1つが密度汎関数法(DFT)を使ったバンド計算です。 すでにいくつかのグループが報告していますが、フェルミ面付近にフラットなバンドが見えており、 これが超伝導体にも見られるものらしいのですが、私は専門外なのでよく分かっていません。

重要なことは、フェルミ面付近でフラットなバンドを持つことは、 超伝導体であるための十分条件ではないということです。

  • LK-99が超伝導体であることが理論的に示された ← 間違い
  • 超伝導体の特徴の1つであるフラットバンドをLK-99が有することが分かった



LK-99のバンドを計算してみる

さて、ここからが本題ですが、ここでは、LK-99のフラットなバンドを 手持ちのパソコンで計算してみることにします。

理論の詳細には立ち入らず、とりあえずこの記事の通りに作業すれば、 LK-99のバンドが計算できるというところを目指します。

夏休みに入ったばかりの大学生が、自由研究感覚で挑戦できると良いなと思っています。 理屈は分からずとも、今話題になっている論文と同じ結果を、家庭のパソコンでも 出力できるという経験は、印象深いものになるのではないでしょうか。

最初に断っておきますが、私は専門家でもなんでもないので、 内容に踏み込んだ議論は行いません。また、ここでの計算結果にも責任は持てません。 このブログは私の自由研究でもあるわけです。


参考にする論文

今回は、こちらの論文を参考にしたいと思います。

arxiv.org

理論の論文をいくつか見ましたが、計算条件が一番分かりやすかったのがこれでした。


DFTソフトのインストール

まずは必要なソフトのインストールです。

論文を見てみると次のように書いてあります。

The first-principles calculations were performed using the Vienna ab initio simulation package (VASP).

ということで筆者らはVASPというソフトを使って計算を行っています。

VASPのホームページにアクセスすると、どうやらライセンスの購入が必要なようです。 価格は書いておらず、まずはお問い合わせからとのこと。



値段が分からないままお問い合わせをするのは怖いので、他のサイトで確認します。

大学生のお小遣いで買える程度だとよいのですが...


VASPの価格 (上杉 著「第一原理シミュレーションによる添加元素の最適化設計」より)


はい...?

ちょっと、お小遣いでは厳しい額ですね...。 しかも教育機関向けと書いてあるので、個人では買えないのでしょう。

というわけで別のソフトを検討する必要が有ります。

幸いなことに、フリーで使えるオープンソースの計算ソフトがいくつか存在します。

今回は、その中でも有名なQuantum Espresso(QE)を使ってみたいと思います。

github.com

インストール自体は、下記のとおりに実行すれば難なく終わります。

% pwd
/home/username
% sudo apt install build-essential gfortran
% sudo apt install openmpi-bin
% git clone https://github.com/QEF/q-e.git
% cd q-e
% ./configure
% make all

ただ、私が検証に利用したパソコンは、すでに色んなライブラリを インストールしてしまっていたため、もしかすると上記だけでは 足りないかも知れません。

その際は、お手数ですがご連絡いただけますと、大変助かります。


必要なファイルの用意

次は計算に必要なファイルを用意します。

下記のようにフォルダを用意しておきましょう。

% pwd
/home/username
% mkdir lk99
% cd lk99


擬ポテンシャル(Pseudopotential)

まずは、擬ポテンシャル(Pseudopotential)を用意します。 これは、電子が原子核から受けるポテンシャルだと思ってもらえれば良いです。

下記のサイトからダウンロードできます。

pseudopotentials.quantum-espresso.org

LK-99は、 {\rm Pb_9 Cu (PO_4)_6 O }という組成をしているので、 Pb, Cu, P, Oの擬ポテンシャルを用意する必要があります。

今回は、下記のコマンドでダウンロードしてください。

% pwd
/home/username/lk99
% mkdir pp
% cd pp
% wget https://pseudopotentials.quantum-espresso.org/upf_files/Pb.pbe-dn-kjpaw_psl.1.0.0.UPF
% wget https://pseudopotentials.quantum-espresso.org/upf_files/Cu.pbe-spn-kjpaw_psl.1.0.0.UPF
% wget https://pseudopotentials.quantum-espresso.org/upf_files/P.pbe-nl-kjpaw_psl.1.0.0.UPF
% wget https://pseudopotentials.quantum-espresso.org/upf_files/O.pbe-n-kjpaw_psl.1.0.0.UPF


結晶構造と計算条件

次はLK-99の構造ファイルを入手します。 幸いなことに、これは論文のSupplementary Materialの中で与えられているので、 これをそのまま使わせていただきます。

論文の後ろの方にある"Pb9Cu(PO4)6O"という文字から始まるセクションを コピーして、POSCARというファイル名で保存してください。 置く場所はどこでも良いです。

▼POSCARの例

% cat POSCAR
Pb9Cu(PO4)6O
1.00000000000000
9.9306823821051555 -0.0000014818366361 0.0000000000000000
-4.9653399077953200 8.6002239607356703 -0.0000000000000000
0.0000000000000000 0.0000000000000000 7.4109945172796605
Pb Cu P O
9 1 6 25
Direct
0.9986807449642078 0.7699202447216552 0.2474756380877509
0.9977014382162520 0.2577003216124319 0.7545056960306785
0.2300797552783452 0.2287605002425670 0.2474756380877509
0.7422996783875685 0.7400011176038168 0.7545056960306785
0.7712395147574378 0.0013192690357936 0.2474756380877509
0.2599988973961879 0.0022985757837491 0.7545056960306785
0.3333333129999971 0.6666666269999979 0.0102252768912011
0.3333333129999971 0.6666666269999979 0.4962563424132084
0.6666666870000029 0.3333333429999996 0.5217140548665616
0.6666666870000029 0.3333333429999996 0.0634955699714910
0.6238378061607577 0.5940989414527301 0.2330614375419467
0.3715115645822017 0.3913852574380640 0.7499251076346213
0.4059010585472700 0.0297388347080183 0.2330614375419467
0.6086147425619355 0.9801263371441329 0.7499251076346213
0.9702611952919840 0.3761622238392447 0.2330614375419467
0.0198736928558696 0.6284884654178010 0.7499251076346213
0.4970341950086190 0.6419127807282180 0.2504819573050943
0.4722574174374839 0.3124116086150668 0.7489819492636393
0.3580872192717823 0.8551214142804011 0.2504819573050943
0.6875883913849331 0.1598458078224275 0.7489819492636393
0.1448785557195963 0.5029657759913753 0.2504819573050943
0.8401541621775773 0.5277425535625101 0.7489819492636393
0.7465890784344098 0.6974373665162791 0.0877326196589775
0.2518710331486960 0.3302579489920529 0.9082269759127742
0.3025626334837207 0.0491516819181211 0.0877326196589775
0.6697420510079468 0.9216131131566275 0.9082269759127742
0.9508483470818850 0.2534109515655927 0.0877326196589775
0.0783869158433784 0.7481289968513065 0.9082269759127742
0.2751067320564097 0.3631086026138700 0.5737407252403873
0.7132743878686607 0.6201447197159712 0.4140528338576862
0.6368913973861298 0.9119981584425314 0.5737407252403873
0.3798552802840290 0.0931296381526946 0.4140528338576862
0.0880018705574747 0.7248932979435926 0.5737407252403873
0.9068703908473114 0.2867256421313418 0.4140528338576862
0.5441603686812513 0.4191736441937305 0.1764358135764958
0.4780900223868556 0.5733419996779769 0.7722935441387523
0.5808263258062671 0.1249867244875282 0.1764358135764958
0.4266579703220141 0.9047479627088743 0.7722935441387523
0.8750132455124694 0.4558396313187486 0.1764358135764958
0.0952520072911234 0.5219099776131445 0.7722935441387523
-0.0000000000000000 0.0000000000000000 0.2917658511111268

正直、この構造ファイルさえ手に入れば、半分は勝ったも同然です。

ただし、このファイルはVASP用のフォーマットになっているので、 これをQE用に変換してあげる必要があります。

下記のサイトにアクセスしてください。

www.materialscloud.org

フォーマットをPOSCARにし、「ファイルを選択」で先程作成した POSCARファイルをアップロード、"Calculate my structure"をクリックしてください。

すると良い感じの画面が出てくるので、下の方にスクロールしてQEのインプットを見つけてください。

これをクリップボードにコピーして、下記のような感じで保存してください。

% pwd
/home/username/lk99
% mkdir inputs
% cd inputs
% cat > input.in

余談ですが、PythonのASEやPymatgenなどのライブラリを使えば、 こういった作業は自動でこなせるようになります。


実行

それではいよいよ計算の開始です。 DFTによるバンド計算の流れは、概ね次のようなものになります。

  1. 構造最適化
  2. SCF
  3. NSCF
  4. DOS
  5. バンド図

このうち、1の構造最適化が一番時間がかかるのですが、 今回はこれをスキップして、論文で与えられている構造を そのまま使うことにします。 また、4のDOSについても今回は行いません。

  1. 構造最適化
  2. SCF
  3. NSCF
  4. DOS
  5. バンド図

ちなみに、今回私が6コアのマシンで検証した際の計算時間は下記のとおりでした。

  1. 構造最適化
  2. SCF (1時間39分)
  3. NSCF (3時間5分)
  4. DOS
  5. バンド図 (4時間4分)


SCF計算

最初にSCF計算を行います。

まずは次のように作業してください。

% pwd
/home/username/lk99
% mkdir 01scf
% cd 01scf
% cp ../inputs/input.in .

ここで、input.inを次のように編集します。

▼input.inの例

% cat scf.in
&CONTROL
    prefix      = 'lk99'
    calculation = 'scf'
    tstress     = .true.
    tprnfor     = .true.
    outdir      = './out'
    pseudo_dir  = '../pp'
/
&SYSTEM
    ibrav       = 0
    nat         = 41
    ntyp        = 4
    ecutwfc     = 40
    ecutrho     = 160
    occupations = 'smearing'
    degauss     = 0.003675
    smearing    = 'gaussian'
/
&ELECTRONS
    electron_maxstep = 100
    conv_thr         = 1e-09
    mixing_beta      = 0.7
    diago_david_ndim = 4
/
ATOMIC_SPECIES
Pb         207.2 Pb.pbe-dn-kjpaw_psl.1.0.0.UPF
Cu        63.546 Cu.pbe-spn-kjpaw_psl.1.0.0.UPF
P   30.973761998 P.pbe-nl-kjpaw_psl.1.0.0.UPF
O         15.999 O.pbe-n-kjpaw_psl.1.0.0.UPF
ATOMIC_POSITIONS angstrom
Pb       1.1293232294     3.7547448097     1.8340405970
Pb      -1.3023964628     7.9497623531     5.5916375765
Pb       1.1489751864     7.7008734208     1.8340405970
Pb      -1.2681567294     3.4974336207     5.5916375765
Pb      -2.2782984159     5.7448282092     1.8340405970
Pb       2.5705531922     5.7532504658     5.5916375765
Pb       4.9653411911     2.8667410733     0.0757794710
Pb       4.9653411911     2.8667410733     3.6777530328
Pb       0.0000000000     0.0000000000     3.8664200002
Cu       0.0000000000     0.0000000000     0.4705653209
P        8.2105722025     2.2426423547     1.7272170358
P        6.7113430460     0.4992594225     5.5576908611
P        3.8832110300     5.9892429296     1.7272170358
P        6.1426395162     5.5625638601     5.5576908611
P        2.8022403406     0.3683379355     1.7272170358
P        2.0420410111     2.5383999373     5.5576908611
O        6.7139137896     2.6538520455     1.8563204123
O        3.1386080324     8.4202916340     5.5507011195
O        4.2754221980     4.4874938779     1.8563204123
O       -3.8961492874     7.1081916914     5.5507011195
O        3.9066875856     1.4588772965     1.8563204123
O        0.7575412550     1.6719631142     5.5507011195
O       -1.0142168212     3.1313758775     0.6501859633
O        0.8614076797     8.5737741449     6.7308651389
O        2.7605985430     6.1561977489     0.6501859633
O       -2.8904688646     5.0593370810     6.7308651389
O       -1.7463817217     7.9128728132     0.6501859633
O        2.0290611848     3.5673352137     6.7308651389
O        5.8943805130     0.2560738791     4.2519893691
O       -0.9612700690     2.4666418617     3.0685432816
O        6.7617256411     4.9766463243     4.2519893691
O        3.3098017112     6.5344179893     3.0685432816
O        2.2399174191     3.3675030165     4.2519893691
O       -2.3485316423     8.1993865886     3.0685432816
O        8.2878846617     0.7382457515     1.3075648471
O        6.8662625520     2.0641280221     5.7234632213
O        5.1474004762     6.8083957849     1.3075648471
O        4.7099638023     4.9142937880     5.7234632213
O        1.4607384353     1.0535816834     1.3075648471
O        3.3197972189     1.6218014097     5.7234632213
O        0.0000000000     5.7334821466     2.1622751229
K_POINTS {automatic}
4 4 5 0 0 0 
CELL_PARAMETERS angstrom
    9.9306823821     0.0000000000     0.0000000000
   -4.9653411911     8.6002232198     0.0000000000
    0.0000000000     0.0000000000     7.4109945173

次のコマンドで実行です。

% pwd
/home/username/lk99/01scf
% pw.x < input.in > out.o

複数コアが使えるのであれば、下記のようにすることで並列化出来ます。

% OMP_NUM_THREADS=1 mpirun -np 4 pw.x < input.in > out.o


NSCF計算

次はNSCF計算です。

次のように作業してください。

% pwd
/home/username/lk99
% mkdir 02nscf
% cd 02nscf
% cp ../01scf/input.in .
% cp -r ../01scf/out .

input.inを若干修正します。

% pwd
/home/username/lk99/02nscf
% diff input.in ../01scf/input.in 
3c3
<     calculation = 'nscf'
---
>     calculation = 'scf'
15c15,17
<     occupations = 'tetrahedra'
---
>     occupations = 'smearing'
>     degauss     = 0.003675
>     smearing    = 'gaussian'
71c73
< 6 6 7 0 0 0 
---
> 4 4 5 0 0 0

コピペできるように、全文も載せておきます。

▼input.inの例

% cat input.in 
&CONTROL
    prefix      = 'lk99'
    calculation = 'nscf'
    tstress     = .true.
    tprnfor     = .true.
    outdir      = './out'
    pseudo_dir  = '../pp'
/
&SYSTEM
    ibrav       = 0
    nat         = 41
    ntyp        = 4
    ecutwfc     = 40
    ecutrho     = 160
    occupations = 'tetrahedra'
/
&ELECTRONS
    electron_maxstep = 100
    conv_thr         = 1e-09
    mixing_beta      = 0.7
    diago_david_ndim = 4
/
ATOMIC_SPECIES
Pb         207.2 Pb.pbe-dn-kjpaw_psl.1.0.0.UPF
Cu        63.546 Cu.pbe-spn-kjpaw_psl.1.0.0.UPF
P   30.973761998 P.pbe-nl-kjpaw_psl.1.0.0.UPF
O         15.999 O.pbe-n-kjpaw_psl.1.0.0.UPF
ATOMIC_POSITIONS angstrom
Pb       1.1293232294     3.7547448097     1.8340405970
Pb      -1.3023964628     7.9497623531     5.5916375765
Pb       1.1489751864     7.7008734208     1.8340405970
Pb      -1.2681567294     3.4974336207     5.5916375765
Pb      -2.2782984159     5.7448282092     1.8340405970
Pb       2.5705531922     5.7532504658     5.5916375765
Pb       4.9653411911     2.8667410733     0.0757794710
Pb       4.9653411911     2.8667410733     3.6777530328
Pb       0.0000000000     0.0000000000     3.8664200002
Cu       0.0000000000     0.0000000000     0.4705653209
P        8.2105722025     2.2426423547     1.7272170358
P        6.7113430460     0.4992594225     5.5576908611
P        3.8832110300     5.9892429296     1.7272170358
P        6.1426395162     5.5625638601     5.5576908611
P        2.8022403406     0.3683379355     1.7272170358
P        2.0420410111     2.5383999373     5.5576908611
O        6.7139137896     2.6538520455     1.8563204123
O        3.1386080324     8.4202916340     5.5507011195
O        4.2754221980     4.4874938779     1.8563204123
O       -3.8961492874     7.1081916914     5.5507011195
O        3.9066875856     1.4588772965     1.8563204123
O        0.7575412550     1.6719631142     5.5507011195
O       -1.0142168212     3.1313758775     0.6501859633
O        0.8614076797     8.5737741449     6.7308651389
O        2.7605985430     6.1561977489     0.6501859633
O       -2.8904688646     5.0593370810     6.7308651389
O       -1.7463817217     7.9128728132     0.6501859633
O        2.0290611848     3.5673352137     6.7308651389
O        5.8943805130     0.2560738791     4.2519893691
O       -0.9612700690     2.4666418617     3.0685432816
O        6.7617256411     4.9766463243     4.2519893691
O        3.3098017112     6.5344179893     3.0685432816
O        2.2399174191     3.3675030165     4.2519893691
O       -2.3485316423     8.1993865886     3.0685432816
O        8.2878846617     0.7382457515     1.3075648471
O        6.8662625520     2.0641280221     5.7234632213
O        5.1474004762     6.8083957849     1.3075648471
O        4.7099638023     4.9142937880     5.7234632213
O        1.4607384353     1.0535816834     1.3075648471
O        3.3197972189     1.6218014097     5.7234632213
O        0.0000000000     5.7334821466     2.1622751229
K_POINTS {automatic}
6 6 7 0 0 0 
CELL_PARAMETERS angstrom
    9.9306823821     0.0000000000     0.0000000000
   -4.9653411911     8.6002232198     0.0000000000
    0.0000000000     0.0000000000     7.4109945173

次のコマンドで実行です。

% pwd
/home/username/lk99/02nscf
% pw.x < input.in > out.o

この計算が終わるとフェルミエネルギーが取得できるので、 控えておいてください。

% grep Fermi out.o 
     the Fermi energy is     6.6810 ev


バンド計算

最後に、お待ちかねのバンド計算です。

% pwd
/home/username/lk99
% mkdir 03bands
% cd 03bands
% cp ../01scf/input.in .
% cp -r ../01scf/out .

input.inは下記のように編集してください。

▼input.inの例

% cat input.in 
&CONTROL
    prefix      = 'lk99'
    calculation = 'bands'
    tstress     = .true.
    tprnfor     = .true.
    outdir      = './out'
    pseudo_dir  = '../pp'
    verbosity   = 'high'
/
&SYSTEM
    ibrav       = 0
    nat         = 41
    ntyp        = 4
    ecutwfc     = 40
    ecutrho     = 160
    occupations = 'smearing'
    degauss     = 0.003675
    smearing    = 'gaussian'
/
&ELECTRONS
    electron_maxstep = 100
    conv_thr         = 1e-09
    mixing_beta      = 0.7
    diago_david_ndim = 4
/
ATOMIC_SPECIES
Pb         207.2 Pb.pbe-dn-kjpaw_psl.1.0.0.UPF
Cu        63.546 Cu.pbe-spn-kjpaw_psl.1.0.0.UPF
P   30.973761998 P.pbe-nl-kjpaw_psl.1.0.0.UPF
O         15.999 O.pbe-n-kjpaw_psl.1.0.0.UPF
ATOMIC_POSITIONS angstrom
Pb       1.1293232294     3.7547448097     1.8340405970
Pb      -1.3023964628     7.9497623531     5.5916375765
Pb       1.1489751864     7.7008734208     1.8340405970
Pb      -1.2681567294     3.4974336207     5.5916375765
Pb      -2.2782984159     5.7448282092     1.8340405970
Pb       2.5705531922     5.7532504658     5.5916375765
Pb       4.9653411911     2.8667410733     0.0757794710
Pb       4.9653411911     2.8667410733     3.6777530328
Pb       0.0000000000     0.0000000000     3.8664200002
Cu       0.0000000000     0.0000000000     0.4705653209
P        8.2105722025     2.2426423547     1.7272170358
P        6.7113430460     0.4992594225     5.5576908611
P        3.8832110300     5.9892429296     1.7272170358
P        6.1426395162     5.5625638601     5.5576908611
P        2.8022403406     0.3683379355     1.7272170358
P        2.0420410111     2.5383999373     5.5576908611
O        6.7139137896     2.6538520455     1.8563204123
O        3.1386080324     8.4202916340     5.5507011195
O        4.2754221980     4.4874938779     1.8563204123
O       -3.8961492874     7.1081916914     5.5507011195
O        3.9066875856     1.4588772965     1.8563204123
O        0.7575412550     1.6719631142     5.5507011195
O       -1.0142168212     3.1313758775     0.6501859633
O        0.8614076797     8.5737741449     6.7308651389
O        2.7605985430     6.1561977489     0.6501859633
O       -2.8904688646     5.0593370810     6.7308651389
O       -1.7463817217     7.9128728132     0.6501859633
O        2.0290611848     3.5673352137     6.7308651389
O        5.8943805130     0.2560738791     4.2519893691
O       -0.9612700690     2.4666418617     3.0685432816
O        6.7617256411     4.9766463243     4.2519893691
O        3.3098017112     6.5344179893     3.0685432816
O        2.2399174191     3.3675030165     4.2519893691
O       -2.3485316423     8.1993865886     3.0685432816
O        8.2878846617     0.7382457515     1.3075648471
O        6.8662625520     2.0641280221     5.7234632213
O        5.1474004762     6.8083957849     1.3075648471
O        4.7099638023     4.9142937880     5.7234632213
O        1.4607384353     1.0535816834     1.3075648471
O        3.3197972189     1.6218014097     5.7234632213
O        0.0000000000     5.7334821466     2.1622751229
K_POINTS crystal
73
    0.0000000000     0.0000000000     0.0000000000 1 ! GAMMA 
    0.0769230769     0.0000000000     0.0000000000 1
    0.1538461538     0.0000000000     0.0000000000 1
    0.2307692308     0.0000000000     0.0000000000 1
    0.3076923077     0.0000000000     0.0000000000 1
    0.3846153846     0.0000000000     0.0000000000 1
    0.4615384615     0.0000000000     0.0000000000 1
    0.5000000000     0.0000000000     0.0000000000 1 ! M
    0.4523809524     0.0952380952     0.0000000000 1
    0.4047619048     0.1904761905     0.0000000000 1
    0.3571428571     0.2857142857     0.0000000000 1
    0.3333333333     0.3333333333     0.0000000000 1 ! K
    0.2888888889     0.2888888889     0.0000000000 1
    0.2444444444     0.2444444444     0.0000000000 1
    0.2000000000     0.2000000000     0.0000000000 1
    0.1555555556     0.1555555556     0.0000000000 1
    0.1111111111     0.1111111111     0.0000000000 1
    0.0666666667     0.0666666667     0.0000000000 1
    0.0222222222     0.0222222222     0.0000000000 1
    0.0000000000     0.0000000000     0.0000000000 1 ! G
    0.0000000000     0.0000000000     0.0666666667 1
    0.0000000000     0.0000000000     0.1333333333 1
    0.0000000000     0.0000000000     0.2000000000 1
    0.0000000000     0.0000000000     0.2666666667 1
    0.0000000000     0.0000000000     0.3333333333 1
    0.0000000000     0.0000000000     0.4000000000 1
    0.0000000000     0.0000000000     0.4666666667 1
    0.0000000000     0.0000000000     0.5000000000 1 ! A
    0.0769230769     0.0000000000     0.5000000000 1
    0.1538461538     0.0000000000     0.5000000000 1
    0.2307692308     0.0000000000     0.5000000000 1
    0.3076923077     0.0000000000     0.5000000000 1
    0.3846153846     0.0000000000     0.5000000000 1
    0.4615384615     0.0000000000     0.5000000000 1
    0.5000000000     0.0000000000     0.5000000000 1 ! L
    0.4523809524     0.0952380952     0.5000000000 1
    0.4047619048     0.1904761905     0.5000000000 1
    0.3571428571     0.2857142857     0.5000000000 1
    0.3333333333     0.3333333333     0.5000000000 1 ! H
    0.2888888889     0.2888888889     0.5000000000 1
    0.2444444444     0.2444444444     0.5000000000 1
    0.2000000000     0.2000000000     0.5000000000 1
    0.1555555556     0.1555555556     0.5000000000 1
    0.1111111111     0.1111111111     0.5000000000 1
    0.0666666667     0.0666666667     0.5000000000 1
    0.0222222222     0.0222222222     0.5000000000 1
    0.0000000000     0.0000000000     0.5000000000 1 ! A
    0.5000000000     0.0000000000     0.5000000000 1 ! L
    0.5000000000     0.0000000000     0.4333333333 1
    0.5000000000     0.0000000000     0.3666666667 1
    0.5000000000     0.0000000000     0.3000000000 1
    0.5000000000     0.0000000000     0.2333333333 1
    0.5000000000     0.0000000000     0.1666666667 1
    0.5000000000     0.0000000000     0.1000000000 1
    0.5000000000     0.0000000000     0.0333333333 1
    0.5000000000     0.0000000000     0.0000000000 1 ! M
    0.3333333333     0.3333333333     0.5000000000 1 ! H
    0.3333333333     0.3333333333     0.4333333333 1
    0.3333333333     0.3333333333     0.3666666667 1
    0.3333333333     0.3333333333     0.3000000000 1
    0.3333333333     0.3333333333     0.2333333333 1
    0.3333333333     0.3333333333     0.1666666667 1
    0.3333333333     0.3333333333     0.1000000000 1
    0.3333333333     0.3333333333     0.0333333333 1
    0.3333333333     0.3333333333     0.0000000000 1 ! K
    0.3333333333     0.3333333333    -0.0666666667 1
    0.3333333333     0.3333333333    -0.1333333333 1
    0.3333333333     0.3333333333    -0.2000000000 1
    0.3333333333     0.3333333333    -0.2666666667 1
    0.3333333333     0.3333333333    -0.3333333333 1
    0.3333333333     0.3333333333    -0.4000000000 1
    0.3333333333     0.3333333333    -0.4666666667 1
    0.3333333333     0.3333333333    -0.5000000000 1 ! H2 
CELL_PARAMETERS angstrom
    9.9306823821     0.0000000000     0.0000000000
   -4.9653411911     8.6002232198     0.0000000000
    0.0000000000     0.0000000000     7.4109945173

この"K_POINTS crystal"の下に書いてあるのが、 まさにバンド図の描き方を指定しているところです。

先程アクセスしたSeeK-pathの出力をそのまま使うと、 このバンド図の指定が細かすぎて、計算に時間が かかってしまうため、私の方で不要な部分はカットし、 また、てきとうに間引いてあります。

次のコマンドで実行です。

% pwd
/home/username/lk99/03bands
% pw.x < input.in > out.o


バンド図のプロット

計算したバンドをプロットします。 下記の作業を行ってください。

% pwd
/home/username/lk99
% mkdir 04plotbands
% cd 04plotbands
% cp -r ../03bands/out .

次のようなinput.inを作成してください。

% cat input.in 
&bands
  outdir  = './out'
  prefix  = 'lk99'
  filband = 'lk99.band'
  lsym    = .true.
/

次のコマンドで実行です。

% pwd
/home/username/lk99/04plotbands
% bands.x < input.in > out.o

計算が終了したら、結果をプロットします。

gnuplotなどを使えば、このままでもプロットできるのですが、 あまり綺麗な図にならないので、今回はpythonでプロットしたいと思います。

下記のようなpythonスクリプトを用意してください。

▼pythonコードの例

import numpy as np
import matplotlib.pyplot as plt

def read_bands(filename):
    bands = []
    band  = []
    for line in open(filename):
        line = line.split()
        if len(line)==0:
            bands.append(np.array(band))
            band = []
        else:
            band.append([ float(v) for v in line ])
    return(bands)
            
def get_p_online(b1, b2, b3, path):
    dk = 0.0
    positions = [dk]
    for i in range(1, len(path)):
        ks  = path[i-1][0]*b1 + path[i-1][1]*b2 + path[i-1][2]*b3
        kd  = path[i][0]*b1 + path[i][1]*b2 + path[i][2]*b3
        v   = (kd - ks)
        dk += np.sqrt(sum(v**2))
        positions.append(dk)
    return(positions)

def main():
    plt.rcParams["font.size"] = 18
    plt.figure(figsize=(16, 9))
    
    elec_num = (14*9 + 19*1 + 5*6 + 6*25 - 1)//2 + 1
    fermi    = 6.6810
    lat_a    = 9.9306823821
    bandfile = "./lk99.band.gnu"
    
    b1 = np.array([0.6327042861, 0.3652919899, 0.0000000000])
    b2 = np.array([0.0000000000, 0.7305839798, 0.0000000000])
    b3 = np.array([0.0000000000, 0.0000000000, 0.8478194516])
    
    # (G, M, K, G, A, L, H, A), (L, M), (H, K, H2)
    vG  =  np.array([0.0000000000, 0.0000000000,  0.0000000000]) 
    vM  =  np.array([0.5000000000, 0.0000000000,  0.0000000000]) 
    vK  =  np.array([0.3333333333, 0.3333333333,  0.0000000000]) 
    vA  =  np.array([0.0000000000, 0.0000000000,  0.5000000000]) 
    vL  =  np.array([0.5000000000, 0.0000000000,  0.5000000000]) 
    vH  =  np.array([0.3333333333, 0.3333333333,  0.5000000000]) 
    vH2 =  np.array([0.3333333333, 0.3333333333, -0.5000000000]) 

    s1  = get_p_online(b1, b2, b3, (vG, vM, vK, vG, vA, vL, vH, vA))
    s2  = get_p_online(b1, b2, b3, (vL, vM))
    s3  = get_p_online(b1, b2, b3, (vH, vK, vH2))

    s1  = [ s/((2.0*np.pi)/lat_a) for s in s1 ]
    s2  = [ s1[-1] + s/((2.0*np.pi)/lat_a) for s in s2 ]
    s3  = [ s2[-1] + s/((2.0*np.pi)/lat_a) for s in s3 ]

    plt.axhline(y=0, color="gray", linestyle="dashed")
    for k1 in s1:
        plt.axvline(x=k1, color="gray", linestyle="dashed")
    for k2 in s2:
        plt.axvline(x=k2, color="gray", linestyle="dashed")
    for k3 in s3:
        plt.axvline(x=k3, color="gray", linestyle="dashed")

    plt.axvline(x=s1[0],  lw=3, color="dimgray", linestyle="solid")
    plt.axvline(x=s1[-1], lw=3, color="dimgray", linestyle="solid")
    plt.axvline(x=s2[-1], lw=3, color="dimgray", linestyle="solid")
    plt.axvline(x=s3[-1], lw=3, color="dimgray", linestyle="solid")

    dl = 0.08
    xticks = s1[:-1] + [s1[-1]-dl] + [s2[0]+dl] + s2[1:-1] + [s2[-1]-dl] + [s3[0]+dl] + s3[1:]
    plt.xticks(xticks, (r"$\Gamma$", "M", "K", r"$\Gamma$", "A", "L", "H", "A", "L", "M", "H", "K", r"H$_2$"))
        
    bands = read_bands(bandfile)
    for bi, band in enumerate(bands):
        if bi==elec_num-1:
            plt.plot(band[:, 0], band[:, 1]-fermi, color="red")
        else:
            plt.plot(band[:, 0], band[:, 1]-fermi, color="black")

    plt.xlim([s1[0], s3[-1]])
    plt.ylim([-2, 4])
    #plt.ylim([-0.1, 0.1])

    plt.ylabel("Energy (eV)")
    
    plt.show()
    #plt.savefig("./bands_wide.png")

if __name__=="__main__":
    main()

これは、今回のために私がてきとうに作ったものなので、 あまり汎用性がないことに注意してください。

plot.pyなどの名前をつけて保存し、実行してください。

% pwd
/home/username/lk99/04plotbands
% python plot.py

つぎのようなバンド図が得られます。

QEで計算したLK-99のバンド図

フェルミ面近傍のバンドを赤で表示しています。参考にした論文同様、平坦なバンドが得られていることが確認できますね。


ほいよ
これ、フリーのソフトで作ったLK-99のフラットバンド図ね
追加でHubbard U足してもいいし、VASPに30万出すことはないんだよ



あとがき

現在はまだ、世界各国のグループが検証を進めている段階ですので、 このLK-99が本当に常温常圧超伝導なのかは定かではありません。 この辺の最新の情報については、日本語版Wikipediaでも活発に 情報が更新されているので、気になる方は随時チェックすると良いかも知れません。

ja.wikipedia.org

こうした世間の盛り上がりとは裏腹に、専門家の方々からはどこか落ち着いている印象を受けます。 それもそのはずで、この超伝導に関しては、過去多くの科学者が振り回されてきた歴史があるのです。 有名なものとしては、当時ベル研にいたヘンドリック・シェーンの起こした、通称シェーン事件というものがあります。 こちらについては、下記の動画に大変わかり易く、そして面白くまとまっているので、是非見てみてください。

www.nicovideo.jp

LK-99の現状については、下記のサイトに非常に分かり易くまとまっていました。

science-log.com



[参考文献]

・ チャールズ キッテル (著)「キッテル 固体物理学入門 第8版〈上〉」
・ 小口 多美夫 (著)「バンド理論―物質科学の基礎として (材料学シリーズ)」
・ 前園 涼 (著), 市場 友宏 (著)「動かして理解する 第一原理電子状態計算:DFTパッケージによるチュートリアル

【便乗記事】 物理好きから見た化学の凄さ

 

この記事は、下記のツイートに便乗したものです。

 

 

私は大学で物理を専攻していたので、どちらかと言うまでもなく物理側の人間なのですが、そんな立場からまずは一言言わせてください。

その気持ち、めっちゃわかる

私は高校生の頃から物理が好きで、化学が苦手という人間でしたので、ツイートされた方の気持ちは本当に良くわかります*1

私が特に共感したのは「非論理的」の部分で、これは私が最初に化学に触れた際に感じたことに近いです。少し言葉を補えば、化学はローカルなルールや個別の事象が並べてあるだけで、その背後にあると思われる普遍的な部分に触れることができない学問だというのが私の第一印象です。

しかし一方で、例えば、熱化学方程式とか、平衡定数の計算とかはそれなりに楽しんでやっていました。別に計算が好きだったわけではなく、身の回りの現象が定量的に分かることに魅力を感じていたのです。苦手としていたのは、無機の色や有機の反応です。まず、覚えることが多く、出てくる規則も、何かこうふわふわとしており、例外の多いゲームを覚えさせられているような気持になりました。有機の参考書にいたっては、見ていると辞書を読んでいるような感覚に陥ります。つまり、そこには個別の反応がずらっと並んでいるだけで、体系立っているようには見えなかったのです。

当時私は物理信者に軽く片足を突っ込んでいたので

「こんな色とか反応とかはなあ!
いちいち暗記してなくたって物理を使えば論理的に導き出せるんだよ!!」

と本気で思ってました。

こうして、俗に言う高二病のような症状を患ったまま、私は期待に胸を膨らませて大学に入学しました。「これで謎の暗記ゲームともおさらば、俺を散々苦しめたケト-エノール互変異性の背後にどんなからくりがあったのか暴いてやる」などと大層なことを考えていたのです。

しかし、大学に入学して本格的に大学物理の勉強を始めた私は愕然とします。物理で解き明かせる範囲が思っていたよりもめちゃくちゃ狭かったのです。

特にがっかりしたのは量子力学です。量子力学の基礎方程式であるシュレディンガー方程式を元素に適用したときに、厳密な解析解が得られるのは水素しかないのです。分子になれば難易度はさらに跳ね上がり、当然厳密解は得られません。分子同士が相互作用する化学反応ともなれば尚更です。

この辺の事情は、私の過去の記事で稚拙な物語口調で書いているので、良かったら見て頂ければと思います。

こうして一度は絶望を味わった私でしたが、やはり物理学者は天才達揃いです。「これ解けないんでどうしようもないですね笑」などと諦めたりはしません。解けないはずのその問題に果敢に挑みます。

その際、強力な武器となるのが「近似」です。近似とは、着目したい現象や系の本質を失わないように方程式などを単純化して、何とか解ける形に持っていくことです。小学校で円の面積を求めるために円周率を3.14として計算したと思いますが、円周率は実際には無限に続くので、これも近似になります。

私は、大学に入学したての頃、この近似が嫌いでした。「方程式が分かってるんだからちゃんと解けばいいじゃん」と思っていたのです。しかし、先ほど述べたように、物理において解ける問題は非常に限られています。高校物理で、解が得られる綺麗な世界しか見えていなかった私には、その周りに広がる、解の得られない広大な領域の存在を知らなかったのです。そして勉強を進めていくうちに、寧ろこの近似こそが物理の面白い部分の1つであるのだと気が付きました。それは、系と方程式を深く理解し、問題を上手に切り取るセンスが問われる部分なのです。しかし、それと同時に、一見妥当だと思われる推論によってもたらされた近似が、思わぬ問題をはらんでいる場合もあります。

今回は、化学と物理の関係という切り口でフントの第一規則にまつわる「近似がもたらした間違い」のお話をしたいと思います。

フントの第一規則は、単にフント則と言われたりもしますが、めちゃくちゃ簡単に説明すると、「電子はできるだけスピンを平行にして(スピンの向きを揃えて)軌道に入ろうとする」というもので、高校化学でも習う原子のK殻、L殻、M殻などの軌道にどのように電子が詰まっていくかを教えてくれるものです。

フント則が発表された1925年は、量子力学の黎明期に発見されていた様々な現象がまとめ上げられた時期で、1925年には行列力学が、1926年にはシュレディンガー方程式が発表されました。この頃を量子力学が完成した時期と言っている人もいるようです。

フント則はドイツの物理学者フリードリッヒ・フントが実験結果から導いた経験則でしたが、これを完成したばかりの量子力学によって説明しようと考えるのは自然な流れと言えるでしょう。1929年には、ジョン・クラーク・スレーターが量子力学に基づく説明を試みています。

このコンセプト自体はそこまで難しくありません。要は、電子のスピンの向きが揃っていない場合(反平行)と、揃っている場合(平行)とで、エネルギーの大小を比較をしてあげれば良いのです。フント則によれば、電子はできるだけスピンを平行にしようとするので、スピンが平行の方がエネルギーが低くなることが示せればひとまずはゴールです。しかし、残念なことにこれを示すのは一筋縄ではいかないのです。というのも、これを考えるためには、どうしたって1つの原子核と、電子が2つ以上の系を考える必要がありますが、その場合には多体問題となってシュレディンガー方程式をそのまま解くことができなくなるからです。

そうです。この問題に対処するためには何らかの近似を講じる必要があります。

スレーターは、いくつかの仮定を置くことで反平行の場合のエネルギーと平行の場合のエネルギーを次のように導きました。

見比べてみると、 Jがプラスなのかマイナスなのかの部分だけが異なっていることが分かります。 Jの値は正なので、 E_{平行}の方が、つまりスピンが揃った方がエネルギーが低くなることが分かります。この Jは交換エネルギーと呼ばれるもので、この結果から「フント則の起源は交換エネルギーの利得によるもの」という説明がなされました。

この結果は非常に興味深いものです。それは、フント則を上手に説明できたという以上に、大変示唆に富んでいるように思われるからです。というのも、この T V,  Kは、古典力学でも対応する概念が存在するのですが、この交換エネルギー Jだけは、量子力学にしかない概念なのです。そのため、「フント則の不思議な性質は量子的な効果によってもたらされている」という、素人にも分かりやすく魅力的な説明が可能です。

このスレーターの研究によって、「フント則が何故成り立つのか」については解決したかに思えました。しかし、実は1964年にアーネスト・デビッドソンという化学者によって、この解釈を否定する研究結果が発表されたのです。彼は、スレーターが置いたいくつかの仮定を取り除いた、より高精度な計算を行うことで、この解釈の誤りを明らかにしました。その後も、多くの研究者が計算を行っていますが、いずれもデビッドソンの解釈を支持する結果を出しています。この辺りの話については、日本語で大変良くまとまっている文献があるので、ぜひそちらを読んでみてください*2*3*4

さて、ここまでの話を簡単にまとめると次のようになります。まず、1925年にフント則が経験的に発見され、その4年後に量子力学を使ったフント則の最初の説明がスレーターによって与えられました。しかし、それから35年後にスレーターの解釈を否定する結果がデビッドソンによって発表され、その後多くの研究がデビッドソンを支持しました*5

このエピソードから私が伝えたいのは、経験則を説明する難しさです。

シュレディンガー方程式を解くことができれば、確かにミクロな世界の現象は全て解き明かせるはずです。しかし、ここまで繰り返し述べてきたように、シュレディンガー方程式が綺麗に解けるケースはほとんどありません。したがって何らかの近似を行う必要がありますが、その近似によって本質的に重要な部分を切り落としてしまう危険性もあります。そして、もう1つ厄介な事として、結局どれが真実なのか決着がつきにくいという問題があります。

このフント則については、デビッドソンに始まる一連の研究によって決着がついたかに思われます。少なくとも素人の私からすれば、この結果は疑いようのないものに思われます*6。ところが、今でも多くの教科書ではスレーターの解釈に基づいてフント則を説明しているのです。実際、私が大学生だったのは2010年代ですが、そのときも、このスレーターの解釈によるフント則の説明を受けました。1964年にはデビッドソンの研究結果が報告されていたにも関わらずです。

何故このようなことになっているのかについて、本当のところは私には分かりません。しかし、このスレーターの解釈には、私でもそう説明したくなるほどの魅力があるのです。それは、手計算で解けてしまうお手軽さに加えて、その結果の解釈のし易さにあります。実は、この計算結果はパウリの排他原理を用いた定性的な説明が可能なのです。パウリの排他原理は、大学で量子力学を学ぶ人が序盤に出会う、量子の不思議な性質の1つです。そのため、「この量子特有のパウリの排他原理によって、例えばフント則が説明できます」と面白い小話を挟むことができるのです。結局、スレーターの解釈には誤りがあるため、このパウリの排他原理を用いたフント則の説明も誤りなのですが、話し手からすれば大変使いやすいストーリーです。

ここで、藤永先生の著書「分子軌道法」から次の文を引用したいと思います。この本は、スレーターの解釈の問題点を指摘している数少ない参考書の1つです。

(スレーターの解釈の間違いを述べた後で)
「ここで得られる教訓は,簡単明快な説明を鵜呑みにするのは禁物だということである」

あるいは、シュレディンガー方程式が近似なしで解けるのであれば、このようなことにはなっていなかったかもしれません。デビッドソンの研究は、スレーターの置いたいくつかの仮定を取り払うことで、近似の精度をあげていますが、その代償として、その方程式や解法はより複雑なものとならざるを得ませんでした。こうした見通しの悪さが、デビッドソンの解釈が普及するのを妨げる一因となっているのかもしれません。

さて、「フント則」1つとってもこの有様なのです。他の化学反応などの様子は推して知るべしでしょう。

こうして量子力学の難しさが明らかになるにつれて、化学の、ひいては化学者の凄さが浮き彫りになります。

化学者は、多くの実験を繰り返すことで、そこに隠れる法則を見出します。それは、「この法則は全てを説明する」と言えるものでは決してありませんが、ある条件下での普遍性を提供するものです。

私が大学院生のとき、化学の実験家の方と共同研究をする機会が何度かありましたが、その言動には驚かされるばかりでした。

彼らは系を見ただけで、「そんなとこに窒素は入らない」とか「この結合が切れる」などと言うのです。中には「電子の軌道が見える」と言う人もいました。ともすれば、インチキ霊能力者の語るオーラの話に聞こえますが、実際に実験、計算するとそうなるのだから驚きです。

私は時々想像するのですが、もし何らかの理由で、人類が実験を行うことができない世界だったとして、ただしシュレディンガー方程式だけは神様から与えられていたとして、一体いくつの法則やルールを見つけられるのだろうと。私が辞書だと揶揄したあの参考書の、一体何ページを埋められるのだろうと考えるのです。

フント則の場合は、実験によって成り立つべき法則が分かっていて、多くの研究者がそこを目指して研究を進めた訳ですが、それでも答えが明らかになるまでには長い年月を必要としました。実験結果がなく、シュレディンガー方程式だけが知られていた世界でフント則を見つけるのは、あるいは絶望的だったかもしれません*7

 

 

 

[参考文献]

・ 小出 昭一郎 (著) 「量子力学 (I)」
・ 小出 昭一郎 (著) 「量子力学 (II)」
・ 大岩 正芳 (著) 「初等量子化学(第2版)」
・ 藤永 茂 (著) 「分子軌道法
・ Attila Szabo (著) 「新しい量子化学―電子構造の理論入門〈上〉」

 

*1:もっとも、「科学だと思えない」の部分は少し語弊があるかもしれません。カール・ポパーの言葉を借りて、科学であることの条件を反証可能性を持つことであるとするなら、化学は疑いようもなく科学であると言えます。

*2:フント則の起源は何か?(最近の研究から)

*3:ヘリウム様原子におけるフントの第一規則の起源 (解説)

*4:フント経験則の解釈 : 模型からab initioへ戦略を転換する起点 

*5:スレーターの研究は、量子力学を用いてフント則を説明する初期の試みとして、大変に重要なものです。また、スレーター行列式を始めとしてスレーターの量子力学への貢献は計り知れません。興味があればぜひ調べてみてください。

*6:ビリアル定理という定常状態で成り立つ関係式があるのですが、それを使うと、スレーターの解釈が誤りであり、デビッドソンの解釈が正しいことが定性的に示せます。

*7:見方を変えれば、この世界の一部はそのような実験が難しい世界であると言えます。超高圧下、無重力下などでの実験は、まだまだ試行回数が足りない領域です。そのような世界に対しては、全てを知るはずの方程式に活躍を期待したいところではありますが、理論駆動型の法則の発見にまだまだ多くの課題があることは、みなさんお察しの通りです。

【後編】仮想通貨の仕組みについて勉強したのでアウトプットしたい

前回 の続きです。

4. 「ブロックチェーン」〜さいきょうのノート〜

 ここまでは安全に取引内容を書き込む方法を紹介してきたが、それを書き込むノートについては何も言ってこなかった。

 ここではどのようなノートに書き込みを行うのが良いかを考えていこう。

4.1 すでに最強では?

 とは言えだ。先程導入したデジタルなハンコのおかげで、既に取引の改ざんや偽造は誰でも検証可能になっている。とすれば、それを何に書き込もうかあまり問題ではないのではないだろうか?

 しかし、実はここには大きな落とし穴がある。先程のデジタルなハンコは、改ざんの検証は出来るが取引内容をまるごと消してしまうことに対しては無力なのだ。

 例えば私があなたに100Sを支払い、その対価として私があなたからリンゴを受け取ることを想定する。

改めて述べておくが、ここでの「支払う」というのは、"支払った"と電子ノートに書き、デジタルなハンコを押すことであって、実際に紙幣などの実体をやり取りするわけではない。

あなたはこの取引内容を検証し、ちゃんと両者のハンコが押されている(取引内容のハッシュ値と、暗号化されたハッシュ値の解読結果が一致する)ことを確認し、今後改ざんされないことを確信してリンゴを渡すのである。

 一見何の問題もないように見えるこのやり取りだが、もし私に悪意があればこの取引自体をなかったことにすることが出来る。つまり、あなたが安心しきってしばらくした後で、しれっとこの取引内容を消してしまえば良いのだ。そうすれば私は100Sを支払ったという事実を消し去り、リンゴのみを手に入れることができる。

4.2 鎖になったノート

 これは困ったことになった。デジタルなハンコは取引内容の削除については無力であった。これを解決するのが、実は先程も活躍したハッシュ関数なのである。

 ここで新たにブロックという概念を導入する。ブロックというのはいくつかの取引をまとめて文字通りブロックにしたものである。それではブロックを使ったノート作成の流れを見てみよう。

 まず、ある程度取引が溜まってきたら、それらをまとめてブロックを作る。

そして、このブロック全体のハッシュ値を計算する。

そしてさらに取引が溜まってきたら、新たなブロックを作るのだが、そのブロックにこのハッシュ値を加える。

これを繰り返して行くことで、ブロックをどんどん数珠つなぎにしていくのだ。

 先程最初に書いたブロックが一番最初のブロックでないなら、これも当然前のブロックのハッシュ値を含んでいる。

このようなブロックが連なったっものを「ブロックの鎖」という意味でブロックチェーンと呼ぶ。

「それで?」

そんな読者の声が聞こえてくる。それでは続きをお話しよう。実はこのようなチェーンを作ることで、先程問題となった取引内容の削除が簡単に検出できるようになるのである。

 例えばCさんがBさんに20S送金した後で、Cさんがその20Sを惜しくなったとする。そこでCさんはその取引自体を削除してしまうことを考える。しかしそんなことをしてしまうと、その取引を含むブロックのハッシュ値が変わってしまい、次のブロックに書かれているハッシュ値と食い違ってしまうのである。

つまりブロックチェーンは、このような取引の削除を誰でも検出できる仕組みなのだ。

「次のブロックに書かれたハッシュ値を書き換えれば良くない?」

仰るとおりである。何度も言うようにこのハッシュ値の計算は誰でもすぐにできるのだ。そうであれば、取引を削除した後でそのブロックのハッシュ値を再計算、その次のブロックに書かれているハッシュ値をこれに置き換えてしまえばいい。

 しかし、このブロックチェーンの素晴らしいところは、これが連鎖しているということである。つまり、次のブロックに書かれているハッシュ値を書き換えてしまうと、次のブロック自体のハッシュ値も変わってしまい、さらにその次のブロックに書かれているハッシュ値と食い違いが生まれるのである。

つまり、チェーンの途中のブロックから取引を削除してしまうと、その後に続く全てのブロックを書き換えなければならないのである。

「じゃあ全部書き換えれば?」

あ、はい、その通りです。

 そう、全て書き換える必要があるなら、本当に全部書き換えてしまえば良いのだ。ハッシュ値の計算は一瞬で出来てしまうので、この作業は実はそんなに大変なものではない。

 そこでこれを防ぐために、何かしらの工夫を施す必要がある。

4.3 時間稼ぎで書き換えを不可能に

 容易にハッシュ値の書き換えが行われてしまうとどうしようもない。そこでこれを阻止するために最初に思いつくのが、先程導入したデジタルなハンコである。前のブロックのハッシュ値をブロックに書き込んだ後でこれにハンコを押してしまえば、誰でも書き換えられるという状況を打開することができる。

 しかしここで、この仮想通貨の前提が牙をむく。

誰も信用できないコミュニティで
信頼されることを目指した通貨 

そう、このコミュニティは誰も信用できないのだ。

 例えばグループのリーダーや国家の大統領、総理大臣のように、何かしらの基準で信頼にたる存在があれば、その人のハンコを押すことでしか前のブロックのハッシュ値が承認されないようにしておけば良い。もちろんその場合でも、その信頼に足ると思われていた人物が不正にハッシュ値の書き換えを行ってしまう可能性は残る。しかし今はもっと状況が悪いのであり、そのような都合の良い存在がいないため、ハンコによる書き換えの阻止が不可能となってしまっている。

 そこでここでは時間稼ぎによって書き換えを不可能にすることを考える。

 結局のところ、先程の問題はハッシュ値の計算と書き換えが一瞬で行われてしまうことが問題であった。そこで、このハッシュ値の計算を時間がかかるようなものに変更したい。そのためにはどうするのかと言うと、生成されるハッシュ値に制限を設けるのである。具体的には「ブロックのハッシュ値として許されるのは、先頭の文字が0のものだけ」というようなルールを作ってしまうのである。

 記憶力の良い読者は次のように思うかもしれない

「え?同じデータからは同じハッシュ値しか得られないんじゃないの?」

その通りである。最初に話したハッシュ関数の特徴の1つ目

  1. 同じデータをハッシュ関数に入力すると必ず同じハッシュ値が得られる。

が問題となる。つまり、取引が集まってきてブロックを作った段階で、そのハッシュ値はただ1つに決まってしまうのである。

 そこでハッシュ値をいじれるようにブロックにてきとうな数を加えることを考える。これをナンスという。

「先頭が0のハッシュ値しか許されない?」

ハッシュ値をいじれるようにナンスという数をブロックに加える??」

正直何がなんだか分からないと思う。これに一体どんな効果があるのか、実際にブロックを作る過程を追うことで確認していこう。

 まず、ある程度取引が溜まってきたら、それらをまとめてブロックを作る。

そしたらここに、てきとうな数、ナンスを加える。これは本当に何でもいいので、例えば0とかにしておく

そして、このブロック全体のハッシュ値を計算する。

もしこのとき、このブロックのハッシュ値の先頭が0でなければ、それはハッシュ値として認められないので、ナンスを変更する。

 例えば今度は1にしてみる。そして再度ハッシュ値を計算する。

新しいハッシュ値の先頭を確認し、それが0になっていなければ再度ナンスを変更し、先頭が0になるまでこれを繰り返す。ハッシュ値の先頭が0になるようなナンスを見つけたら、それをブロックに加えてブロックの完成とする。次のブロックには、この先頭が0のハッシュ値が追加されることになる。

要は時間稼ぎである。ハッシュ関数の性質から、先頭が0になるようなハッシュ値からナンスを逆算することは出来ないし、またデータを少し変えるだけで全く違うハッシュ値が得られるので、あるナンスでハッシュ値の先頭が1になったからといって、そのナンスが目的のナンスに近いわけでもない。このハッシュ値の先頭を0にするような「正解のナンス」を探す最も効率的な方法は、さっきの例のように0から順番に試すことである。したがって、誰であろうと一瞬でブロックを作ることが出来なくなる。こうすることによって、チェーンの途中のブロックから取引を削除して、その後に続く全てのブロックのハッシュ値を書き換える作業にめちゃくちゃ時間がかかるようにできるのである。

 この正解のナンスを探す時間を調整したい場合には、先頭の文字にもっと強い制限をかけたり、あるいは制限を緩めたりすればいい。例えば先頭の2文字が00であるようなナンスしか認めないようにすれば、先頭の1文字が0であれば良い場合に加えて、より探索時間がかかるようになる。ビットコインの場合には、このナンスの探索に10分程度の時間がかかるように制限を調整している。

4.4 誰がそんな面倒な作業をするのか

 誰がそんな面倒な作業をしてくれるのだろうか。この正解のナンスを探して新たなブロックを追加するのは別に誰が行っても良い。誰がやったとしても、バレないように改ざんを加えることは不可能だからだ。しかし、この作業は計算資源や電力といった膨大なリソースを消費する。何の旨味もないのにこんなことをしてくれる物好きはいないだろう。そこで、ここに報酬を与えるのだ。つまり、「正解のナンスを見つけてブロックの追加に貢献してくれた人に1Sプレゼントしますよ」ということを約束するのである。

 この計算資源を使って正解のナンスを探し出し報酬を得る作業をマイニングと呼び、それを行う人達のことをマイナーと呼ぶ。

 これは「作業による証明」という意味でProof of Work、通称PoWと呼ばれる仕組みである。また、この作業でしか仮想通貨を発行しないようにすれば、仮想通貨の総量が無意味に増えたりすることはなくなる。マイナーは、本当の意味で、通貨を掘り出して流通させる役割を担っているのだ。

5. 「P2P」〜さいきょうのうんよう〜

 もういい加減に最強なのではないだろうか?いやしかし、実はまだ問題が残っている。ここまでの方法ではノートをまるごと消してしまうような攻撃に対して無力である。そう、最後はノートの保管方法が問題となるのだ。

5.1 2つの方針

 「ノートを安全に保管する方法」と聞いて最初に思いつくのは、パスワードがなければアクセスできないようなファイルサーバに保存しておくことである。

 しかし、しかしだ仮想通貨の大前提

誰も信用できないコミュニティで
信頼されることを目指した通貨 

こいつが問題となる。誰も信用できないのだ。安心してデータを保存できるファイルサーバなど存在しないのである。

 そこで現れるもう1つの方針が「みんなで同じノートを持つ」である。みんなが常に同じノートをコピーして持っておけば、それら全てを同時に消してしまうことは困難になる。

 ここで重要になってくるのがPeer to Peer、通称P2Pと呼ばれるアーキテクチャである。

5.2 長いものが正義

 P2Pというのは、言うなれば参加者のPCネットワーク全体が、ファイルサーバとして機能するような仕組みであり、どこか一箇所にデータを置くのではなく、みんなで同じデータを持つようにするものである。参加者全員のPCにP2P用の領域を作っておき、常に全員分のデータを同期しておくというわけだ。したがって、どのPCからでも同じデータにアクセスできるのである。これは通常のファイルサーバと比較したとき、ユーザーが増えてもアクセスが集中して回線が遅くなるような事態が発生せず、また参加しているいくつかのPCが壊れても、同じデータを持っている人は他にもいるので、障害に非常に強いというメリットがある。日本ではWinny事件の影響でP2Pに悪い印象を持つ人も多いが、上手に使えば素晴らしい仕組みなのだ。

 そして、これは仮想通貨のノートを保管する方法としては大変優れている。

 このP2Pを利用したブロック追加の流れは次のとおりである。

  1. 取引を行いたい人は、署名した取引内容をP2Pに流す。
  2. 報酬が欲しい人は、P2Pに流れている署名済みの取引内容を集めブロックを作り、正解のナンスを探し、ブロックを追加する。
  3. 正解のナンスを探している人が同時に複数人いた場合には、最も早くナンスを探しだした人のブロックが追加され、その人だけが報酬を受け取る。

ここまでの話で、勘の良い読者は気づいたかもしれないが、取引内容に署名をしただけでは、取引内容としてはまだ未確定の状態であり、誰かがそれを含めたブロックを追加するまでは承認されない。

「ナンスを探しだした人が同時に複数人現れた場合にはどうするのか?」

やはり、勘が良い。

 そう、実際そういった事態も起こりえるのである。その場合には、なんとブロックチェーンは分岐するのである。さらに厄介なことに、新たに作成するブロックに含める取引は、マイナーが好きに選んで良いので、全く異なる取引を含む分岐が生じる可能性が高いのである。

また、同時にナンスが見つかる場合以外にも、分岐が生じることがある。例えば、通信にはどうしてもタイムラグが生じるため、アメリカと日本ではブロックチェーンに違いが生まれたりすることがあるのだ。そのような場合でも当然ブロックチェーンは分岐する。そういったわけで、実はブロックチェーンにはいろんなバージョンが存在してしまうのである。そんなとき、どのブロックチェーンを信じたら良いかと言う問題が発生する。

 先にこの問題に対する解決策を言ってしまうと、一番長いチェーンを信用することにすれば良い。つまりブロックチェーンが分岐したらしばらくそれを放置し、ある程度泳がしたところで、より伸びた方の分岐を採用して、他の分岐については消してしまうようにする。こうして常に長い1本が残るようにするのである。これは単に、複数あるブロックチェーンのせいで混乱が生じることを防ぐという目的以外にも、不正な取引を自動的に削除するという効果もある。

「おいおい、ハンコのおかげで不正な取引はできないんじゃないのかよ?(笑)」

そう思うのも無理はないが、実はこれは重要な点を見落としている。私は「ハンコのおかげで不正な取引を検証できるようになる」とは言ったが、「不正な取引が書き込めない」とは言ってないのである。つまり、取引内容を改ざんしてそれをP2Pに流してやることも可能ではある。もちろん、参加者はその取引内容が改ざんされているかどうかを確認することができるので、マイナーもわざわざ改ざんを含んでいるような取引内容はブロックに取り込まないだろう。しかし、その改ざんを行った人間がブロックを追加することだってできるのである。したがって、改ざんされた取引が含まれるブロックが追加されることはありえるのである。

「でもその改ざんされた取引は検出できるので、
追加したところで意味ないのでは?」

確かにそうなのだが、えーと、誰が検出してくれるのだろうか?

 繰り返しになるが、今は誰も信用できないコミュニティにいるのだ。他の人が「検証してみたけど、このチェーンは不正がないから安全だよ!」といったところで信じられない。もちろんあなた自身が自分で検証を行うということも出来るが、他の人だってあなたのことを信用できないのだ。このような状況で誰もが「あ、このチェーンは信用できるな」と思える方法を探さなければならない。

 実は先程の「しばらく泳がせてから長く伸びた方を採用する」がその方法なのである。マイナーはブロックを追加する際にブロックに含める取引内容を選ぶだけではなく、どのチェーンに追加するかも選ぶ必要がある。そのとき、全てのブロックを検証することができるし、これは一瞬で完了する。時間がかかるのはあくまで正解のナンスを探す過程であり、既にナンスが与えれらているブロックを全て検証するのは造作もないことなのだ。そうすると、多くの参加者は改ざんの含まれるチェーンを信用しないため、そんなブロックにわざわざ膨大な計算資源を投じてブロックを追加しようとは思わない。そうなると、改ざんを含むブロックは全然伸びなくなるのである。この仕組みによって、この改ざんを含む分岐は勝手に消滅してくれるのだ。改ざんを含むブロックを伸ばし続ける唯一の方法は、改ざんした本人が、そのチェーンにブロックを追加し続けることである。しかし、ご自慢の計算資源を携えたマイナー達が犇めき合う戦場で、彼らに勝ち続けてブロックを追加していくのは現実的に考えて非常に難しいし、わざわざそんなことをしようとする人はいないと考えられる。というのも、これを可能にするためは、参加者の半分以上に相当する計算資源を保有する必要があり、もしそんな資源を持っているのであれば、大人しくマイニングで稼いだほうがお得だからだ。だいたい、そんな力技で改ざんを含むチェーンを伸ばしても、みんながその仮想通貨を信用しなくなるだけであり、自分の持っている通貨の価値を落とすようなことはわざわざしないだろうということである。参加者の過半数分に相当する計算資源を使って、改ざんを含むチェーンを伸ばす攻撃を「51%攻撃」という。

5.3 現実世界との接点

 ここまでの話は、全て仮想通貨内で完結していたものであり、現在国が発行しているような円やドルといった通貨との接点については何も述べてこなかった。というか本来接点などないのである。もしあなたが仮想通貨が欲しければ実際にマイニングなどを行うことで仮想通貨を集めるのが正当なやり方である。しかし実際には、マイニングを行えるような立派な計算機を持っていない人がほとんどだ。そんな人が仮想通貨を手に入れるためには、既に仮想通貨を持っている人から送金してもらうしかない。あなたは仮想通貨を持っている人と交渉し、国が発行する円やドル、もしくは物と引き換えに仮想通貨を送付してもらうのである。これは完全にこの仮想通貨の仕組みの外側の話であることに注意したい。そういったやり取りを行ってくれるのが、コインチェックbitFlyerなどの取引所である。

5.4 成功した攻撃

 ところで、この「さいきょうのつうか」は本当に最強なのだろうか?一見すると、もはやこれを改ざんしたり勝手に削除したりする術は残されていないような気がする。しかし実は、仮想通貨が攻撃を受けて不正にお金を引き出されてしまった例が存在するのである。ここでは、その実例を紹介することにする。

 実際に攻撃を受けてしまったのは「モナコイン」と呼ばれる日本の2ちゃんねるで生まれた仮想通貨である。

 犯人の手口はこうだ。まず、取引所を利用して自分の保有しているモナコインを日本円として出金する。このときの仮想通貨の流れは、

"犯人が口座に????MONA送金した"

である。取引所は、ブロックチェーンの新たなブロックにこの取引内容が加えられていることを確認した後、登録されている口座に日本円で相応の金額を送金するわけである。犯人は自身の口座に日本円が振り込まれたのを確認した後、予め分岐させておいたチェーンを高速で伸ばしていったのである。この「予め分岐させておいたチェーン」というのは、先程の"犯人が口座に????MONA送金した"という取引内容を含まないものである。このチェーンが他のどの分岐よりも長くなってしばらく経つと、他の分岐は全て消えてしまい、犯人が高速で伸ばしたチェーンが正しいチェーンとして君臨するのである(5.2参照)。この犯人が伸ばしたチェーンには口座に送金した事実が含まれていないため、犯人はモナコインを失うことなく日本円をゲットできてしまうのである。ポイントは、犯人は一切改ざん等は行っていないという点である。では問題はどこにあるのかというと、取引所が、まだ消えてしまう可能性のあった1つの分岐を早々に信じてしまい、日本円での出金を行ってしまった点にある。ブロックがどの程度伸びたら信じてもよいか(消える心配がないか)という目安は仮想通貨ごとに異なり、また実際にどのタイミングで日本円やドルとの交換を確定させるかというのは、取引所ごとで独自に決めている。もし素早い取引を売りにする取引所を作りたかったら、まだブロックがそんなに伸びていない状態でも取引を確定させてしまうという方法もあるわけだが、このようなリスクも当然生じるのである。実際、犯人が目をつけた取引所は比較的短い長さで取引を確定していたのである。

 先に述べたように、取引所における日本円などとの交換というのは、完全に仮想通貨の仕組みの外の話であり、今回の例は仮想通貨自体の信用を落とすものではない。しかし、まだ仮想通貨が既存の通貨の代わりとなりきれていない以上、取引所の使用は不可避であり、我々はその最強の外側の存在に常に注意を払わなければならないのだ。

6. 「まとめ」〜さいきょうのつうか〜

 如何だっただろうか。ノートの落書きから始まった「さいきょうのつうか」であったが、実に立派なものになった。

 ここで紹介した仮想通貨はPoWを使ったものだったが、このPoWは、取引にかかる時間が長いことや、電力消費による環境への悪影響が指摘されている。ここまで読んだ読者ならそれが何故起こるのかを理解できるだろう。そこで、これに代わる方法としてPoS(Proof of Stake)やPoB(Proof of Believability)などの承認システムが提案されている。

 本当の意味で「さいきょうのつうか」を目指す戦いは、まだまだ始まったばかりなのだ。

 それでは、この「さいきょうのつうか」に対して想定される攻撃と、それが何故防げるのかを箇条書きにして、本ブログのまとめとしよう。

  • [考えられる攻撃]
    何故それを防げるのか
  • 取引内容の改ざん
    デジタル署名によって誰でも検証可能であり、改ざんを含む取引内容はマイナーに無視されるか、仮にチェーンに追加されても伸びないため自然に消える。
  • 取引内容の削除
    次のブロックのハッシュ値と食い違いが生じるため検出可能。そのようなチェーンは伸びなくなるため自然に消える。
  • 取引内容を削除し、後ろに続くブロックのハッシュ値も全て書き換える
    後ろに続く全てのブロックについてナンスを探し直さなければならないため、実行するためには全体の51%以上の計算資源を保有する必要がある。そんなことをするよりマイニングした方が確実だし、やったところで通貨の価値が下がってしまい旨味がないので誰もやらない。
  • ブロックチェーンをまるごと消してしまう
    P2Pに流しているため実質不可能。参加者全員のPCをハッキングするか物理的に破壊する必要がある。