4 3 ≈ ↑ = [ ⏟ 10 ) {\displaystyle {10}^{{10}^{3.6\times {10}^{12}}}} 12 2 10 2 ] 10 2.89997 6 [ 100 System. [ 3 → 10 P. Mihăilescu, "Primary Cyclotomic Units and a Proof of Catalan's Conjecture. 3 2 ↑ ] 10 3 4 10 を根拠としている。, ラブロフらは2014年に、多次元三目並べに関するヘイルズ=ジュエットの定理(英語版)を応用し、より小さい上限として, を示した。これでもなお十進表記が事実上不可能なほど非常に大きい数であるが、グラハム数および小グラハム数と比較すると格段に小さい数である。これによりグラハム問題の解 n は, Guiness Book of World Record, 1980 Section D9 in Richard K. Guy, Unsolved Problems in Number Theory, 3rd edition, Springer-Verlag, 2004. 3 [ 4 10 [ 1.1 2 12 10 5 2 [ ( [ {\displaystyle {10}^{{10}^{100}}} [ 1.03112 [ ] 3 2 {\displaystyle {10}^{{10}^{{10}^{{10}^{{10}^{1.1}}}}}\approx {10}^{{10}^{{10}^{3883775501690}}}\approx {10}^{{10}^{{10}^{{10}^{{3}^{2.3}}}}}\approx {10}^{{10}^{{3}^{{3}^{{3}^{3}}}}}\approx 3\uparrow ^{2}6\in \left[\left(3\uparrow \right)^{5}2.89997,\left(3\uparrow \right)^{6}1.03112\right]} ≈ [8]であり、これもリトル・グラハム数はおろかF(4) ともとても比較にならない。, なお、強いて「リトルグラハム数を十進法で表した時の桁数」を考えるなら、log10Fとなるが、Fは十分な巨大数なので、この場合にあってはlog10という関数で厳密には元の数より小さくなるものの、巨大数としては無視できるレベルでしかなく、近似に吸収されてしまう。すなわち、log10F≒Fである。, チェーン表記を用いても F = F7(12) を簡潔に表すことはできないが、次の不等式が成立する。, 先述の通り、リトル・グラハム数自体は桁数を指数で表現することすら不可能なほど大きく、スーパーコンピュータでもF(4)の計算すら望めないが、末尾の数字を計算する方法は確立しており、ある程度の桁数は判明している。, これはどちらも ] 10 3 = ∈ [ 2 4 ↑ 2 {\displaystyle 2\rightarrow 3\rightarrow 12=2\rightarrow 4\rightarrow 11} 4 を法として 2 と合同でない数は 2 つの累乗数の差として表される。実際、(n + 1) 2 − n 2 = 2n + 1, (n + 2) 2 − n 2 = 4n + 4 が成立する。また、2 = 3 3 − 5 2, 10 = 13 3 − 3 7 など、4 を法として 2 と合同な数(単偶数)に関しても累乗数の差として表せる場合があることが知られている。6, 14, 34 などがそのように表せるかどうかは知られていない。. [ ] 2 ] , 3 [ ". 3.6 {\displaystyle {10}^{{10}^{{10}^{{10}^{{10}^{1.1}}}}}\approx {10}^{{10}^{{10}^{3883775501690}}}\approx 3\uparrow ^{2}6\in \left[\left(3\uparrow \right)^{5}2.89997,\left(3\uparrow \right)^{6}1.03112\right]\in \left(2\uparrow ^{2}7,2\uparrow ^{2}8\right)} 3 が既におよそ 3 ] 4 ] {\displaystyle \underbrace {} _{y}} 1.1 は、x が y 個あることを表す)。ただし、演算は右から行う。つまり例えば、x↑x↑x = x↑(x↑x) である。例を挙げると次のようになる。, をグラハム数といい、その計算法は3の冪乗やテトレーションからの発展を基本としている。, G(2) までは関数電卓やパソコンでも普通に計算できるが、G(3) [7]ですら既に3の累乗を7兆6,255億回以上繰り返した数であるため、現実世界の現象で例えることなど到底不可能な巨大数になっており、後述するように十進法以下の表記で表すことすら現実的には不可能であるが、16$Pickoverの方が遥かに大きい(しかし3↑↑↑4よりは遥かに小さい)。G(4) はその十進以下の表記が現実的に不可能な G(3) − 1 の数だけ ↑↑(二重矢印)を繰り返した数であるため、想像を絶する大きさとなっている。, 次の段階の G2(4) は3と3の間に G(4) 本矢印を置いたものであり、この時点で指数のみの表記も括弧を駆使しても事実上不可能となり、モーザー数 ( , 私はJavaで2の累乗を計算するプログラムを作ったが、非常に非効率的だと思われる。 より小さな力(2 ^ 4000、例えば)の場合、それは1秒未満で行います。 しかし、私は2 ^ 43112609を計算することに目を向けています。これは、知られている最大の素数より1大きいものです。 1,200万桁を超えると、実行には非常に時間がかかります。 ここまで私のコードです:, これは学校のプロジェクトなどではありません。 ちょうどそれの楽しみのために。 どのようにこれをより効率的にするためにどのような助けに感謝します! ありがとう!, @John SMithが示唆するように、試してみることができます。 2 ^ 4000, 編集:バイナリを10進数にすることは、O(n ^ 2)の問題です。 2倍にすると、各操作の長さが2倍になり、生成される桁数は2倍になります。, 注:取られた時間は、toString()でentrielyです.1000万回でも1ms未満かかるshiftLeftではありません。, バイナリで2 ^ nを表すビットベクトルを埋めるのは簡単ですが、その数を10進表記に変換するにはしばらく時間がかかります。 たとえば、java.math.BigInteger.toStringの実装では、O(n ^ 2)回の操作が必要です。 それはおそらく理由でしょう, あなたのアルゴリズムの漸近分析から始めましょう。 外側のループはn回実行されます。 各反復で、別のO(n ^ 2)操作を実行します。 つまり、アルゴリズムはO(n ^ 3)なので、スケーラビリティが悪いことが予想されます。, 2 ^ 2 ^ 2 ^ 2 ^ 2 ^ 2 ^ 2 ^ 2 ^ 2 ^ 2 ^ 2 ^ 2 ^ 2 ^ 2 ^ 2 ^ 2 ^ 2 ^, x = x * x * x * x * x * x * x * x * x * x * x * x * x * x * x * x * x * x * x * x * x * x * x * x * x * x * x * x * x * x * x * x * x * x * x * x * x * x * x * x * x *, 乗算を高速化するために、 Karatsubaアルゴリズムを使用して、ランタイム全体をO(n ^((log 3)/(log 2))log nに減らすことができます。, バイナリ形式で表示するのは、ディスクに書き込むことができるくらい簡単で簡単です。 100000 ...... ...... D, 前述したように、2の累乗は2進数に対応します。 バイナリは基数2であるため、各桁は前の値の2倍です。, バイナリはベース2です(ベース2と呼ばれ、2は指数のベースです)。したがって、各桁は前の値の2倍です。 シフト演算子(ほとんどの言語では '<<')は、各2進数を左にシフトするために使用され、各シフトは2倍に相当します。, このようなシンプルなバイナリ操作であるため、ほとんどのプロセッサは、レジスタに収まる数(プロセッサに応じて8〜64ビット)でこれを非常に迅速に実行できます。 より大きい数値で行うには、いくつかの抽象化(Bignumなど)が必要ですが、依然として非常に高速な操作でなければなりません。 それにもかかわらず、43112609ビットにするのはちょっとした作業になります。, あなたにちょっとした文脈を与えるために、2 << 4311260(最後の桁がない)は1297181桁です。 コンピュータがディスクにスワップしない場合は、出力速度を処理するのに十分なRAMがあることを確認してください。これにより、実行速度が低下します。, プログラムはとてもシンプルなので、Cなどのアセンブリに直接コンパイルする言語に切り替えることも検討してください。, 実際には、値を生成するのは簡単です(私たちはすでに答えを知っています、1つは43112609のゼロを続けます)。 それを10進数に変換するのにかなり時間がかかります。, 注意すべきもう一つの重要な点は、Javaで長時間の乗算を行うよりCPUがintとlongを掛けたほうがずっと速いことです。 その数字を長い(64バイト)チャンクに分割し、個々の数字の代わりにチャンクを乗算してキャリーします。 前回の答え(2の逐次乗算の代わりに2乗法を使用)を組み合わせると、おそらく100倍以上のスピードアップにつながるでしょう。, チャンクと二乗の方法を書こうとしましたが、BigIntegerよりわずかに遅くなりました(2 ^ 524288を計算するのに13.5秒vs 11.5秒)。 いくつかのタイミングと実験をした後、最も速い方法はBigIntegerクラスで二乗されたようです。, この成長率では、2 ^ 43112609の最終結果を得るためにすべての力をまとめて保存する時間はもちろん、2 ^ 33554432を計算するのに約77時間かかります。.