2011-01-13 1 views
7

プログラムの実行時間(実際には人間の人にとって無限大です)と限られた量のメモリ(2^64バイト)を使用することを心配していないと仮定して、基数10、10 ^(googolplex)の正確な値。一度に1桁ずつ画面上に表示されます(ほとんどゼロ)。1の後にgoogolplexの0の数が続きます

アルゴリズム(現在のコンピュータにコード化できる)を記述するか、またはこれを行うプログラムを記述します。 実際に出力を確認することはできないため、プログラムの正しさについての意見集に頼ります。

注:私は解決法、または解決策が存在するかどうかを知りません。問題は私自身の発明です。このofftopicを素早くマークする読者に...親切に再考してください。これは難しく、少し理論的ですが、間違いなくCSです。ここで

+4

「ほとんどゼロ」は、今年の控えめな表現です。 :-) – templatetypedef

+3

クローズ・質問の担当者の制限は10kほどでした。 – Kos

+0

問題は、拡張された形式のメモリ/ストレージにその番号を保持できないコンピュータ上で1からGoogolplexまで数えられることです。 – Rajan

答えて

8

これは不可能です。プログラムには、宇宙の電子(〜10^80)よりも多くの状態(10 ^(10^100))があります。したがって、私たちの宇宙では、そのタスクを実行することができる機械のそのような実現はあり得ません。

+3

しかし、256の状態を保存するために必要な電子は8個だけであると考えてください。 – Thilo

+0

私は無限の時間があるので不可能であることを証明するのは簡単ではないと思います。 – 9dan

+2

"256状態を格納するために必要な電子数は8つだけです。電子に1ビットを保存できると仮定します。たぶんもっと多くの州を保存することができます。私のサブアトミックphysics-fooは弱すぎます。 – Thilo

1

はこれを解くアルゴリズムです:

print 1 
for 1 to 10^(10^100) 
     print 0 

一つは自明Hoare logicを使用して正しさを証明することができます。

  1. 一切の前提条件
  2. はありませんポスト条件は1が続いていることです10 ^(10^100)のゼロが印刷されます
  3. サイクルの不変量は、今までに印刷されたゼロの数がi

編集:問題を解決するマシンでは、異なる状態のグーグルプレックスを区別する能力が必要です。各状態は、以前のものより1つ多くゼロを印刷した結果です。これを行うのに必要なメモリ量は、番号googolplexを格納するのに必要なものと同じです。使用可能なメモリがあまりない場合、この問題は解決できません。

これは計算上の問題ではないことを意味するわけではありません。チューリングマシンは無限のメモリ容量を持つため、チューリングマシンで解決できます。

+0

その巨大な数を評価して保存できる実装に依存しているのですしかし、 – Thilo

+1

さて、OPはアルゴリズムの説明(またはプログラム)を求めました。実際に出力を確認することはできないと述べているため、実装する必要はありません。 :P –

+1

いいえ、それはありません... python cantは10(^ 10^100)を処理できません。 – Rajan

0

もちろん、理論上この問題の解決策があります。もちろん、そのような出力を生成できるマシンがあるとします。物理学者が私たちに言うことによれば、少なくともgoogolplexは宇宙の原子の数よりも大きいので、物理的に実現可能な計算モデルはそれを印刷することはできないと私は考えていません。しかし、数学的に言えば、Googolplex-ish数の状態を与え、各書き込みを0にしてから次の低い状態に移動するだけで、値を印刷できるチューリングマシンを定義できます。

+0

真。理論的には、数値がメモリに保持されていればそれほど問題はありません。しかし、私は宇宙の中の原子/粒子の数がこの問題に直接関係しているとは思わない。つまり、googolやgoogolplexを簡単に印刷することができます。私は限界と理由はどこですか?または、任意の桁数を印刷する方法はありますか? – Rajan

+1

@ラジャン:電子の数は宇宙であり、非常に重要です。プログラムは一定数の状態にある必要があります。それらの状態が宇宙で表現できない場合、そのようなプログラムは不可能です。 – jason

+0

@Jason:それは妥当だと思う。私はほとんど確信していますが、何とかこの制約を回避するソリューションが存在することを願っています。 – Rajan

5

まず、10 ^(10^100)は(((10^10)^ 10)^ ...)^ 10)、100回に相当することに注意してください。

または10↑↑↑↑↑↑↑↑↑↑10。

これは、次の解決策を生じさせる:十分に近い...

printf 1 
while true; do 
    printf 0 
done 

:bashで

print 1 
for i in A(10, 100) 
    print 0 
+0

+1よく研究された問題に還元する:http://en.wikipedia.org/wiki/Ackermann_function – Thilo

+0

これらの数値を扱うことができるA(m、n)のジェネレータ関数を考え出すことができれば、私たちは完了です。しかし、私たちはまだそこにいないと思う:-)。 – Rajan

+0

@Rajan:すでにA(m、n)を生成できる関数があります。無限の時間と空間を与えてください。このコードはうまくいくでしょう。無限の時間またはスペースが無限にある場合は、その制限が何であるかを指定する必要があります。 –

1

+1

h.ahahae(10e100)最適化: 'print 0000'を使用すると、時間の1/4になります。 – st0le

+0

@ st0le - ああ、最適化されています。例えばあなたは 'xxd -b -g 0 -c 256 -l 256

+2

ええ、みんな?複雑なO(∞)のアルゴリズムを最適化するのは意味がないと思います。 – MatrixFrog

0

は、次のことを考えてみましょう:

  • あなたが出力を印刷していると、コンソールウィンドウが最大バッファサイズを持つことになります。
  • このバッファサイズを超えると、以前に印刷されたものはすべて破棄され、ユーザーはそれを見るためにスクロールバックできなくなります。
  • 最大バッファサイズはgoogolplexに比べて非常に小さくなります。

したがって、あなたは、完了するまで実行しているプログラムのユーザーエクスペリエンスを模倣するあなたに印刷し、多くのゼロということに印刷されますコンソールの最大バッファサイズを検索する場合。

ハレイ怠惰!

+2

鉱山はレイジーでクロスプラットフォームになります:) –

+0

@Zac:Trueですが、あなたのプログラムは決して停止することはありません。私の場合、コンソールバッファーを満たした後に停止するので、* computer *の観点からは、作業が少なくなっています。 ;) – gnovice

+0

これは、間違っている! –

関連する問題