Константа Хінчіна до якомога більше десяткових знаків у 64 байт або менше


22

Константа Хінчіна - це допитлива математична константа, яку, за словами Вольфрама Матволда , "сумно важко обчислити з високою точністю" .

Ось це до 100 цифр:

2.685452001065306445309714835481795693820382293994462953051152345557218859537152002801141174931847697 ...

Напишіть програму в 64 байт або менше, яка виводить константу Хінчина до максимальної кількості правильних десяткових знаків.

  • Ви не можете використовувати будь-які вбудовані бібліотечні константи або функції, що безпосередньо стосуються постійної Хінчіна. (наприклад, Math.Khinchin (точність), безумовно, не дозволено.)
  • Ви можете використовувати математичні бібліотеки для обчислення логарифмів, підсумок тощо.
  • Ви можете твердо кодувати всю або частину своєї відповіді.
  • Ваша програма повинна виробляти обмежений вихід і працювати менш ніж за годину на досить сучасному комп'ютері (наприклад, перерахованому тут ).
  • Ви повинні вивести на stdout. Введення немає.
  • Ви можете використовувати будь-які символи, які ви хочете, поки http://mothereff.in/byte-counter реєструє 64 байти або менше.

Оцінка балів

Ваш бал - це кількість послідовних цифр у константі Хінчіна, що ваша програма виводить правильно, починаючи з 2,68 ... Ви можете виводити неправильні цифри, але до вашої оцінки зараховується лише остання правильна цифра.

Наприклад, вихід

2.68545200 2 06530644530971483548179569382038229399446295305115234555721

набрав би 9 балів. Один для кожної з цифр, 2 6 8 5 4 5 2 0 0але нічого після 2, що має бути 1.


2
Чому ви дозволяєте жорстко кодувати всю відповідь?
Вільям Барбоса

5
@WilliamBarbosa чому б і ні? в ідеалі має бути рішення, яке набирає кращих балів за 31. Якщо ні, то це прикро.
Мартін Ендер

1
Чи дозволено Unicode? Як це порахувати?
aditsu

3
Ви повинні дозволити 64b замість 32 і рахувати всі символи як байти UTF-8 ( mothereff.in/byte-counter ) (= 1 - 4 байти на char залежно від площини Unicode). Крім того , існуючі рішення можуть бути легко адаптовані до 64b
XEM

3
@PeterTaylor Я зашифрував рішення CJam з плаваючою комою, і дозвольте вам сказати, обмежена точність - не головна проблема: p
aditsu

Відповіді:


11

Клен, 200+

Наступна команда Maple обчислює константу Хінчіна до потрібної точності (тут 200 цифр):

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

Цей код повинен працювати, якщо скопіювати його та вставити у графічний інтерфейс Maple. ζЗаймає два байта в кодуванні UTF-8, і три, в цілому 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 цифр, здається, закінчиться приблизно за півгодини; ваш може бути здатний на більше. Зауважте, що Maple округляє результат до потрібної точності замість обрізання, тому фактична кількість відповідних цифр може бути дещо меншою.

Цей метод обчислення константи базується на формулі (9) зі сторінки MathWorld , цитованої там Gosper (1996, чол. Комісії):

            Рівняння

Це був найефективніший метод, який мені вдалося (ледве) втиснути в 64 байти або менше.


Досить акуратно. Якби у мене був Клен: /
Захоплення Кальвіна

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"

Пояснення:

2Push 2
'.Push Dots
"…"- це рядок, що містить решта цифр у закодованому вигляді
128bперетворює рядок у число, трактуючи символи як цифри в базі 128 (через їх ASCII код)


2
Дуже хороша. Чи можете ви це трохи пояснити?
Кайл Канос

@KyleKanos додав пояснення
aditsu

Це круто. Я повинен навчитися CJam одного дня ... Крім того, я не можу змусити вашого інтерпретатора працювати у веб-браузері Opera, хоча він працює на моєму Firefox. Можливо, питання про Оперу, але думав, що я це згадаю.
Кайл Канос

1
@ Calvin'sHobbies У 1997 році Xavier Gourdon обчислив перші 110 000 цифр за 22 години, використовуючи щонайменше процесор 250 МГц. Тож ви зможете за годину обчислити 1000 разів більше цифр, ніж це рішення. web.archive.org/web/20120218093629/http://pi.lacim.uqam.ca/…
Alex L

1
@ Calvin'sHobbies див. Посилання на повну програму, яка, як повідомляється, обчислила 2000 цифр за 7 секунд.
aditsu

5

Кона 63

Простий жорсткий відповідь:

2.68545200106530644530971483548179569382038229399446295305115234

ммм, чи не 63?
xem

@xem: незначна друкарська помилка. Виправлено. : D
Кайл Канос

1
Також працює в GNU BC
Digital Trauma

@DigitalTrauma: Напевно, працює і на кількох інших мовах, я просто затримався з Kona, тому що я відповідав на це раніше.
Кайл Канос

5

Хаскелл, 5

Ну, оскільки ніхто не опублікував рішення, використовуючи фактичну математику, я вирішив, що хочу, хоча це ще ніде не так близько, як інші відповіді.

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

Це обчислення 2.6854453689859192, які є колосальними 5 символами константи. Вольфрам мав рацію, коли сказав, що "важко обчислити з високою точністю".


63-байтна програма - 1 байт запасного! Приємно!
Цифрова травма

Додатковий байт міг би бути іншим 9, але мій комп'ютер не міг це впоратися, і навіть якщо це міг, я не впевнений, що це призведе до іншої точної цифри.
Зак

Використовуючи Ruby, я, в основному, досяг максимального, що можна зробити за допомогою цієї формули, запустивши це за 60 секунд. Я отримав 2.685451312659854: tio.run/##KypNqvz/P9vWkEvDUE/…
Просто красиве мистецтво

3

Математика, 6

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

дає

2.68545843

і використовує лише 50 байт, тому є місце для пошуку чогось кращого, ніж Piвикористання більшого дробу, але я не впевнений, що це стане набагато краще за час роботи. (Тим більше, що для пошуку кращої комбінації, ймовірно, знадобиться кілька днів, якщо я просто використовую грубу силу.)

(Звичайно, ви були досить розумні, щоб заборонити Khinchin~N~2000, де їх 2000можна замінити будь-яким числом, яке дає результат протягом години;).)


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 (а) запустить за <60 хв і (b) дасть мені більш точне рішення.


Підозра: Кожен додатковий нуль додає менше однієї правильної цифри: '(
Просто красиве мистецтво

1

GNU BC , 5 цифр (програма 54 байти)

Спроба фактично розрахувати. GNU BC є жахливо повільним. Це тривало 53 хвилини на Ubuntu 14.04 VM, що працює на середині 2012 року MacBook Pro Retina. Дивно, що він працює швидше у 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 за допомогою java 8, він виводить це приблизно через хвилину на мій ноутбук:

2.6854513126595827

Інтернет-перекладач, ймовірно, зайняв би занадто багато часу.


1

Пітона, 64 66

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

Виходи:

2.68545200106530644530971483548179569382038229399446295305115234555

Ви можете вирізати пробіл після printнатискання на іншого символу.
xnor

1

Рубі - 73

На жаль, ви можете конвертувати до бази 36 лише to_iв Ruby:

"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

повертає 2.68545210493822 за одну хвилину на мій старий (intel Core2) ноутбук.

Наскільки я знаю, функція Zeta в RPL / 2, саме тому я використовував інтеграцію (формула 15 зі сторінки Mathworld). В принципі, точність можна було б покращити, замінивши 1e-9 та 1e-7 на меншу кількість, але мені, мабуть, не вистачало пам'яті.

Звичайно, вдаючись до нескінченного продукту вирішують цей момент, схоже

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

і працюватиме так, як є на виклику HP RPL, але виявляється, що на два порядки повільніше (на ноутбуці, не намагався на моєму HP!), і дає лише 6 цифр.

Тож алгоритм інтеграції в RPL / 2 насправді справляється непогано.


0

Багато мов відбиття, 61

Вибачте, не знайшли кращого рішення.

"2.685452001065306445309714835481795693820382293994462953051152"

Правила не кажуть, що правильній послідовності чисел не може передувати лапки, тому я використовую це. Виконавши, що, наприклад, на консолі JS, ви отримаєте ту саму рядок, що включає лапки.


1
Так, це справедливо навіть із цитатою попереду. Важливо лише те, що 2.685 ... безперебійно.
Хобі Кальвіна

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 секунди.)

На знак солідарності з іншими математичними рішеннями я дам ще гірший збіг, який обчислює середнє геометричне значення першого мільйона коефіцієнтів дробу одного єдиного довільного ірраціонального числа, яке не такого типу, як відомо, не працює. Насправді я сфальсифікував це число, спробувавши декілька, поки не отримав той, який збігся на зайвій цифрі.

Забавно: я заморозив мій комп'ютер і повинен був зробити жорстке вимикання після спроби скоротити цей код з Python для гольфу трюку заміни for _ in[1]*10**6:codeз exec("code"*10**6).


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.