64バイト以下で可能な限り多くの小数点以下のKhinchinの定数


22

キンチンの定数は奇妙な数学的定数であり、Wolfram MathWoldよれば「高精度に計算するの非常に難しい」

ここでは、100桁までです。

2.685452001065306445309714835481795693820382293994462953051152345557218859537152002801141174931847697 ...

Khinchinの定数を正しい小数点以下の最大数まで出力するプログラムを64バイト以下で作成します。

  • Khinchinの定数に直接関連する組み込みのライブラリ定数または関数を使用することはできません。(たとえば、Math.Khinchin(precision)は絶対に許可されません。)
  • あなたは可能計算対数、総和などに数学ライブラリを使用します
  • あなたはかもしれあなたの答えの一部または全部をハードコーディング。
  • プログラムは有限の出力を生成し、比較的近代的なコンピューター(ここにリストされているコンピューターなど)で1時間以内に実行する必要があります。
  • stdoutに出力する必要があります。入力はありません。
  • http://mothereff.in/byte-counterが 64バイト以下を登録する限り、任意の文字を使用できます。

得点

スコアは、2.68から始まる、プログラムが正しく出力するKhinchinの定数の連続する桁数です。間違った桁を出力できますが、最後の正しい桁のみがスコアにカウントされます。

たとえば、次の出力

2.68545200 2 06530644530971483548179569382038229399446295305115234555721

9ポイントを獲得します。数字ごとに1つ。2 6 8 5 4 5 2 0 0ただし、2の後は1である必要があります。


2
なぜ回答全体をハードコーディングできるのですか?
ウィリアムバルボサ14

5
@WilliamBarbosaどうして?理想的には、31よりも良いスコアのソリューションがあるはずです。そうでない場合、それは残念です。
マーティンエンダー14

1
ユニコードは許可されていますか?それを数えるには?
aditsu

3
32の代わりに64bを許可し、すべての文字をUTF-8バイト(mothereff.in/byte-counter)としてカウントする必要があります(Unicodeプレーンに応じて1文字あたり1〜4バイト)。また、既存のソリューションは64b
xem 14

3
@PeterTaylor CJam浮動小数点ソリューションをコーディングしましたが、精度の制限が主な問題ではないことを教えてください:p
aditsu 14

回答:


11

メープル、200 +

次のMapleコマンドは、Khinchinの定数を要求された精度(ここでは200桁)で計算します。

evalf[200](exp(sum((-1)^k*(2-2^k)*ζ(1,k)/k,k=2..∞)/ln(2)));

このコードは、Mapleのグラフィカルインターフェイスにコピーアンドペーストすると機能します。ζUTF-8で2つのバイトを取り、62バイトの合計三。

これらのシンボルのASCIIバージョンを書き出すと、のmin()代わりにを使用するトリックがあったとしてもinfinity、悲しいことに、バイトカウントは最大66になります。

evalf[200](exp(sum((-1)^k*(2-2^k)*Zeta(1,k)/k,k=2..min())/ln(2)));

計算された桁数は、後に角括弧で囲まれた数字を変更することで簡単に調整できますevalf。私のかなり古いコンピューターでは、200桁は約30分で終わるようです。あなたのものはもっとできるかもしれません。Maple は結果を切り捨てるのではなく、要求された精度に丸めるので、一致する実際の桁数は多少少なくなることに注意してください。

定数を計算するこの方法は、Gosperに引用されたMathWorldページの式(9)に基づいています(1996、pers。comm。):

            Equation

これは、64バイト以下に(ほとんど)圧縮できた最も効率的な方法でした。


きれいです。私がメープルを持っていた場合:/
カルビンの趣味14

12

CJam-118

2'."*;TeT?_aN{.i9B*ZEay
G`9~eW}nE=Lr-`B}    )D>9m9"136b

http://cjam.aditsu.net/で試してください

stackexchangeは文字の一部を破壊するため、上記のプログラムを生成するプログラムを次に示します。最初に実行してから、出力を実行します。

"2'.\""685452001065306445309714835481795693820382293994462953051152345557218859537152002801141174931847697995153465905288090 136b:c"\"136b"

説明:

2pushs 2
'.pushsドット
"…"は、エンコードされた形式で残りの数字を含む文字列で、文字列を数値に
128b変換し、文字をベース128の数字として(ASCIIコード経由で)処理します


2
非常に素晴らしい。少し説明してもらえますか?
カイルカノス14

@KyleKanosは、説明の追加
aditsu

すごい。いつかCJamを学ぶ必要があります...また、Firefoxでは動作しますが、オンラインインタープリターをOpera Webブラウザーで動作させることはできません。おそらくOperaの問題ですが、私はそれを言及すると思いました。
カイルカノス14

1
@ Calvin'sHobbies 1997年、Xavier Gourdonは最大250MHzのプロセッサを使用して、22時間で最初の110,000桁を計算しました。したがって、1時間でこのソリューションの1000倍の桁数を計算できる可能性があります。web.archive.org/web/20120218093629/http://pi.lacim.uqam.ca/...
アレックスL

1
@ Calvin'sHobbiesは、7秒で2000桁を計算したと伝えられている完全なプログラムについて、このリンクを参照しています。
aditsu


5

ハスケル、5

まあ、実際の数学を使った解決策を誰も投稿していないので、他の答えほど近くないにも関わらず、そうすることにしました。

main=print$product[(1+1/r/(r+2))**2`logBase`r|r<-[1..99999999]]

これはを計算します2.6854453689859192。これはなんと5文字の定数です。「高精度に計算するのは難しい」と彼らが言ったとき、Wolframは正しかった。


63バイトのプログラム-予備の1バイト!いいね!
デジタル外傷14

余分なバイトは別のバイトである可能性があります9が、私のコンピューターはそれを処理できませんでした。それができたとしても、別の正確な数字になるかどうかはわかりません。
ザック14

Rubyを使用すると、基本的にこの式を使用して最大60秒で実行できます。私が得た2.685451312659854tio.run
単に美しいアート

3

Mathematica、6

(Times@@Rest@ContinuedFraction[Pi,977])^(1.`9/976)

与える

2.68545843

50バイトしか使用しないためPi、より大きな継続部分を使用してより良い何かを見つける余地がありますが、1時間の実行時間でもっと良くなるかどうかはわかりません。(特に、私がブルートフォースを使用している場合、より良い組み合わせを見つけるにはおそらく数日かかるためです。)

(もちろん、あなたは1時間以内に結果が得られる任意の数字に置き換えることができるを拒否するのKhinchin~N~2000に十分賢い2000です;)。)


1
+1だけでなく、定数の意味を使用するため。
Vi。

2

wxMaxima 3

実際に計算されたメソッド!

bfloat(product((1+1/(n*(n+2)))^(log(n)/log(2)),n,1,10000));

約25分後、戻ってきました

2.681499686663101b0

Mathematicaのページでそれが述べられている理由がわかりました。プレイするキャラクターは6人ですが、6個の0を追加すると(a)60分未満で実行され、(b)より正確なソリューションが得られるとは考えられません。


疑い:ゼロを追加するごとに、正しい数字が1つ未満追加される: '(
Simply Beautiful Art

1

GNU BC、5桁(54バイトのプログラム)

実際に計算する試み。GNU BCは恐ろしく遅いです。これは、2012年半ばのMacBook Pro Retinaで実行されているUbuntu 14.04 VMで53分間実行されました。奇妙なことに、OSXベアメタルよりもVMで高速に実行されます。おそらく、GNUバージョンは、BSDバージョンよりもこのタスクに最適です。

for(k=r=1;r++<10^7;)k*=e(l(1/(r*(r+2))+1)*l(r)/l(2))
k

出力:

2.68544536902156538295

注意:

bc -le()およびl()関数に使用する必要があります(スケールを20に設定)。


1

CJam浮動小数点計算-6

1e8{I{1.II2+*/)I2mL#*}1.?}fI

元の32バイトに収まります:)

java 8を使用してjavaインタープリターで実行すると、ラップトップで約1分後にこれが出力されます。

2.6854513126595827

オンライン通訳はおそらく時間がかかりすぎるでしょう。


1

Python、64 66

print"2.%i"%int('anljsgqif7gwwwsrntcz7zv2obv6gv5us7fzfwjcaj',36)

出力:

2.68545200106530644530971483548179569382038229399446295305115234555

print別のキャラクターを絞ってからスペースを切ることができます。
XNOR

1

ルビー-73

残念ながら、to_iRubyで使用できるのはベース36までしか変換できません。

"2.#{"hmegxpkvliy1vaw4lb054ep8wsqwkz2yx9cm9jvc9yfd48j".to_i 36}"

返す

"2.6854520010653064453097148354817956938203822939944629530511523455572188595"

1

RPL / 2、計算された7桁、61バイト

'LN(FLOOR(1/X))/(X+1)/LN(2)' { 'X' 1e-9 1 } 1e-7 INT DROP EXP

私の古い(Intel Core2)ラップトップでは1分で2.68545210493822が返されます。

私が知る限り、RPL / 2にはゼータ関数はありません。これが、統合(Mathworldページの式15)を使用した理由です。原則として、1e-9と1e-7をより小さな数に置き換えることで精度を向上させることができましたが、そのためのメモリが不足していたようです。

もちろん、無限の製品に頼ってこの点を解決すると、次のようになります

1 1 1e9 FOR I 1 1 I dup 2 + * / + I LN 2 LN / ^ * NEXT

HP RPL計算ではそのまま動作しますが、2桁遅くなり(ラップトップではHPで試していない!)、わずか6桁しか表示されません。

そのため、RPL / 2の統合アルゴリズムは実際に非常に良い仕事をします。


0

多くのrepl言語、61

申し訳ありませんが、より良い解決策は見つかりませんでした。

"2.685452001065306445309714835481795693820382293994462953051152"

規則では、正しい数値シーケンスの前に引用符を付けることができないとは言わないため、これを使用しています。たとえば、JSコンソールで実行すると、引用符を含む同じ文字列が取得されます。


1
はい、これは前に引用があっても有効です。2.685 ...が中断されないことが重要です。
カルビンの趣味14

0

Python(5)

x=3**.1
p=1
for _ in[1]*10**6:p*=(x//1)**1e-6;x=1/(x%1)
print(p)

Output: 2.6854396408091694

(出力には約2秒かかります。)

他の数学ソリューションと連帯して、機能しないことが知られているタイプではない単一の任意の無理数の最初の百万の連続分数係数の幾何平均を計算する、さらに悪い収束性のソリューションを提供します。実際、余分な数字と一致する数字が得られるまで、数回試してその数字を作りました。

おもしろいこと:コンピューターをフリーズし、Pythonのゴルフトリックをに置き換えfor _ in[1]*10**6:codeてこのコードを短くしようとした後、ハードシャットダウンを行わなければなりませんexec("code"*10**6)でした。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.