CJam(69バイト)
]qi:X,{1e|,:):N{N\f{1$%!*}W$.*:+}%1$W%.*:+N,/+}/W\+_1,*X=\_W%.*:+-Y/z
オンラインデモ
説明
基本的な考え方は、OEISで説明されている生成機能を実装することです。入力は厄介な特殊なケースですが、私が最後に微調整を行った結果、そのケースではが生成されるため、(絶対値)が整頓されます。それがここで最も奇妙なトリックです。− 1 z0− 1z
.*:+
は3回繰り返され、として抽出されると1バイト節約できるように見え{.*:+}: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にはありません。私が見つけた最良のアプローチは、をマッピングする配列を構築し、それからusingを使用して点ごとの乗算をことです。ここでは築いてきたために便利であることに注意してください、我々は重みを設定するときに、ゼロによる除算を避けたいので、インデックス1から始まるの。また、ポイントワイズ演算に指定された2つの配列が同じ長さでない場合、長い方の値はそのまま残されることに注意してください。したがって、最初の項を取るか、重みの配列をまで上げる必要があります。d a a k a n∑d∣ kd× a [ d]dk % d == 0 ? d : 0
a.*
akan。後者の方が短いようです。したがって、この逆メビウス変換は、N\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 ]バツ1,*
X=
0\+
a [ 0 ] = 0バツ= 0W\+
− 2 a [ x ] + ∑ni = 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>{ ... }/
X=0a[-1 1]
0[x=0]X!+
1e|
a1N=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]
必要な値を正確に生成します。
X=0−1[-1]
(−1−12(−1×−1))=−101−11z