CJam (69 байт)
]qi:X,{1e|,:):N{N\f{1$%!*}W$.*:+}%1$W%.*:+N,/+}/W\+_1,*X=\_W%.*:+-Y/z
Демонстрація в Інтернеті
Пояснення
Основна ідея - реалізувати формуючу функцію, описану в OEIS. Вхід - це жахливий особливий випадок, але остаточні зміни, які я зробив, у результаті вийшли - 1 для цього випадку, тому z (для абсолютного значення) виправляє його. Ось найдивніший трюк тут.0−1z
.*:+
повторюється три рази, і схоже, що він міг би зберегти байт, якщо вилучити як {.*:+}:F~
. Однак це розривається зі спеціальним випадком , оскільки він зовсім не виконує зовнішню петлю.0
Ми використовуємо функцію допоміжної генерації для A000081 , умови якої мають повторення
a[0] = 0
a[1] = 1
For n >= 1, a[n+1] = (sum_{k=1}^n a[n-k+1] * sum_{d|k} d * a[d]) / n
Я впевнений, що деякі мови мають вбудовані зміни для зворотного перетворення Мебіуса , але CJam цього не робить; найкращий підхід, який я знайшов, - це створити відображення масиву d до, а потім зробити точне множення за допомогою . Зверніть увагу , що тут зручно збудували починаючи з індексу 1, тому що ми хочемо , щоб уникнути поділу на нуль при налаштуванні ваг. Зауважимо також, що якщо два масиви, що подаються на точкову операцію, не мають однакової довжини, то значення довшого з них залишаються недоторканими: тому ми повинні або брати перший k умови∑d∣kd×a[d]dk % d == 0 ? d : 0
a.*
ak або змусити масив ваг підійти до n . Останнє здається коротшим. Отож, це обернене перетворення МебіусаanN\f{1$%!*}W$.*:+
Якщо ми називаємо результат зворотного перетворення Мебіуса M
, ми тепер маємо
a[n+1]=1n∑k=1na[n−k+1]×M[k]
aM1nn+1a
qi:X,{ ,:):N{N\f{1$%!*}W$.*:+}%1$W%.*:+N,/+}/
Точка функції допоміжної генерації задається розділом формули A000055:
G.f.: A(x) = 1 + T(x) - T^2(x)/2 + T(x^2)/2,
where T(x) = x + x^2 + 2*x^3 + ... is the g.f. for A000081.
a
[x=0]+a[x]+12(a[x/2]−∑i=0na[i]×a[n−i])
a[x/2]x1,*
X=
0\+
a [ 0 ] = 0Х= 0W\+
- 2 a [ x ] + ∑нi = 0a [ i ] × a [ n - i ]2a [ x ]
Отже, ми пояснили
qi:X,{ ,:):N{N\f{1$%!*}W$.*:+}%1$W%.*:+N,/+}/W\+_1,*X=\_W%.*:+-Y/
1]
N= 1
1]qi:X,1>{ ... }/
Х= 0а[-1 1]
0[ x = 0 ]X!+
1e|
а1N= 0
]qi:X,{ ... /+}/
очевидно дає поділ на нуль. Але якщо ми спробуємо
]qi:X,{1e| ... /+}/
тоді це працює. Ми отримуємо
e# Stack: [] 0
1e| e# Stack: [] 1
,:):N e# Stack: [] [1]
{ e# We only execute this loop once
N\f{1$%!*} e# 1 divides 1, so stack: [] [1]
W$.* e# Remember: if the two arrays supplied to the pointwise operation
e# are not the same length then the values from the longer one are
e# left untouched. Stack: [] [1]
:+ e# Fold over a singleton. Stack: [] 1
}% e# And that was a map, so stack: [] [1]
1$W%.*:+ e# Another [1] [] .*:+, giving the same result: 1
N,/ e# 1 / 1 = 1
+ e# And we append 1 to a giving [1]
що виробляє саме те значення, яке нам потрібно.
Х= 0- 1[-1]
( - 1 - 12( - 1 × - 1 ) ) = - 101−11z