幕間 素因数分解について考えた 後 (BigIntやBig.jsの利用も少し)
さて、素因数分解(正確には因数分解)、いきなり躓きです。
例えば、7365373222715531 は『素数』らしいのですが、これを前述のプログラムで走らせると間違った分解結果が表示されます。
平方根の小数点以下切り上げと切り捨てが同じならば、平方数とやったのが原因で、どうも桁数の問題で大きな数の平方根(Math.sqrt)が小数点以下を保持しない模様。
べき乗でも同様。
ただBigIntの利用は成功しましたので、まずそちらを説明します。
前回、ちょっと書いたように"tsconfig.json"のコンパイルオプションの変更なのですが、これは複数のオプションを追加していくことで行うようで、以下のようなオプション設定で利用できました。
------------------------------------------
{
前略
"target": "es2020",
"module": "es2020",
"lib": ["es2018", "dom", "ES2020.BigInt"]
},
以下省略
}
------------------------------------------
※BigIntの利用については以下のリンクを参照してください。
BigInt
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/BigInt
まだまだ問題はあります。
今までは切り上げ切り捨てなどをjavascriptのMathオブジェクトを使っていたのですが(とても便利)、このMathオブジェクト、BigIntに対応していません。
まあ、小数点以下何万桁で違ってもどうしようもないので、素直に再計算して評価するほかなさそうです。
この処理をすると今度は0.5のべき乗で文句が!
0.5は整数じゃないからBigIntとして扱えない!!(そりゃそうだ)
調べていくと『完全な精度で ~9 兆より大きい値や小さい値を扱うには、任意精度演算ライブラリーを使用する必要があります。』との事。
Number.isSafeInteger()
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Number/isSafeInteger
それでも絶対に何かあるだろうとあれこれ探して見つけたのが"big.js"。
big.js
https://typescript-jp.gitbook.io/deep-dive/recap/number#big.js
インストールも簡単なようですので、早速、上記サイトに従い使ってみます。
インストールおよびimportは問題なく。
ただ使い方(演算など)が少し異なるようで、勉強してみます。
big.js
http://mikemcl.github.io/big.js/
そのメソッド
http://mikemcl.github.io/big.js/#prototype-methods
平方根や四則演算も含めて、大分勝手が違いますが、思いつくような演算はほぼ出来る模様。
計算も問題なく出来ているようです。(比較に.cmpを使う事に気づかないとハマるかも?)
ただし、かな~り遅い・・・
(100分の1秒単位が秒単位とか)
入力値によって任意精度演算ライブラリー(例えばここで使った"big.js")を使用するかどうか、処理を分ける必要がありそうですね。
とは言え、大変面白い経験でした。
大分満足したので、ゲームブック開発に戻ります。
投稿