Виведіть числа Ейлера


28

Враховуючи невід’ємне ціле число виведіть номер Ейлера ( OEIS A122045 ).n,nth

Всі непарні показники Ейлера -Ченно-індексовані числа Ейлера можна обчислити за такою формулою ( відноситься до уявної одиниці): 0.i1

E2n=ik=12n+1j=0k(kj)(1)j(k2j)2n+12kikk.

Правила

  • n буде невід'ємним цілим числом, таким, що число число Ейлера знаходиться в межах представницького діапазону цілих чисел для вашої мови.nth

Випробування

0 -> 1
1 -> 0
2 -> -1
3 -> 0
6 -> -61
10 -> -50521
20 -> 370371188237525

1
@donbright Вам не вистачає набір круглих дужок: wolframalpha.com/input/… - при цьому обидві суми є обома -i/2, які отримують -iпри додаванні. Помножте це на iзовнішню суму підсумовування, і ви отримаєте 1.
Mego

Відповіді:


18

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

EulerE

-кашель-


9
Побачивши заголовок, я одразу подумав "Напевно, математика повинна мати для цього вбудований".
HyperNeutrino

12
Це стосується майже кожного заголовка ... навіть виявлення козлів на зображеннях
Луїс Мендо

GoatImageQнедооцінений
Грег Мартін

1
Чи можете ви пояснити це? Редагувати: це був жарт.
Чарівний восьминіг Урна

13

J , 10 байт

(1%6&o.)t:

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

Використовує визначення для експоненціальної функції породження sech (x).


Чи робить J символічний аналіз, щоб отримати функцію генерування? Він не стикається з помилками з плаваючою комою навіть для n = 30.
orlp

@orlp Я не впевнений, що робить це внутрішньо, але Дж знає ряд Тейлора для підмножини дієслів . Будь-яка функція, яку ви можете визначити за допомогою комбінації цих дієслів, буде дійсною для t.або t:де є gf та egf Цікавою зауваженням є те, що tan (x) не підтримується, але sin (x) / cos (x) є.
миль


11

Клен, 5 байт

euler

Ура для вбудованих?


4
Любіть, коли математика занадто багатослівна для математичної задачі ...
theonlygusti

11

Максима , 5 байт / 42 байти

У Maxima є вбудований:

euler

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

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

Ми в основному шукаємо n-й коефіцієнт розширення рядів 1/cosh(t) = sech(t)(до n!)

f(n):=coeff(taylor(sech(x),x,0,n)*n!,x,n);

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




5

Perl 6 , 78 байт

{(->*@E {1-sum @E».&{$_*2**(@E-1-$++)*[*](@E-$++^..@E)/[*] 1..$++}}...*)[$_]}

Використовує итерационную формулу звідси :

En=1k=0n1[Ek2(n1k)(nk)]

Як це працює

Загальна структура - це лямбда, в якій генерується нескінченна послідовність, вираз, який викликається повторно, і отримує всі попередні значення послідовності в змінній @E, а потім ця послідовність індексується аргументом лямбда:

{ ( -> *@E {    } ... * )[$_] }

Вираз, викликаний для кожного кроку послідовності, є:

1 - sum @E».&{              # 1 - ∑
    $_                      # Eₙ
    * 2**(@E - 1 - $++)     # 2ⁿ⁻ˡ⁻ᵏ
    * [*](@E - $++ ^.. @E)  # (n-k-1)·...·(n-1)·n
    / [*] 1..$++            # 1·2·...·k
}


4

JavaScript (Node.js) , 46 45 байт

F=(a,b=a)=>a?(b+~a)*F(--a,b-2)+F(a,b)*++b:+!b

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

Дійсно для всіх значень (за потребою), але загалом не для (виводить для непарних с.) Код модифікується, щоб зменшити один байт, змінивши вихід на де визначено нижче. Зокрема, формула повторення для єEnF(n,i)F(n,i)nF(n,i)=(1)nF(n,i)FF

F(n,i)=(in1)F(n1,i2)+(i+1)F(n1,i)

JavaScript (Node.js) , 70 46 байт

F=(a,b=a)=>a?-F(--a,b)*++b+F(a,b-=3)*(a-b):+!b

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

З подивом не знайшов відповіді на JavaScript, тому спробую.

Код складається лише з базової математики, але математика за кодом вимагає обчислення. Формула рекурсії походить від розширення похідних різних порядків.sech(x)

Пояснення

Тут я використаю зручні позначення. Нехай і . Тоді маємоTn:=tanhn(t)Sn:=sechn(t)

dnSdtn=i=0nF(n,i)TniSi+1

Оскільки та , ми можемо зробити висновок, щоdTdt=S2dSdt=TS

ddt(TaSb)=aTa1(S2)(Sb)+bSb1(TS)(Ta)=aTa1Sb+2bTa+1Sb

Нехай і , ми можемо переписати відношення вище якb=i+1a=ni

ddt(TniSi+1)=(ni)Tni1Si+3(i+1)Tni+1Si+1=(ni)T(n+1)(i+2)S(i+2)+1(i+1)T(n+1)iSi+1

Тобто сприяє як і . В результаті ми можемо записати через і :F(n,i)F(n+1,i+2)F(n+1,i)F(n,i)F(n1,i2)F(n1,i)

F(n,i)=(ni+1)F(n1,i2)(i+1)F(n1,i)

з початковою умовою і де .F(0,0)=1F(0,i)=0i0

Пов'язана частина коду a?-F(--a,b)*++b+F(a,b-=3)*(a-b):+!bточно розраховується за допомогою наведеної вище формули повторення. Ось поділка:

-F(--a,b)                // -F(n-1, i)                  [ a = n-1, b = i   ]
*++b                     // *(i+1)                      [ a = n-1, b = i+1 ]
+F(a,b-=3)               // +F(n-1, i-2)                [ a = n-1, b = i-2 ]
*(a-b)                   // *((n-1)-(i-2))              [ a = n-1, b = i-2 ]
                         // which is equivalent to *(n-i+1)

Оскільки і , дорівнює коефіцієнту при розширенні , яке .T(0)=0S(0)=1EnSn+1dnSdtnF(n,n)

Для гілок, яких ніколи не можна досягти, повторення завжди закінчуються на 0, тому де або непарне. Останнє, зокрема, означає, що для всіх непарних s. Якщо навіть s суворо більший за , повторення може врешті-решт дозволити статися в якийсь момент, але перед цим кроком він повинен досягти точки, де , і формула повторення показує, що значення повинно бути 0 у цій точці (оскільки перший доданок множимо на , а другий член - далі від "трикутника"F(0,0)F(n,i)=0i<0iEn=0nin0ini=n+1ni+1=n(n+1)+1=00in). У результаті де . Це завершує доведення достовірності алгоритму.F(n,i)=0i>n

Розширення

Код можна модифікувати для обчислення ще трьох споріднених послідовностей:

Дотичні числа (46 байт)

F=(a,b=a)=>a?F(--a,b)*++b+F(a,b-=3)*(a-b):+!~b

Секретні числа (45 байт)

F=(a,b=a)=>a?F(--a,b)*++b+F(a,b-=3)*(a-b):+!b

Зігзагові цифри Ейлера (48 байт)

F=(a,b=a)=>a?F(--a,b)*++b+F(a,b-=3)*(a-b):!b+!~b

3

Befunge, 115 байт

Це просто підтримує твердо кодований набір перших 16 чисел Ейлера (тобто E 0 - E 15 ). Все, що перевищує це, ніяк не впишеться у 32-бітове значення Befunge.

&:2%v
v@.0_2/:
_1.@v:-1
v:-1_1-.@
_5.@v:-1
v:-1_"="-.@
_"}$#"*+.@v:-1
8**-.@v:-1_"'PO"
"0h;"3_"A+y^"9*+**.@.-*8+*:*

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

Я також здійснив повну реалізацію формули, поданої в виклику, але вона майже вдвічі менша, і вона все ще обмежена першими 16 значеннями в TIO, хоча це 64-бітний інтерпретатор.

<v0p00+1&
v>1:>10p\00:>20p\>010g20g2*-00g1>-:30pv>\:
_$12 0g2%2*-*10g20g110g20g-240pv^1g03:_^*
>-#1:_!>\#<:#*_$40g:1-40p!#v_*\>0\0
@.$_^#`g00:<|!`g01::+1\+*/\<
+4%1-*/+\2+^>$$10g::2>\#<1#*-#2:#\_$*\1

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

Проблема цього алгоритму полягає в тому, що проміжні значення в ряді переповнюються набагато швидше, ніж загальні. У 32-розрядному інтерпретаторі він може обробляти лише перші 10 значень (тобто E 0 до E 9 ). Перекладачі, які використовують bіnum, повинні робити набагато краще - PyFunge та Befungee могли працювати як мінімум до E 30 .


1

Python2, (симпатія раціональна), 153 байти

from sympy import *
t=n+2 
print n,re(Add(*map(lambda (k,j):I**(k-2*j-1)*(k-2*j)**(n+1)*binomial(k,j)/(k*2**k),[(c/t+1,c%t) for c in range(0,t**2-t)])))

Це дуже неоптимально, але він намагається використовувати основні функції симпатії та уникати плаваючої точки. Дякую @Mego, що встановив мене прямо за первісною формулою, переліченою вище. Я спробував використати щось на кшталт @ xnor "поєднати дві петлі" з Поради щодо гольфу в Python


1
Ви можете import*(видалити пробіл між ними), щоб зберегти байт. Крім того, вам потрібно якось прийняти число як вхід (фрагменти, які передбачають, що вхід є змінною, не дозволяється).
FlipTack

1

CJam (34 байти)

{1a{_W%_,,.*0+(+W%\_,,:~.*.+}@*W=}

Демонстрація в Інтернеті, яка друкує E (0) до E (19). Це анонімний блок (функція).

Реалізація запозичує повторення Shieru Akasoto і переписує його в більш зручному стилі CJam, маніпулюючи цілими рядами за один раз.

Розсічення

{           e# Define a block
  1a        e#   Start with row 0: [1]
  {         e#   Loop...
    _W%     e#     Take a copy and reverse it
    _,,.*   e#     Multiply each element by its position
    0+(+    e#     Pop the 0 from the start and add two 0s to the end
    W%      e#     Reverse again, giving [0 0 (i-1)a_0 (i-2)a_1 ... a_{i-2}]
    \       e#     Go back to the other copy
    _,,:~.* e#     Multiply each element by -1 ... -i
    .+      e#     Add the two arrays
  }         e#
  @*        e#   Bring the input to the top to control the loop count
  W=        e#   Take the last element
}


0

Аксіома, 5 байт

euler

для OEIS A122045; це 57 байт

g(n:NNI):INT==factorial(n)*coefficient(taylor(sech(x)),n)

код тесту та результати

(102) -> [[i,g(i)] for i in [0,1,2,3,6,10,20]]
   (102)
   [[0,1],[1,0],[2,- 1],[3,0],[6,- 61],[10,- 50521],[20,370371188237525]]

(103) -> [[i,euler(i)] for i in [0,1,2,3,6,10,20]]
   (103)
   [[0,1],[1,0],[2,- 1],[3,0],[6,- 61],[10,- 50521],[20,370371188237525]]

0

APL (NARS), 42 символи, 84 байти

E←{0≥w←⍵:1⋄1-+/{(⍵!w)×(2*w-1+⍵)×E⍵}¨¯1+⍳⍵}

Дотримуйтесь формули, показаної з "smls", тестуйте:

  E 0
1
  E 1
0
  E 3
0
  E 6
¯61
  E 10
¯50521

останній випадок повертає один великий раціональний результат, тому що я вводя 20x (великий раціональний 20/1), а не 20, як я думаю, 20.0 плаває 64 біт ...

  E 20x
370371188237525 

Було б швидше, якщо один повернеться 0, але буде трохи довше (50 символів):

  E←{0≥w←⍵:1⋄0≠2∣w:0⋄1-+/{(⍵!w)×(2*w-1+⍵)×E⍵}¨¯1+⍳⍵}
  E 30x
¯441543893249023104553682821 

було б швидше, якби було використане визначення, про яке йдеться (і було б трохи довше 75 символів):

  f←{0≥⍵:1⋄0≠2∣⍵:0⋄0J1×+/{+/⍵{⍺÷⍨(0J2*-⍺)×(⍵!⍺)×(¯1*⍵)×(⍺-2×⍵)*n}¨0..⍵}¨⍳n←1+⍵}
  f 0
1
  f 1
0
  f 3
0
  f 6
¯61J0 
  f 10
¯50521J¯8.890242766E¯9 
  f 10x
¯50521J0 
  f 20x
370371188237525J0 
  f 30x
¯441543893249023104553682821J0 
  f 40x
14851150718114980017877156781405826684425J0 
  f 400x
290652112822334583927483864434329346014178100708615375725038705263971249271772421890927613982905400870578615922728
  107805634246727371465484012302031163270328101126797841939707163099497536820702479746686714267778811263343861
  344990648676537202541289333151841575657340742634189439612727396128265918519683720901279100496205972446809988
  880945212776281115581267184426274778988681851866851641727953206090552901049158520028722201942987653512716826
  524150450130141785716436856286094614730637618087804268356432570627536028770886829651448516666994497921751407
  121752827492669601130599340120509192817404674513170334607613808215971646794552204048850269569900253391449524
  735072587185797183507854751762384660697046224773187826603393443429017928197076520780169871299768968112010396
  81980247383801787585348828625J0 

Результат над ним - це одне складне число, яке має лише реальну частину.

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