CJam (69 bayt)
]qi:X,{1e|,:):N{N\f{1$%!*}W$.*:+}%1$W%.*:+N,/+}/W\+_1,*X=\_W%.*:+-Y/z
Çevrimiçi demo
açıklama
Temel fikir OEIS'te açıklanan üretme fonksiyonunu uygulamaktır. Giriş kötü bir özel durum, ama yaptığım son tweaks sonuçlandı - bu durumda 1 - böylece z (mutlak değer için) onu düzenler. Buradaki en tuhaf numara bu.0- 1z
.*:+
üç kez tekrarlanır ve ayıklanırsa bir bayt kaydedebilir gibi görünür {.*:+}:F~
. Ancak, bu dış durum ile kesilir , çünkü dış döngüyü hiç yürütmez.0
Terimleri tekrar eden A000081 için yardımcı oluşturma işlevini kullanıyoruz
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
Eminim bazı diller ters Möbius dönüşümü için yerleşiktir , ama CJam değil; bulduğum en iyi yaklaşım d ile bir dizi eşleme oluşturmak ve daha sonra bir kullanarak noktaya çarpma yapmaktır . Burada , indeks 1'de bir başlangıç oluşturmanın uygun olduğunu unutmayın , çünkü ağırlıkları ayarlarken sıfıra bölmekten kaçınmak istiyoruz. Ayrıca, noktalama işlemine sağlanan iki dizi aynı uzunlukta değilse, daha uzun olan değerlere dokunulmadan bırakıldığını unutmayın: bu nedenle, ya ilk k terimleriniΣd∣ kd× a [ d]dk % d == 0 ? d : 0
bir.*
birk veya ağırlık dizisini n'ye yükseltir . İkincisi daha kısa görünüyor. Yani bu ters Möbius dönüşümübirnN\f{1$%!*}W$.*:+
Biz Möbiüs dönüşümü, ters sonucu çağrı durumunda M
, şu an sahip
a [ n + 1 ] = 1nΣk = 1na [ n - k + 1 ] × M[ k ]
Pay, açık bir şekilde bir evrişimden geçen bir terimdir, bu nedenle veya M'nin bir kopyasını tersine çevirip daha sonra noktasal bir çarpma ve toplama yaparak bunu halledebiliriz . Yine, bizim endeks değişir 1'e kadar n ve ek olarak biz hangi toplamı endekslerini yukarı eşleştirmek istediğiniz n + 1 endeksin tekrar uygundur, böylece a Şimdi sorumluydu ettik 1 yerine 0 danbirM1nn + 1bir
qi:X,{ ,:):N{N\f{1$%!*}W$.*:+}%1$W%.*:+N,/+}/
Yardımcı üretme fonksiyonunun noktası A000055'in formül bölümü tarafından verilir:
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çısından biz aramak çıkışı, bu araç olduğu [ X = 0 ] + a [ x ] + 1bir
[ x = 0 ] + a [ x ] + 12( a [ x / 2 ] - ∑i = 0na [ i ] × a [ n - i ] )
a [ x / 2 ]x1,*
X=
0\+
a [ 0 ] = 0X= 0W\+
- 2 a [ x ] + ∑ni = 0a [ i ] × a [ n - i ]2a [ x ]
Bu yüzden açıkladık
qi:X,{ ,:):N{N\f{1$%!*}W$.*:+}%1$W%.*:+N,/+}/W\+_1,*X=\_W%.*:+-Y/
1]
N-= 1
1]qi:X,1>{ ... }/
X= 0bir[-1 1]
0[ x = 0 ]X!+
1e|
bir1N-= 0
]qi:X,{ ... /+}/
açıkça sıfıra bölme verir. Ama denersek
]qi:X,{1e| ... /+}/
sonra çalışır. Biz olsun
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]
tam da ihtiyacımız olan değeri üretir.
X= 0- 1[-1]
( - 1 - 12( - 1 × - 1 ) ) = - 101- 11z