わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

マイナンバーと円周率を照合してみる

任意の10進数の並び*1を入力にとり,別の10進数列と照合するRubyスクリプトを作成しました.ソースはgistよりご覧ください.
入力に完全に一致する並びが,照合対象となる数字列に含まれていれば,その出現位置を出力します.一致するものがない場合には,レーベンシュタイン距離が最も小さい,数字列の中の該当箇所とその距離を出力します.なお,レーベンシュタイン距離を求めるのは,以前に書いたものを流用しました.挿入・削除・置換のコストはいずれも1としています.
入力をマイナンバー,照合対象を円周率にすれば,マイナンバーが円周率のどこに出現するか,あるいは100万桁までの中で,最も似通ったものはどれかというのを,知ることができるというスクリプトです.もし,小さい桁に出現すれば,円周率の小数第何位(から12桁)という形で,マイナンバーを覚えておくことができます.もちろん悪用厳禁です.
照合対象となる数字列も,スクリプトから取得できるようにしています.特定のオプションをつけて実行すると,http://xn--w6q13e505b.jp/value/decimal.htmlにアクセスして小数第1000位までを取得します.なお「3.」は取り除いています*2.1000桁と100万桁をテキスト化し,http://d.hatena.ne.jp/takehikom/files/pi_1000%2B1000000.zip?d=downloadに置きました.この値が正しくなかったら,元も子もないので,http://www.geocities.jp/f9305710/PAI1000000.htmlと見比べ,同一なのを確認しました.
1000桁が入ったファイルを,pi.txtに置いておき,いくつか実行してみます.

$ ruby compare-pi.rb 1234
Nearest substring of "1234" is "1284" (distance = 1) at #148
$ ruby compare-pi.rb 123
Nearest substring of "123" is "323" (distance = 1) at #15
$ ruby compare-pi.rb 12
"12" occurs at #148, #220, #243, #297, #483, #499, #607, #660, #710, #712, #963

最初のコマンドの読み方は,次のとおりです.1000桁の中で,"1234"に最も近いのは"1284"で,レーベンシュタイン距離は1,そしてそれは小数第148位からの3桁となります.また最後のコマンドより,"12"は,小数第148位からの2桁を筆頭に,11箇所,出現しているのが分かります.
次に,pi.txtを100万桁のものに置き換えて,マイナンバーを入力したところ…具体的な結果を書くわけにもいきませんので,少々ぼかしますが,完全一致するものはなく,レーベンシュタイン距離の最小値は3〜5になりました.3の場合は,だいたいが置換のみでしたが,3より大きいときにはしばしば,挿入・削除*3も使われていました.上記の"123"と"323"のように,先頭が異なるのが最も近いというのも,見かけました.


(追記)マイナンバーと円周率との照合を試みる先行事例

*1:先頭に0があってもいい,という点で,整数と区別されます.具体的にいうと,「00123」「0123」「123」は,今回のプログラムではそれぞれ異なる入力となります.

*2:もし「3141 5926 5358」というマイナンバーの人がいたとしても,このスクリプトでは発見できないことを意味します…いや,桁数を増やせばあるかも.

*3:円周率の100万桁付近を例にとると,"105779458151"と"105774581519"とのレーベンシュタイン距離は,2となります.9の削除と9の挿入により,一方から他方を得られるからです.