最大公約數とjavascriptとブラックホール

最大公約數(gcd) を求める函數 gcd

'use strict';
const tgcd = (i1,i2,ci,dv,rs) => {
  if(i1>=i2){
    if(i1%ci==0){return ci;}else{
      if(i2%dv==0){
        if(i1%dv==0){return tgcd(i1,i2,parseInt(i2/dv),dv+1,dv)}
        else{return tgcd(i1,i2,parseInt(i2/dv),dv+1,rs)}}
      else{if(dv<i2/dv){return tgcd(i1,i2,ci,dv+1,rs)}else{return rs;}}}
  }else{return tgcd (i2,i1,i1,dv,rs);}
}
const gcd = (i1,i2) => {return tgcd(i1,i2,i2,2,1);}

分數の計算をするにあたつて 最大公約數を求める必要があると感じ
ネットを検索して調べたのだが 「再歸でやると 大きい數ではできない」
などと書かれてゐて 「ほんとかな?」と思ひ 實装してみた

手順:
  • i1とi2を比べ 大きい方をi1 小さい方をi2 とする
  • ciにi2をセット
  • i1をciで割り切れれば ciが最大公約數
    さもなくば i2を2(dvの値)で割つてみて 割り切れるなら その値をciとし
  • i1をciで割る
    同時にdvでもi1を割り 割り切れたらrs=dv(この場合は2)とする
    i1をciで割つたとき 割り切れれば ciが最大公約數となるが
    割りきれなければ こんどはi2を3(次のdv)で割つてみて 割りきれたら その値をciとし
  • i1をciで割る
    このやうに i2を2,3,4,5...で割り 割り切れた商でi2が割れれば その商を最大公約數 としてゐる
  • i2を2,3,4,5...で割つたときの商が 割る數(dv)よりも大きければ そこで計算を止め
    これら 割る數のうちで i1を割り切れてゐたもの(rs)を 最大公約數とする
結果:

8桁の整数同士までは エラーが出ずに計算できた
また 一方が10桁で他方が6桁などの場合もエラーは出なかつた
しかし 9桁の整数同士くらゐになると
RangeError: Maximum call stack size exceeded
のエラーとなる

これは javascriptを処理するプログラムが「末尾再歸呼び出しの最適化」の機能を持つてゐないことによる とされ
昔のNode(javascriptを實行するアプリのひとつ)では--harmonyといふオプションで對應できてゐたが 最近のバージョンでは
その機能が削除された といふ
webブラウザも當然 javascriptを實行するアプリだが ほとんど「末尾再歸呼び出し」には對應してゐないらしい

考察:

ネット上に この事に關する記事が少なく 自分はまだ全然分かつてゐない状態だ
これは 落ち込むと抜け出せなくなるタイプの話題にみえるので これ以上あまり深入りしないことにする
こんなふうに アリ地獄のごとく 人の精神を食いものにする話題が 巷にはあふれてゐる
ブラックホールもそのひとつ
ブラックホール見付かったんだって! すごいね!」
で 終はりにできる幸せな人が ちょっと羨しく思へる
これを考へ出したら最後 精神は深く大きな暗黒の世界へと 飲み込まれていく
例へば 私は 現在定義されたやうなブラックホールが存在しない と思つてゐるが
それは 私の達したある種の合理的結論であるとともに
私の精神を ブラックホールの手前で何とか保持する手段でもある
私が この存在を認めたが最後 それを証明するために
私は その基礎だけで百科事典ほどもある 複雑な數式で書かれた一般相對性理論の世界を彷徨ふことになるのだ

人から いくら無力だ 勉強不足だと思はれても 私は構はない
私には ある種の 信念 ある種の 直感がある
それは 大きく穴をあけて 知的好奇心を食おうとしてゐるやうな存在から 素早く 逃げることである!

シンプルな思考でも 何かを實らせることができる
單純に考へても 實現したかつたことが 達成できる
偉い人が強調するブラックホールを拒絶しても きっと生きていける
私はさう信じてゐる