これは何?
これは以下のツイートに触発されて作ったn回目のアラートダイアログで2n+2を二つの素数の和で表せるかを全探索して表せた場合もう一度アラートダイアログを表示する
JavaScriptプログラムです
n回目のアラートダイアログで2n+2を二つの素数の和で表せるかを全探索して表せた場合もう一度アラートダイアログを表示するみたいなプログラムを書けば警察がゴールドバッハ解いてくれるのでは
— ほんまか? (@Kory__3) March 4, 2019
つまりどういうこと?
経緯
エンジニアの方ならわかると思いますが、今日(3月5日)の朝から、Twitterなどで、不正プログラムを書き込んだ疑いで女子中学生が補導され、男性2人が書類送検されるという方針だというニュースがトレンド入りし、話題になりました。(確認したら今もトレンド入りしてるようです。ある程度パーソナライズされてるらしいので全員がそう見えるかは定かではありませんが)
ソース:不正プログラム書き込み疑い補導|NHK 兵庫県のニュース(アーカイブ)
動画や文脈から推測すると、これは再帰的にalertを実行する処理で、簡単に再現するとwhile(true) alert('無限ループだよ!')
のような感じになります。
仮に今回警察が__無限ループだから不正プログラムだと判断した__と仮定すると、警察が無限なのか有限なのか検証してくれると解釈ができ、未だに証明されてないゴールドバッハの予想(後述)を元にalertを表示したら警察がゴールドバッハの予想を証明してくれるのではないかというのが上のツイートの趣旨です
ゴールドバッハの予想とは
ゴールドバッハの予想とは全ての 2 よりも大きな偶数は2つの素数の和として表すことができる。
という予想です。(ウィキペディアより)
つまり2より大きな偶数、4, 6, 8, 10...は2つの素数の和として表せるというまだ証明されていない予想です。
理解しやすいように何個か例を載せておきます。
4 = 2 + 2
6 = 3 + 3
8 = 3 + 5
10 = 7 + 3 = 5 + 5
12 = 5 + 7
出てくる2, 3, 5, 7は全部素数なのがわかると思います。これを実装して警察がこんにちはしてきたら、それはつまり警察がゴールドバッハの予想を無限だと認めたということなので、日本の警察が認めているのだからゴールドバッハの予想は真だということができます(できません)
それから今回は警察にゴールドバッハ予想を証明してもらいますが、無限か有限化の形に落とし込めればどんな未解決問題でも警察に証明させることができるので、他にもいろいろ実装して数学会に貢献しましょう!
実装や使い方など(クリックで開く)
ソース
index.js
function getPrimes(n) {
var sieve = [], i, j, primes = []
for (i = 2; i <= n; ++i) {
if (!sieve[i]) {
primes.push(i)
for (j = i << 1; j <= n; j += i) sieve[j] = true
}
}
return primes
}
function goldbach(initial) {
var list = getPrimes(initial)
while (list.length > 0) {
var item = list.shift()
if (item * 2 === initial) return item + " + " + item
var index = list.indexOf(initial - item)
if (index !== -1) {
var itemPair = list.splice(index, 1)[0]
return item + " + " + itemPair
}
}
}
function main(n = 1) {
var initial = 2 * n + 2
var result = goldbach(initial)
if (result && initial < 100) {
console.log(initial + ' = ' + result)
main(n + 1)
}
}
main(1)
div.js
(function main(n) {
var result = (function () {
var arr=[2];for(i=3;i<n;i+=2){for(no=1,j=2;j<i;j++)i%j==0&&(no=0);no&&arr.push(i)}
while (arr.length > 0) {
var item = arr.shift()
if (item * 2 == n) return item + " + " + item
var index = arr.indexOf(n - item)
if (~index) {
var itemPair = arr.splice(index, 1)[0]
return item + " + " + itemPair
}
}
})()
if (result && n < 100) {
console.log(n + " = " + result)
main(n + 2)
}
})(4)
minified.js
!function r(n){var f=function(){var r=[2];for(i=3;i<n;i+=2){for(no=1,j=2;j<i;j++)i%j==0&&(no=0);no&&r.push(i)}for(;r.length>0;){var f=r.shift();if(2*f==n)return f+" + "+f;var o=r.indexOf(n-f);if(~o)return f+" + "+r.splice(o,1)[0]}}();f&&(alert(n+" = "+f),r(n+2))}(4);
それぞれのファイルの説明
index.js
- 最初にコピペしながら雑に作ったもの
dev.js
- index.jsをできるだけ圧縮したもの
- (1ツイートに収めようとして頑張ったけど挫折した残骸)
- (まぁブックマークレットとして使うなら短いほうがいいよね?ね?)
minified.js
- dev.jsから10回の制限を無くし
- console.logをalertに置き換え
- さらにminifyしたもの
更に短いもの
- @Yuki_jukjisさんがさらに圧縮してくれました
- このスレッドにdev.js相当のものや、minified.js相当のものがあるので短いほうがいい方はぜひ使ってみてください
@yuta0381
— Yuki /jukʲi/ (@Yuki_jukjis) March 5, 2019
(()=>{
for(n=r=4,p=[]; r&&n<100; n+=2){
for(a=2;a<n;f&&p.push(a),a++)
for(f=b=2;b<a;a%b++||(f=0));
for(r=c=0;c<p.length;~(b=p.indexOf(n-(a=p[c++])))&&(r=a+" + "+p[b]));
r&&console.log(n+" = "+r);
}
})()
使い方
index.js
- index.jsを読み込めば
main(1)
で実行できます - (for文ではなく再帰で実行してるので引数の1は重要です)
- 開発しやすいようにconsole.log出力、10回のループ制限があります
- カスタマイズもしやすいと思うのでいろいろ活用できると思います()
dev.js
こんな無理やり圧縮したクソコード忘れて..
minified.js
- ブラウザで実行するのに特化したバージョンです。
- やっぱり短いほうがいいですよね?
- ブックマークレットなどにいかがでしょうか?
- 他の2つと違ってループ回数制限もないのでちゃんとゴールドバッハの予想が検証できるね!
あとがき
これらは全部、自己責任で使ってくださいね! これを作るきっかけにもなった、再帰alertスクリプトのアドレスを掲示板に書き込んだ女子中学生や男性が補導、書類送検される方針だということを忘れないでね!!
※この投稿は当初警察に目をつけられるのが怖くてQiitaのガイドラインに反するような気がしてGistの方に投稿しましたが、意外と評価が良く考え直してみたらQiitaに時事ネタが上がることもよくあり、この逮捕の問題点をより多くの人に認識してもらうことも重要だと思ったので、Gistを加筆編集して投稿しています。
オリジナルバージョンを確認したい、より古いリビジョンを確認したい人はこちらからどうぞ。
JavaScript Alert Recursion with Goldbach's conjecture
※Gistのほうはこの記事のリンクを追加したらこっちをメインに更新していきます
今回の無限アラートがブラクラ、有害なものだとして不安を煽り自社のセキュリティソフトを宣伝する悪質な会社があり、その会社のやり方が許せないので、無限アラートがどうブラクラではないかを技術的な面から解説した記事を投稿しました。
無限アラートはブラクラではない - Qiita
なぜブラクラではないかを理解し、おかしなことを言っていたら訂正を求めることで、世論をミスリードさせ新たな被害者を出さないようにしましょう!