CJam (69 byte)
]qi:X,{1e|,:):N{N\f{1$%!*}W$.*:+}%1$W%.*:+N,/+}/W\+_1,*X=\_W%.*:+-Y/z
Demo online
Penjelasan
Ide dasarnya adalah untuk mengimplementasikan fungsi pembangkit yang dijelaskan dalam OEIS. Input adalah kasus khusus yang tidak menyenangkan, tetapi perubahan terakhir yang saya buat akhirnya menghasilkan - 1 untuk kasus itu, jadi z (untuk nilai absolut) merapikannya. Itu trik paling aneh di sini.0−1z
.*:+
diulang tiga kali, dan sepertinya itu bisa menghemat byte jika diekstraksi sebagai {.*:+}:F~
. Namun, ini rusak dengan case khusus , karena tidak menjalankan loop luar sama sekali.0
Kami menggunakan fungsi pembangkit tambahan untuk A000081 , yang istilahnya memiliki pengulangan
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
Saya yakin beberapa bahasa memiliki built-in untuk transformasi Möbius terbalik , tetapi CJam tidak; pendekatan terbaik yang pernah ditemukan adalah untuk membangun sebuah array pemetaan d untuk kemudian melakukan perkalian pointwise dengan sebuah menggunakan . Perhatikan bahwa di sini akan lebih mudah untuk telah membangun sebuah mulai dari indeks 1, karena kita ingin divisi menghindari dengan nol bila membuat bobot. Perhatikan juga bahwa jika dua array yang disuplai ke operasi pointwise tidak memiliki panjang yang sama maka nilai dari yang lebih panjang dibiarkan tidak tersentuh: oleh karena itu kita harus mengambil ketentuan k pertama dari∑d∣kd×a[d]dk % d == 0 ? d : 0
a.*
ak atau membuat array bobot naik ke n . Yang terakhir tampaknya lebih pendek. Jadi Möbius terbalik ini mengubah akun untukanN\f{1$%!*}W$.*:+
Jika kita menyebut hasil inverse Möbius transformasi M
, kita sekarang memiliki
a[n+1]=1n∑k=1na[n−k+1]×M[k]
aM1nn+1a
qi:X,{ ,:):N{N\f{1$%!*}W$.*:+}%1$W%.*:+N,/+}/
Titik fungsi pembangkit bantu diberikan oleh bagian rumus 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]=0X=0W\+
−2a[x]+∑ni=0a[i]×a[n−i]2a[x]
Jadi kami sudah menjelaskan
qi:X,{ ,:):N{N\f{1$%!*}W$.*:+}%1$W%.*:+N,/+}/W\+_1,*X=\_W%.*:+-Y/
1]
N=1
1]qi:X,1>{ ... }/
X=0a[-1 1]
0[x=0]X!+
1e|
a1N=0
]qi:X,{ ... /+}/
jelas memberikan pembagian dengan nol. Tetapi jika kita mencoba
]qi:X,{1e| ... /+}/
lalu bekerja. Kita mendapatkan
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]
yang menghasilkan persis nilai yang kami butuhkan.
X=0−1[-1]
(−1−12(−1×−1))=−101−11z