無限アラートは不正プログラムとして逮捕されるらしいので警察にゴールドバッハ予想を証明してもらおう

## これは何？

これは以下のツイートに触発されて作った`n回目のアラートダイアログで2n+2を二つの素数の和で表せるかを全探索して表せた場合もう一度アラートダイアログを表示する`JavaScriptプログラムです
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">n回目のアラートダイアログで2n+2を二つの素数の和で表せるかを全探索して表せた場合もう一度アラートダイアログを表示するみたいなプログラムを書けば警察がゴールドバッハ解いてくれるのでは</p>&mdash; ほんまか？ (@Kory__3) <a href="https://twitter.com/Kory__3/status/1102604957918920706?ref_src=twsrc%5Etfw">March 4, 2019</a></blockquote>

### つまりどういうこと？

#### 経緯

エンジニアの方ならわかると思いますが、今日（３月５日）の朝から、Twitterなどで、**不正プログラムを書き込んだ疑いで女子中学生が補導され、男性２人が書類送検されるという方針だ**というニュースがトレンド入りし、話題になりました。（確認したら今もトレンド入りしてるようです。ある程度パーソナライズされてるらしいので全員がそう見えるかは定かではありませんが）
ソース：[不正プログラム書き込み疑い補導｜NHK 兵庫県のニュース(アーカイブ)](https://web.archive.org/web/20190304142945/https://www3.nhk.or.jp/lnews/kobe/20190304/2020003239.html)

動画や文脈から推測すると、これは再帰的に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は全部素数なのがわかると思います。これを実装して警察がこんにちはしてきたら、それはつまり警察がゴールドバッハの予想を無限だと認めたということなので、**日本の警察が認めているのだからゴールドバッハの予想は真だ**ということができます(できません)

それから今回は警察にゴールドバッハ予想を証明してもらいますが、**無限か有限化の形に落とし込めればどんな未解決問題でも警察に証明させることができる**ので、他にもいろいろ実装して数学会に貢献しましょう！

<details><summary>実装や使い方など(クリックで開く)</summary><div>

## ソース

### index.js

```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

```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

```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をできるだけ圧縮したもの
- （１ツイートに収めようとして頑張ったけど挫折した残骸）
- （まぁブックマークレットとして使うなら短いほうがいいよね？ね？）

### minified.js

- dev.jsから**10回の制限を無くし**
- console.logをalertに置き換え
- さらにminifyしたもの

### 更に短いもの

- [@Yuki_jukjis](https://twitter.com/Yuki_jukjis)さんがさらに圧縮してくれました
- このスレッドにdev.js相当のものや、minified.js相当のものがあるので短いほうがいい方はぜひ使ってみてください

<blockquote class="twitter-tweet"><p lang="en" dir="ltr"><a href="https://twitter.com/yuta0381?ref_src=twsrc%5Etfw">@yuta0381</a><br>(()=&gt;{<br> for(n=r=4,p=[]; r&amp;&amp;n&lt;100; n+=2){<br> for(a=2;a&lt;n;f&amp;&amp;p.push(a),a++)<br> for(f=b=2;b&lt;a;a%b++||(f=0));<br> for(r=c=0;c&lt;p.length;~(b=p.indexOf(n-(a=p[c++])))&amp;&amp;(r=a+&quot; + &quot;+p[b]));<br> r&amp;&amp;console.log(n+&quot; = &quot;+r);<br> }<br>})()</p>&mdash; Yuki /jukʲi/ (@Yuki_jukjis) <a href="https://twitter.com/Yuki_jukjis/status/1102833643368591360?ref_src=twsrc%5Etfw">March 5, 2019</a></blockquote>

## 使い方

### index.js

- index.jsを読み込めば`main(1)`で実行できます
- （for文ではなく再帰で実行してるので引数の1は重要です）
- 開発しやすいようにconsole.log出力、10回のループ制限があります
- カスタマイズもしやすいと思うのでいろいろ活用できると思います()

### dev.js

- ~~こんな無理やり圧縮したクソコード忘れて..~~

### minified.js

- ブラウザで実行するのに特化したバージョンです。
- やっぱり短いほうがいいですよね？
- ブックマークレットなどにいかがでしょうか？
- 他の２つと違って**ループ回数制限もない**のでちゃんとゴールドバッハの予想が検証できるね！

</div></details>

## あとがき

これらは全部、**自己責任で使ってくださいね！** これを作るきっかけにもなった、**再帰alertスクリプトのアドレスを掲示板に書き込んだ女子中学生や男性が補導、書類送検される方針だ**ということを忘れないでね！！

※この投稿は当初~~警察に目をつけられるのが怖くて~~**Qiitaのガイドラインに反するような気がして**Gistの方に投稿しましたが、意外と評価が良く考え直してみたらQiitaに時事ネタが上がることもよくあり、この逮捕の問題点をより多くの人に認識してもらうことも重要だと思ったので、Gistを加筆編集して投稿しています。
オリジナルバージョンを確認したい、より古いリビジョンを確認したい人はこちらからどうぞ。
[JavaScript Alert Recursion with Goldbach&#39;s conjecture](https://gist.github.com/yuta0801/50fa1624ee2751d3f438bb7cb4d7a34c)
※Gistのほうはこの記事のリンクを追加したらこっちをメインに更新していきます

今回の無限アラートがブラクラ、有害なものだとして不安を煽り自社のセキュリティソフトを宣伝する悪質な会社があり、その会社のやり方が許せないので、無限アラートがどうブラクラではないかを技術的な面から解説した記事を投稿しました。
[無限アラートはブラクラではない - Qiita](https://qiita.com/yuta0801/items/4c890f66458d7f1b029f)
なぜブラクラではないかを理解し、おかしなことを言っていたら訂正を求めることで、世論をミスリードさせ新たな被害者を出さないようにしましょう！