Khinchin的常数,以64个字节或更少的字节为单位


22

Khinchin常数是一个奇怪的数学常数,根据Wolfram MathWold的说法“众所周知,很难高精度地计算出来”

这是100位数字:

2.685452001065306445309714835481795693820382293994462953051152345557218859537152002801141174931847697 ...

编写一个不超过64个字节的程序,以输出Khinchin常数到正确的小数位数的最大数量。

  • 您不得使用任何与Khinchin常数直接相关的内置库常数或函数。(例如,绝对不允许Math.Khinchin(precision)。)
  • 可以使用数学库来计算对数,求和等。
  • 可以对全部或部分答案进行硬编码。
  • 您的程序必须产生有限的输出,并且必须在一台相当现代的计算机(例如此处列出的计算机)上运行少于一小时。
  • 您必须输出到stdout。没有输入。
  • 只要http://mothereff.in/byte-counter注册64个字节或更少的字节,就可以使用任何所需的字符。

计分

您的分数是程序从2.68开始正确输出的Khinchin常数中连续数字的位数。您可能会输出不正确的数字,但只有最后一个正确的数字会计入您的分数。

例如,输出

2.68545200 2 06530644530971483548179569382038229399446295305115234234721

得9分。每个数字一个,2 6 8 5 4 5 2 0 0但在2之后不应该是1。


2
为什么允许对整个答案进行硬编码?
威廉·巴博萨

5
@WilliamBarbosa为什么不呢?理想情况下,应该有一个得分高于31的解决方案。否则,这是不幸的。
马丁·恩德

1
可以使用unicode吗?怎么算呢?
aditsu

3
您应该允许使用64b而不是32b,并将所有字符计数为UTF-8字节(mothereff.in/byte-counter)(每个字符= 1至4个字节,具体取决于Unicode平面)。此外,现有解决方案可以轻松地适用于64b
Xem

3
@PeterTaylor我编码了CJam浮点解决方案,让我告诉你,有限的精度不是主要问题:p
aditsu

Answers:


11

枫树,200+

以下Maple命令将Khinchin常数计算为所需的精度(此处为200位):

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

如果将其复制粘贴到Maple图形界面中,则该代码应该可以工作。所述ζ发生在UTF-8两个字节,和3,一共有62个字节。

写出这些符号的ASCII版本,即使使用min()代替的技巧infinity,a也会使字节数达到66:

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

通过在之后更改方括号中的数字,可以轻松地调整计算出的数字位数evalf。在我那台比较旧的计算机上,大约半个小时内就可以完成200位数字的显示;您的能力可能更多。请注意,Maple 将结果四舍五入到要求的精度,而不是将其截断,因此匹配数字的实际数量可能会少一些。

这种计算常数的方法基于MathWorld页面上的公式(9),在该公式中引用了Gosper(1996,pers。comm。):

            Equation

这是我设法(勉强)压缩到64个字节或更小的最有效的方法。


挺整洁的。如果我有枫树的话:/
卡尔文的爱好2014年

12

果酱-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"

说明:

2推动2
'.推动点
"…"是一个包含其余数字的字符串,该数字以编码形式
128b转换为数字,将字符视为基数128中的数字(通过其ASCII码)


2
非常好。你能解释一下吗?
凯尔·坎诺斯

@KyleKanos添加了解释
aditsu

棒极了。我应该有一天学习CJam ...此外,尽管我的Firefox可以使用您的在线解释器,但我无法在Opera Web浏览器中使用它。可能是歌剧的问题,但我想提一下。
凯尔·坎诺斯

1
@ Calvin'sHobbies在1997年,Xavier Gourdon使用最多250MHz的处理器在22小时内计算了第一个110,000位数字。因此,您在一小时内就可以计算出1000倍的数字。web.archive.org/web/20120218093629/http://pi.lacim.uqam.ca/...
亚历大号

1
@ Calvin'sHobbies可以看到此链接,以获取完整的程序,据说该程序在7秒钟内计算了2000位数字。
2014年


5

哈斯克尔(5)

好吧,由于没有人发布使用实际数学方法的解决方案,所以我决定我会这样做,尽管它与其他答案的距离不远。

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

这将计算2.6854453689859192,这是常量的5个字符。Wolfram说“很难计算出高精度”时是对的。


63字节程序-1字节备用!真好!
Digital Trauma

多余的字节可能是另一个9,但我的计算机无法处理,即使可以,我也不确定是否会导致另一个准确的数字。
Zaq 2014年

使用Ruby,我基本上达到了使用此公式可以执行的最大操作,并在60秒内运行了该公式。我知道了2.685451312659854tio.run/##KypNqvz/P9vWkEvDUE/…
Simply Beautiful Art

3

Mathematica,6岁

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

2.68545843

并且仅占用50个字节,因此还有一些空间可以找到比Pi使用更好的东西并使用更大的连续分数,但是我不确定一个小时的运行时间会好得多。(特别是因为如果我只是使用蛮力,找到更好的组合可能要花几天时间。)

(当然,您足够聪明,不能接受Khinchin~N~20002000可以用一个小时之内可以给您结果的数字代替;)。


1
+1用于使用常量的含义,而不仅仅是公式。
六。

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)给我一个更准确的解决方案。


怀疑:每个额外的零添加少于一个正确的数字:'(
Simply Beautiful

1

GNU BC,5位数字(54字节程序)

尝试进行实际计算。GNU BC非常慢。该程序在2012年中的MacBook Pro Retina上运行的Ubuntu 14.04 VM上运行了53分钟。奇怪的是,它在VM中的运行速度比OSX裸机更快-可能是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 -l需要用于e()l()功能(且设置比例= 20)。


1

CJam浮点计算-6

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

它适合原始的32个字节:)

使用Java 8与Java解释器一起运行,它将在大约一分钟后在我的笔记本电脑上输出:

2.6854513126595827

在线口译员可能会花费太长时间。


1

蟒蛇,64 66

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

输出:

2.68545200106530644530971483548179569382038229399446295305115234555

您可以在后面剪切空格print以挤入另一个字符。
xnor

1

红宝石-73

不幸的是,to_i在Ruby中,您最多只能将基数转换为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)笔记本电脑上返回2.68545210493822。

据我所知,RPL / 2中没有Zeta函数,这就是为什么我使用了集成(Mathworld页面上的公式15)的原因。原则上,可以通过用较小的数字替换1e-9和1e-7来提高准确性,但是我显然对此没有记忆。

当然诉诸无穷乘积解决了这一点,看来

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

并且可以在HP RPL Calc上按原样工作,但是事实证明它要慢两个数量级(在笔记本电脑上,没有在我的HP上尝试过!),并且仅给出6位数字。

因此,RPL / 2中的集成算法实际上做得很好。


0

许多repl语言,61

抱歉,没有找到更好的解决方案。

"2.685452001065306445309714835481795693820382293994462953051152"

规则并没有说正确的数字序列不能以引号引起来,所以我正在使用它。例如,通过在JS控制台中执行该命令,您将获得相同的字符串,包括引号。


1
是的,即使在前面加上引号也有效。仅需保持2.685 ...不间断。
加尔文的爱好2014年

0

巨蟒(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秒。)

为了与其他数学解决方案保持一致,我将给出一个更差收敛的计算方法,该方法计算单个任意无理数的第一个数百万个连续分数系数的几何平均值,该非理性数不是已知的不可行类型。实际上,我尝试了几次来索取该数字,直到我发现一个数字碰巧多一个数字。

有趣的事情:我尝试冻结用替换for _ in[1]*10**6:code为的Python技巧来缩短此代码后,冻结了计算机,并不得不执行硬关机exec("code"*10**6)


0

ES7,56

alert`2.6854520010653064453097148354817956938203822939944629531`
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.