Створіть найповільнішу функцію, що зростає, у розмірі менше 100 байт


23

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

Ваша програма буде приймати як вхід невід’ємне ціле число, а виводить невід’ємне ціле число. Давайте назвемо вашу програму P.

Він повинен відповідати цим двом критеріям:

  • Його вихідний код повинен бути меншим або рівним 100 байт.
  • Для кожного K існує N, такий, що для кожного n> = N, P (n)> K. Іншими словами, lim (n-> ∞) P (n) = ∞ . (Це те, що означає для нього "зростати".)

Ваш "бал" - це темп зростання основної функції вашої програми.

Більш конкретно, програма P зростає повільніше, ніж Q, якщо є N такий, що для всіх n> = N, P (n) <= Q (n), і є принаймні один n> = N такий, що P (n ) <Q (n). Якщо жодна програма не краща за іншу, вони прив'язуються. (По суті, яка програма повільніша, заснована на значенні lim (n-> ∞) P (n) -Q (n).)

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

Це , тому перемагає найповільніша програма!

Примітки:

  • Щоб допомогти в оцінці, спробуйте ввести у відповідь, яку функцію обчислює ваша програма.
  • Крім того, покладіть деякі (теоретичні) входи та результати, щоб допомогти людям уявити, наскільки повільно ви можете піти.


3
Ефективна стратегія - написати швидко зростаючу функцію та прийняти її зворотну, тобто знайти найменший внесок до неї, який дає хоча б необхідне значення. Можливо, це дуп?
xnor

Третина абзацу "Більш конкретно" бракує, оскільки Маркдаун вважає, що за <ним слідує лист - це початок тегу HTML. Перегляньте свої запитання перед тим, як їх опублікувати, будь ласка: P
ETHproductions

1
Які великі кардинальні аксіоми ми можемо припустити?
Пітер Тейлор

1
Чи передбачена машина часу для перевірки наших відповідей?
Чарівний восьминога Урна

Відповіді:


13

Haskell, 98 байт, оцінка = f ε 0 −1 ( n )

_#[]=0
k#(0:a)=k#a
k#(a:b)=1+(k#(([1..k]>>fst(span(>=a)b)++[a-1])++b))
f n=[k|k<-[0..],k#[k]>n]!!0

Як це працює

Це обчислює зворотну функцію дуже швидко зростаючої функції, що стосується гри черв'яка Беклемішева . Його швидкість росту порівнянна з f ε 0 , де f α - швидко зростаюча ієрархія і ε 0 - це перше число епсилонів .

Для порівняння з іншими відповідями зауважте, що

  • експоненціація порівнянна з f 2 ;
  • ітераційне експоненцію ( тетрація або ↑↑ ) можна порівняти з f 3 ;
  • ↑↑ ⋯ ↑↑ з m стрілками порівнянна з f m + 1 ;
  • Функція Ackermann порівнянна з f ω ;
  • повторні ітерації функції Акермана (такі конструкції, як число Грема ), досі переважають f ω + 1 ;
  • і ε 0 - межа всіх веж ω ω ω ω .

Мені подобається опис тут краще.
PyRulez

Ви можете покласти посилання на вступ Googology Wiki до швидко зростаючої ієрархії
MilkyWay90

18

Брахілог , 100 байт

llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll

Спробуйте в Інтернеті!

Це, мабуть, ніде не буває повільністю в деяких інших вигадливих відповідях, але я не міг повірити, що ніхто не спробував цього простого і красивого підходу.

Просто ми обчислюємо довжину вхідного числа, потім довжину цього результату, потім довжину цього іншого результату ... всього 100 разів.

Це зростає так само швидко, як log (log (log ... log (x), зі 100 базовими-10 журналами.

Якщо ви введете свій номер у вигляді рядка , це буде працювати надзвичайно швидко на будь-якому введенні, який ви могли б спробувати, але не сподівайтесь, що коли-небудь побачите результат вище 1: D


8
+1 просто для чистого божевілля: o Факт забави: також працює в Jelly, якщо ви зробите це все шапки. : P
HyperNeutrino

5
Перше число, яке виводить 2, - 10 ↑↑ 99.
Пшеничний майстер

11

JavaScript (ES6), зворотна функція Ackermann *, 97 байт

* якби я зробив це правильно

A=(m,n)=>m?A(m-1,n?A(m,n-1):1):n+1
a=(m,n=m,i=1)=>{while(A(i,m/n|0)<=Math.log2(n))i++;return i-1}

Функція A- це функція Ackermann . Функція aповинна бути функцією зворотного Акермана . Якщо я реалізував це правильно, Вікіпедія каже , що вона ніколи не вийде , 5поки mрівні 2^2^2^2^16. Я StackOverflowобіймаю 1000.

Використання:

console.log(a(1000))

Пояснення:

Функція Акермана

A=(m,n)=>                           Function A with parameters m and n
         m?                   :n+1  If m == 0, return n + 1; else,
           A(m-1,n?        :1)       If n == 0, return A(m-1,1); else,
                   A(m,n-1)          return A(m-1,A(m,n-1))

Зворотна функція Акермана

a=(m,n=m,i=1)=>{                                                Function a with parameter m, with n preinitialized to m and i preinitialized to 1
                while(A(i,m/n|0)<=Math.log2(n))                 While the result of A(i, floor(m/n)) is less than log₂ n,
                                               i++;             Increment i
                                                   return i-1}  Return i-1

2
Невже не переповнення стека добре ?
NoOneIsHere

Твоє твердження, що воно не вдарить 5, поки m = 2 ^^ 7 не буде правильним. Він не вдарив 5 до му не = 2 ^^ 7-3, але при 2 ^^ 7-1, то є 5. Я знаю , що -3 це дуже мало по порівнянні з 2 ^^ 7, але 5A5 = 2 ^^ 7-3 <2 ^^ 7. (^^ являє
тетрацію

8

Чисте зло: Евал

a=lambda x,y:(y<0)*x or eval("a("*9**9**9+"x**.1"+",y-1)"*9**9**9)
print a(input(),9**9**9**9**9)//1

Висловлювання всередині eval створює рядок довжиною 7 * 10 10 10 10 10 10 8,57, який складається не з нічого, а лише з викликів до функції лямбда, кожен з яких побудує рядок аналогічної довжини, yвмикатися і вмикатися, поки в кінцевому підсумку не стане 0. Начебто це має ту ж складність, що і метод Ешеу, наведений нижче, але замість того, щоб покладатися на логіку керування чи керування, він просто розбиває гігантські рядки разом (а чистий результат набирає більше стеків ... напевно?).

Найбільший y значення, яке я можу поставити та обчислити без помилки кидання Python, - це 2, що вже достатньо для зменшення введення max-float у повернення 1.

Рядок довжини 7,625,597,484,987 занадто великий: OverflowError: cannot fit 'long' into an index-sized integer.

Я повинен зупинитися.

Ешев Math.log : Переходячи до (10-го) кореня (проблеми), Оцінка: функція ефективно відрізняється від y = 1.

Імпорт математичної бібліотеки обмежує кількість байтів. Дозволяє усунути це і замінити log(x)функцію на щось приблизно еквівалентне: x**.1що коштує приблизно стільки ж символів, але імпорт не потребує. Обидві функції мають підлінійний вихід по відношенню до входу, але х 0,1 зростає ще повільніше . Однак нас не хвилює ціла партія, ми дбаємо лише про те, щоб вона мала однакову базову схему зростання щодо великої кількості, використовуючи при цьому порівнянну кількість символів (наприклад,x**.9 , така ж кількість символів, але росте швидше, тому там є деяка цінність, яка б демонструвала такий самий ріст).

Тепер, що робити з 16 символами. Як щодо ... розширення нашої лямбда-функції, щоб мати властивості Ackermann Sequence? Ця відповідь для великої кількості надихнула це рішення.

a=lambda x,y,z:(z<0)*x or y and a(x**.1,z**z,z-1)or a(x**.1,y-1,z)
print a(input(),9,9**9**9**99)//1

Розділ z**zтут заважає мені виконувати цю функцію з будь-якого місця, близького до здорових входів для, yі zнайбільші значення, які я можу використовувати, - це 9 і 3, для яких я отримую значення 1,0, навіть для найбільших плаваючих підтримків Python (зауважте: поки 1.0 чисельно перевищує 6,77538853089e-05, підвищені рівні рекурсії переміщують вихід цієї функції ближче до 1, залишаючись більшим за 1, тоді як попередня функція переміщувала значення ближче до 0, залишаючись більшими за 0, таким чином, навіть помірна рекурсія на цій функції призводить до такої кількості операцій, що число з плаваючою комою втрачає всі значущі біти).

Перенастройте вихідний лямбда-дзвінок на значення рекурсії 0 та 2 ...

>>>1.7976931348623157e+308
1.0000000071

Якщо порівняння робиться на «зміщення від 0» замість «зміщення від 1», ця функція повертається 7.1e-9, що, безумовно, менше, ніж 6.7e-05.

Фактичні програми базової рекурсії (г значення) 10 10 10 10 1.97 рівнів в глибину, як тільки сама у вихлопів, він отримує скидання з 10 10 10 10 10 1.97 (тому початкове значення 9 достатньо), так що я не Навіть не знаю, як правильно обчислити загальну кількість рекурсій, що виникають: я дійшов до кінця своїх математичних знань. Так само я не знаю, чи переміщення одного з **nекспоненцій з початкового вводу на вторинне z**zполіпшило б кількість рекурсій чи ні (ditto reverse).

Давайте ходити ще повільніше з ще більшою рекурсією

import math
a=lambda x,y:(y<0)*x or a(a(a(math.log(x+1),y-1),y-1),y-1)
print a(input(),9**9**9e9)//1
  • n//1 - економить на 2 байти int(n)
  • import math, math.економить 1 байтfrom math import*
  • a(...) економить загалом 8 байт m(m,...)
  • (y>0)*x зберігає байт за кадромy>0and x
  • 9**9**99збільшує кількість байтів на 4 і збільшує глибину рекурсії приблизно на ту, 2.8 * 10^xде xзнаходиться стара глибина (або глибина, що наближається до googolplex за розміром: 10 10 94 ).
  • 9**9**9e9збільшує кількість байтів на 5 і збільшує глибину рекурсії на ... божевільну кількість. Глибина рекурсії зараз 10 10 10 9,93 , для довідки, гугоплекс становить 10 10 10 2 .
  • Лямбда декларація збільшує рекурсию на додатковий крок: m(m(...))на a(a(a(...)))витрати 7 байт

Нове вихідне значення (при 9 глибинах рекурсії):

>>>1.7976931348623157e+308
6.77538853089e-05

Глибина рекурсії вибухнула до того моменту, коли цей результат буквально безглуздий, за винятком порівняно з попередніми результатами з використанням одних і тих же вхідних значень:

  • Оригінал називався log25 разів
  • Перше поліпшення називає це 81 раз
    • Поточна програма буде називати його 1e99 2 або близько 10 10 2,3 рази
  • Ця версія називає її 729 разів
    • Поточна програма буде називати його (9 - 99 ) 3 або трохи менше , ніж 10 10 95 разів).

Лембда, початок, оцінка: ???

Я чув, як ти любиш лямбда, так що ...

from math import*
a=lambda m,x,y:y<0and x or m(m,m(m,log(x+1),y-1),y-1)
print int(a(a,input(),1e99))

Я навіть не можу це запустити, я складаю переповнення навіть з 99-ма шарами рекурсії.

Старий метод (нижче) повертається (пропускаючи перетворення до цілого числа):

>>>1.7976931348623157e+308
0.0909072713593

Новий метод повертається, використовуючи лише 9 шарів вторгнення (а не повний гугол з них):

>>>1.7976931348623157e+308
0.00196323936205

Я думаю, що це виходить таким же складним, як послідовність Акермана, лише невелике, а не велике.

Також завдяки ETHproductions за 3-байтну економію в просторах, які я не знав, можна було видалити.

Стара відповідь:

Ціле усікання журналу функції (i + 1) повторювалося 20 25 разів (Python) за допомогою лямбда-лямбда.

Відповідь PyRulez можна стиснути, ввівши другу лямбда і склавши її:

from math import *
x=lambda i:log(i+1)
y=lambda i:x(x(x(x(x(i)))))
print int(y(y(y(y(y(input()))))))

99 100 використаних символів.

Це призводить до ітерації 20 25, порівняно з початковою 12. Додатково це економить 2 символи, використовуючи int()замість floor()яких дозволений додатковий x()стек. Якщо пробіли після лямбда можна видалити (наразі не можу перевірити), то y()можна додати 5-ю . Можливо!

Якщо є спосіб пропустити from mathімпорт, використовуючи повністю кваліфіковане ім’я (наприклад, x=lambda i: math.log(i+1))), це дозволить зберегти ще більше символів і дозволити ще один стек, x()але я не знаю, чи підтримує Python такі речі (я підозрюю, що це не так). Готово!

Це, по суті, той самий трюк, який використовується у публікації блогу XCKD у великій кількості , однак накладні витрати в оголошенні лямбдаз виключають третій стек:

from math import *
x=lambda i:log(i+1)
y=lambda i:x(x(x(i)))
z=lambda i:y(y(y(i)))
print int(z(z(z(input()))))

Це найменша можлива рекурсія з 3 лямбдами, що перевищує обчислену висоту стеку на 2 лямбда (зменшення будь-якої лямбда на два виклики знижує висоту стека до 18, нижче, ніж у 2-лямбда-версії), але, на жаль, вимагає 110 символів.


FYI, я рахую 103 байти в топовій програмі
ETHproductions

@ETHproductions о, ой. Я, мабуть, зробив підрахунок без intперетворення і подумав, що у мене є якісь запаси.
Draco18s

Я думаю, ви можете видалити пробіл після importта пробіл після y<0. Я не знаю багато Python, хоча тому я не впевнений
ETHproductions

Крім того, можливо, y<0and x or m(m,m(m,log(x+1),y-1),y-1)щоб зберегти ще один байт (якщо припустити x, 0коли це колись y<0)
ETHproductions

2
Ну ... log(x)зростає повільніше, ніж БУДЬ-яка позитивна сила x(для великих значень x), і це не важко показати, використовуючи правило L'Hopital. Я впевнений, що ваша поточна версія робить (...(((x**.1)**.1)**.1)** ...)цілу купу разів. Але ці сили просто примножуються, тому це ефективно x**(.1** (whole bunch)), що є (дуже малою) позитивною силою x. Це означає, що вона насправді росте швидше, ніж ЄДИННА ітерація функції журналу (хоча, дано, вам доведеться дивитись ДУЖЕ великі значення xраніше, ніж ви помітите ... але це ми маємо на увазі під "переходом до нескінченності" ).
mathmandan

4

Haskell , 100 байт

f 0 a b=a^b
f c a b=foldr(f$c-1)a$[0..b]>>[a]
i=length.show
0#x=i x
y#x=i$(y-1)#x
g=(f(f 9 9 9)9 9#)

Спробуйте в Інтернеті!

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

Спочатку визначимо функцію f. fце ублюдкова версія нотації про спустошення Кнут, яка росте трохи швидше (трохи трохи заниження, але цифри, з якими ми маємо справу, настільки великі, що в грандіозній схемі речей ...). Ми визначаємо базовий випадок того, f 0 a bщоб бути a^bчи aпід силу b. Потім ми визначаємо загальний випадок, який слід (f$c-1)застосувати до b+2екземплярів a. Якби ми визначали позначення Knuth uparrow як конструкцію, ми застосовували б її до bекземплярів a, але b+2насправді є гольфістами і має перевагу швидшого зростання.

Потім визначаємо оператора #. a#bвизначено, що length.showзастосовується до b aразів. Кожна програма застосування length.showприблизно дорівнює log 10 , що не дуже швидко зростає функція.

Потім ми підемо про визначення нашої функції, gяка приймає і ціле число, і застосовується length.showдо цілого числа купу разів. Щоб бути конкретним, це стосується length.showвведення даних f(f 9 9 9)9 9. Перш ніж ми розберемося, наскільки це велике, давайте подивимось f 9 9 9. f 9 9 9це більше , ніж 9↑↑↑↑↑↑↑↑↑9 (дев'ять стрілок), масивний край. Я вважаю, що це десь між 9↑↑↑↑↑↑↑↑↑9(дев'ять стрілок) і 9↑↑↑↑↑↑↑↑↑↑9(десять стрілок). Зараз це немислимо велика кількість, далеко не велика для зберігання на будь-якому існуючому комп'ютері (у двійковій нотації). Потім ми приймаємо це і ставимо це як перший наш аргумент, fщо означає, що наша цінність більша, ніж 9↑↑↑↑↑↑...↑↑↑↑↑↑9зf 9 9 9стрілки між ними. Я не збираюся описувати це число, оскільки воно настільки велике, я не думаю, що я міг би зробити це справедливим.

Кожне length.showприблизно дорівнює логу журналу 10 цілого числа. Це означає, що більшість цифр повернеться 1, коли fдо них застосовано. Найменше число, яке потрібно повернути щось, крім 1 10↑↑(f(f 9 9 9)9 9), це повернення 2. Давайте подумайте про це на мить. Настільки велика, як це число, яке ми визначили раніше, найменше число, яке повертає 2, дорівнює 10 власним потужностям. Thats 1 супроводжується 10↑(f(f 9 9 9)9 9)нулями.

У загальному випадку nнайменший вихідний сигнал повинен бути будь-яким заданим n (10↑(n-1))↑↑(f(f 9 9 9)9 9).

Зауважте, що ця програма потребує величезної кількості часу та пам'яті навіть для невеликих n (більше, ніж у Всесвіті багато разів), якщо ви хочете перевірити це, я пропоную замінити f(f 9 9 9)9 9набагато меншу кількість, спробуйте 1 або 2, якщо хочете будь-який вихід, окрім 1.


Мех, я не думаю, що когось хвилює те, скільки часу потрібно або скільки пам'яті потрібно, щоб програма працювала на такі питання.
Просто красиве мистецтво

3

APL, застосовувати log(n + 1), e^9^9...^9рази, коли довжина ланцюга дорівнює e^9^9...^9довжині ланцюга мінус 1 рази тощо.

⌊((⍟1+⊢)⍣((*⍣(*⍣(*⍣(*⍣(*⍣(*⍣(*⍣(*⍣(*⍣(*⍣(*⍣(*⍣(*⍣(*⍣(*⍣(*⍣(*⍣(*⍣(*⍣(*⍣(*⍣⊢)))))))))))))))))))))9))⊢

Чи є спосіб я це запустити?
Draco18s

7
@ Draco18s отримають квантовий комп'ютер з практично нескінченною пам’яттю, встановлять гідний розподіл APL і витрачають час, коли ви його чекаєте, щоб створити сироватку, що запобігає старінню, тому що вам доведеться сидіти щільно пару століть.
Уріель

Ха-ха. Добре тоді. : p
Draco18s

Ви впевнені, що це наближається до нескінченності?
PyRulez

@PyRulez - це точно так само, як і інші рішення, лише з набагато більшою кількістю ітерацій журналу. але більше ітерації все-таки є тією самою завершальною дією - протистоїть цього, навіть через викриття. Я не був впевнений у e^n^n...^nчастині, тому перетворив її на постійну, але це може бути правдою
Уріель

3

MATL , 42 байти

iXI:`2*.]X{oXH1H/16L+XKxI:`Yl.]K+XKXdXzXGx

Спробуйте в Інтернеті!

Ця програма заснована на гармонійних рядах із застосуванням константи Ейлера-Машероні. Коли я читав документацію @LuisMendo про його мову MATL (з великої літери, тому це виглядає важливо), я помітив цю константу. Вираз функції повільного росту такий: введіть тут опис зображення

де εk ~ 1 / 2k

Я перевірив до 10000 ітерацій (у Matlab, оскільки він занадто великий для TIO), і він набирає нижче 10, тому це дуже повільно.

введіть тут опис зображення

Пояснення:

 iXI      % ask user input (number of iterations)

:`2*.]    % do...while loop, multiply by 2

X{        % convert numeric array into cell array

o         % convert to double precision array 

XH1H/     % copy to clipboard H and divide by 1: now we have an array of 1/2k

16L       % Euler–Mascheroni constant 

+         % addition (element-wise, singleton expansion)

XKxI:`    % save, clear the stack, do...while loop again

  Yl      % logarithm 

  .]      % break, ends the loop

K+XK      % paste from clipboard K, sum all

Xd        % trim: keep the diagonal of the matrix 

Xz        % remove all zeros

XG        % plot (yes it plots on-line too!)

x         % clear the stack
          % (implicit) display

Емпіричний доказ: (ln k ) + 1 червоного кольору завжди вище ln k + γ + εk синього кольору.

введіть тут опис зображення

Програма для (ln k ) + 1 була зроблена в

Матлаб, 47 18 14 байт

n=input('')
A=(1:n)
for k=1:n
A(k)=log(k)+1
end

Цікаво зауважити, що минулий час для n = 100 становить 0,208693 на моєму ноутбуці, але лише 0,121945 з d=rand(1,n);A=d*0;і навіть менше, 0,112147 з A=zeros(1,n). Якщо нулі - це марна трата місця, це економить швидкість! Але я розходяться з теми (напевно, дуже повільно).

Редагувати: спасибі Стюі за те, що допомогла скоротити цей вираз Matlab до:

 @(n)log(1:n)+1

+1 за те, що це не просто зворотна швидка функція
PyRulez

1
Цікавий SO-пост про вашу цікаву записку. :)
Стюі Гріффін

До речі, гра в гольф сценарію в нижній частині (так як ви включили лічильник байт): Останній MATLAB скрипт просто: n=input('');A=log(1:n)+1або як безіменна анонімну функція (14 байт): @(n)log(1:n)+1. Я не впевнений у MATLAB, але A=log(1:input(''))+1працює в Октаві ...
Стюі Гріффін

дякую @Stewie n=input('');A=log(1:n)+1працює, @(n)log(1:n)+1не (справді дійсна функція з ручкою в Matlab, але введення не запитується), A=log(1:input(''))+1працює і може бути скороченоlog(1:input(''))+1
J Doe

Що я мав на увазі під анонімною функцією, це було . Ось "нормальний" спосіб збереження байтів (принаймні на цьому сайті), вимагаючи введення, подається як аргументи функції (мета-пост) замість командного рядка. Крім того, f=не потрібно рахувати, оскільки це можливо просто: @(n)log(1:n)+1після чого ans(10)отримати перші 10 номерів.
Стюі Гріффін

2

Python 3 , 100 байт

Підлога журналу функцій (i + 1) повторювала 999999999999999999999999999999999999999 разів.

Можна використовувати показники, щоб зробити вказане число ще більшим ...

from math import *
s=input()
exec("s=log(s+1);"*99999999999999999999999999999999999)
print(floor(s))

Спробуйте в Інтернеті!


2
Чи повинні насправді рішення працювати? Це кидає OverflowError.
ETHproductions

2
@ETHproductions у подібних проблемах прийнято вважати, що рішення повинні бути лише теоретично життєздатними на машині з нескінченною пам'яттю та процесором. Якщо ви хочете спробувати це, скоротіть 99999 ... 999 до приблизно 999 або близько того
Sparr

3
То чому б не використовувати 9**9**9**...**9**9e9?
CalculatorFeline

2

Підлога журналу функцій (i + 1) повторювався 14 разів (Python)

import math
x=lambda i: math.log(i+1)
print int(x(x(x(x(x(x(x(x(x(x(x(x(x(x(input())))))))))))))))

Я не очікую, що це буде дуже добре, але я подумав, що це вдало почати.

Приклади:

  • e ^ n ^ n ^ n ^ n ^ n ^ n ^ n ^ n ^ n ^ n ^ n ^ n ^ n ^ n -> ~ n (приблизно n)

Якщо ви використовуєте intзамість цього floor, ви можете поміститися в іншомуx(
Beta Decay

@BetaDecay Гаразд, я її оновив.
PyRulez

1
Чи не повинен бути вираз e^e^e^e...^n? Крім того, чому після місця є пробіл :?
CalculatorFeline

@CalculatorFeline, оскільки це не код гольфу, він просто повинен бути менше 100 байт.
Cyoce

Так? Що так погано в збереженні байта, щоб ви могли додати ще один x()дзвінок?
CalculatorFeline

2

Ruby, 100 байт, оцінка -1 = f ω ω + 1 (n 2 )

В основному запозичені з моїх найбільших друкованих номерів , ось моя програма:

->k{n=0;n+=1 until(H=->z,a=[0]*z{b,*c=a;z.times{z+=b ?H[z,b==1?c:[b>1?b-1:z]*z+c]:z};z};H[n*n]>k);n}

Спробуйте в Інтернеті

В основному обчислює інверсію f ω ω + 1 (n 2 ) у швидко зростаючій ієрархії. Перші кілька значень є

x[0] = 1
x[1] = 1
x[2] = 1
x[3] = 1
x[4] = 2

А потім він продовжує виходити 2дуже довго. Навіть x[G] = 2, де номер GГрема.


А як щодо g (f <sub> ω9001CK </sub> 3), де f FGH?
користувач75200

@ user75200 fgh недостатньо визначений для нерозбірливих порядків.
Просто красиве мистецтво

FGH є добре визначений для невичіслімих ордіналов, так як вони мають фундаментальні послідовності. Це просто незаперечно.
користувач75200

@ user75200 Ні. Фундаментальні послідовності дуже довільні. Я міг би визначити ω9001CK [x] = x, щоб мати фундаментальну послідовність довжини ω9001CK, яку можна обчислити для скінченного x, але, швидше за все, не те, що ви хотіли. Під «чітко визначеним» я мав на увазі, що не існує стандартної фундаментальної послідовності для нерозбірливих порядків, з якими можуть погодитися всі.
Просто красиве мистецтво

Хоча це правда, що фундаментальні послідовності не є унікальними, але основна послідовність для лічильної порядкової форми повинна бути довжиною ω.
Anders Kaseorg

0

Математика, 99 байт

(за умови ± займає 1 байт)

0±x_=1±(x-1);y_±0=y+1;x_±y_:=(y-1)±x±(x-1);(i=0;NestWhile[(++i;#±#±#±#±#±#±#±#)&,1,#<k&/.k->#];i)&

Перші 3 команди визначають x±yдля оцінки Ackermann(y, x).

Результатом функції є кількість разів, яке f(#)=#±#±#±#±#±#±#±#потрібно застосувати до 1, перш ніж значення дістанеться до значення параметра. Оскільки f(#)=#±#±#±#±#±#±#±#(тобто f(#)=Ackermann[Ackermann[Ackermann[Ackermann[Ackermann[Ackermann[Ackermann[#, #], #], #], #], #], #], #]) ростуть дуже швидко, функції ростуть дуже повільно.


0

Clojure, 91 байт

(defn f (apply +(for[n(range %)](/(loop[r 1 v n](if(< v 1)r(recur(* r v)(Math/log v))))))))

Вигляд обчислень sum 1/(n * log(n) * log(log(n)) * ...), які я знайшов звідси . Але функція закінчилася 101 байтом, тому мені довелося скинути явну кількість ітерацій, а натомість повторювати, поки число більше одиниці. Приклади виходів для входів 10^i:

0 1
1 3.3851305685279143
2 3.9960532565317575
3 4.232195089969394
4 4.370995106860574
5 4.466762285601703
6 4.53872567524327
7 4.595525574477128
8 4.640390570825608

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

Третя серія насправді вимагає кількості термінів gogogolplex, перш ніж часткові умови перевищують 10.


0

Javascript (ES6), 94 байти

(p=j=>i=>h=>g=>f=>x=>x<2?0:1+p(p(j))(j(i))(i(h))(h(g))(g(f))(f(x)))(_=x=>x)(_)(_)(_)(Math.log)

Пояснення :

Idпосилається на x => xнаступне.

Давайте спочатку розглянемо:

p = f => x => x < 2 ? 0 : 1 + p(p(f))(f(x))

p(Math.log)приблизно дорівнює log*(x).

p(p(Math.log))приблизно дорівнює log**(x)(кількість разів, яку ви можете прийняти, log*поки значення не перевищує 1).

p(p(p(Math.log)))приблизно дорівнює log***(x).

Зворотна функція Ackermann alpha(x)приблизно дорівнює мінімальній кількості разів, яку потрібно скласти, pпоки значення не буде максимум 1.

Якщо ми використовуємо:

p = g => f => x => x < 2 ? 0 : 1 + p(p(g))(g(f))(f(x))

тоді ми можемо писати alpha = p(Id)(Math.log).

Однак це досить нудно, тому давайте збільшимо кількість рівнів:

p = h => g => f => x => x < 2 ? 0 : 1 + p(p(h))(h(g))(g(f))(f(x))

Це схоже на те, як ми побудували alpha(x), окрім того, як робити log**...**(x), що зараз робимоalpha**...**(x) .

Навіщо хоч тут зупинятися?

p = i => h => g => f => x => x < 2 ? 0 : 1 + p(p(i))(i(h))(h(g))(g(f))(f(x))

Якщо попередня функція є f(x)~alpha**...**(x), ця є зараз ~ f**...**(x). Ми робимо ще один рівень цього, щоб отримати остаточне рішення.


" p(p(x => x - 2)) приблизно дорівнює log**(x)(кількість разів, яку ви можете прийняти, log*поки значення не перевищує 1)". Я не розумію цього твердження. Мені здається, p(x => x - 2)має бути "кількість разів, яку можна відняти, 2поки значення не буде максимум 1". Тобто, p (x => x - 2) `має бути функцією" ділити на 2 ". Тому p(p(x => x - 2))має бути "кількість разів, яку можна розділити на 2, поки значення не буде максимум 1" ... тобто це має бути logфункція, а не log*або log**. Можливо, це можна було б уточнити?
mathmandan

@mathmandan виглядає так, що я робив друкарську помилку на цьому рядку, він повинен бути p = f => x => x < 2 ? 0 : 1 + p(p(f))(f(x))там, де pпередано, p(f)як в інших рядках, а не f.
es1024
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.