コミュニティアイコン プチコン 非公式コミュニティ プレイ日記

アバター
あまさとしおん ◆mzDKTVUAtwqE
2020/7/16 14:19
2^53より大きな数値を正確に計算できる『BIG_CALCライブラリ』の開発を始めました。
1024^16も1の位までしっかり計算できます。
(上段:ライブラリによる計算、下段:プチコンによる計算)

この計算では処理時間が10秒ぐらい掛かりました。

コメント

アバター
あまさとしおん 2020/7/18 18:22 ◆mzDKTVUAtwqE
A=POW(2,20)
B=POW(2,8)
だったら16秒で終わりますね
指数をもう4倍するだけでとんでもない遅さになるのか…
アバター
あまさとしおん 2020/7/18 18:29 ◆mzDKTVUAtwqE
あまりにも桁が増えるので足し算1回当たりの処理時間がかなり大きくなるんでしょうね…
アバター
あまさとしおん 2020/7/18 18:33 ◆mzDKTVUAtwqE
A=POW(2,10)
B=POW(2,9)
は64秒でした
アバター
あまさとしおん 2020/7/18 19:57 ◆mzDKTVUAtwqE
あんまりにも遅かったので、加算処理を9桁単位に改良した関数を組み込んでみたところ
A=POW(2,10)
B=POW(2,10)
が45.54秒で計算できるようになりました!!
アバター
あまさとしおん 2020/7/18 20:08 ◆mzDKTVUAtwqE
調子に乗って537^1605をテストしてみてるけど終わる気配がないです

あまりにも数を大きくし過ぎたと反省して、代わりに309^1024をテストするもやっぱり終わる気配がない…
アバター
あまさとしおん 2020/7/18 20:57 ◆mzDKTVUAtwqE
369^1024→168秒(309だと延々に終わらないので3^2で割れる数に変更)
5415^41→4.36秒(※)

数の大小よりもショートカットが効くかどうかで処理時間が大きく変わりますね(369^1024よりも1024^1024の方が速い逆転現象)
※後者は2日前に108秒かかったやつの再テストです。とてつもなく高速化してますね。
アバター
あまさとしおん 2020/7/18 21:05 ◆mzDKTVUAtwqE
再テスト(括弧内は2日前の結果)
1903^20→6.33秒(26.97秒)
1727^28→9.68秒(44.55秒)
かなり速くなっていますね

(秒未満の端数は実行するたびにブレるので実はあまり意味がないという…)
アバター
あまさとしおん 2020/7/18 21:29 ◆mzDKTVUAtwqE
新しい加算処理でだいぶ速くなったので公開します。
sbkey=CKA8 XPQX
これを使えばA=POW(2,10):B=POW(2,10)でもカップラーメンを作っている間に解ける(はずです)
アバター
あまさとしおん 2020/7/18 21:31 ◆mzDKTVUAtwqE
old3dsはnew3dsの約3倍かかりますが、45.54*3=136.62なので3分以内に解けるはず。
アバター
あまさとしおん 2020/7/18 21:34 ◆mzDKTVUAtwqE
Q.加算処理が9桁単位なのはなぜ?
A.整数型で扱える数値の範囲が2^31-1までで、それに収まるのが十進で9桁だから。(※実数型で試したら遅くなった)
アバター
あまさとしおん 2020/7/18 21:39 ◆mzDKTVUAtwqE
あっ!
2^20と2^10を読み間違えてましたね
後で2^20の場合もテストしてみます。
アバター
あまさとしおん 2020/7/18 23:17 ◆mzDKTVUAtwqE
POW(2,20)のPOW(2,10)乗、250.632秒でした。速い…
アバター
あまさとしおん 2020/7/19 13:57 ◆mzDKTVUAtwqE
計算結果が正しいかどうか、JavaScriptの計算結果と比較しました。
全部trueでした。
アバター
こういち 2020/7/19 22:39 ◆.Id/aHiU36hu
しおんさんのやつ見てるとボクも作りたくなる。
Garnerの力を見せてやるとしますか。(Garerは計算時間自体は定数時間なのが強み。逆に弱みは除算の場合、線形時間かかる上に、結果が整数である必要がある。)
アバター
こういち 2020/7/20 11:46 ◆.Id/aHiU36hu
知ってしまった。
ボクの作ろうとしているやつ。
掛ける数の桁数が百進法で二桁固定なので、カラツバ法を使うまでもなく愚直筆算でやった法が速い。
アバター
あまさとしおん 2020/7/20 21:09 ◆mzDKTVUAtwqE
若干の修正を加えたら事実上のお題であるPOW(2,20)のPOW(2,10)乗が239秒で解けるようになった。

修正箇所を具体的に言うと
・桁揃えをRIGHT$()で切り抜く方法から、足りない分だけ0を連結する方法に変更
・加算処理の桁数を変数から定数に置き換え
アバター
こういち 2020/7/21 9:31 ◆.Id/aHiU36hu
POW(2,20)のPOW(2,10)乗はさすがに計算できそうにないな。大きさが10^5オーダーの素数が少なくとも十万個ほど必要になる。(もちろんそんなに存在しない)
アバター
こういち 2020/7/21 9:46 ◆.Id/aHiU36hu
いや。違うな。
(2^20)^1024=2^20480≒10^7000=10^(4*1750)
つまり1750個程度あれば良い。
(オーバーフローの危険性があるため、素数は46337以下である必要がある。)
アバター
あまさとしおん 2020/7/21 16:55 ◆mzDKTVUAtwqE
真の意味で任意の長さの数値を計算するのは難しいよなぁ
BIG_CALCも大きすぎると時間が掛かり過ぎて使い物にならないし
アバター
あまさとしおん 2020/7/21 21:00 ◆mzDKTVUAtwqE
POW(2,20)のPOW(2,10)乗が239秒で解けるバージョンを公開します。
sbkey=7K48 3X9X

コメントを書く

  • こちらは「プチコン3号」「プチコンBIG」など、プチコンシリーズに関する話題を扱ったコミュニティです
  • プチコンシリーズにまったく関係ない書き込みはご遠慮下さい。削除の対象となります
  • こちらにはその他のゲームや雑談のコミュニティはなく、作る予定もありません (ひとりで管理できないため)。ごめんなさい
  • ユーザー登録なしで書き込みができます
  • 秘密の合い言葉は成りすましの防止 (トリップ機能)、書き込みの編集時の本人認証に使用します
  • 秘密の合い言葉に他人に推測されやすい言葉、他サービスと同じパスワードは入力しないでください。
  • 書き込むと、投稿時に入力したお名前と秘密の暗号が記憶され、ログイン状態になります

- WEB PATIO -