CJam (69 octets)
]qi:X,{1e|,:):N{N\f{1$%!*}W$.*:+}%1$W%.*:+N,/+}/W\+_1,*X=\_W%.*:+-Y/z
Démo en ligne
Explication
L'idée de base est de mettre en œuvre la fonction de génération décrite dans OEIS. L'entrée est un cas spécial désagréable, mais les derniers ajustements que j'ai faits ont fini par produire - 1 pour ce cas, donc le z0- 1z (pour la valeur absolue) le range. C'est l'astuce la plus étrange ici.
.*:+
est répété trois fois et semble pouvoir sauver un octet s'il est extrait en tant que {.*:+}:F~
. Cependant, cela rompt avec le cas spécial , car il n'exécute pas du tout la boucle externe.0
Nous utilisons la fonction de génération auxiliaire pour A000081 , dont les termes ont la récurrence
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
Je suis sûr que certaines langues ont des fonctions intégrées pour la transformée de Möbius inverse , mais CJam ne le fait pas; la meilleure approche que j'ai trouvé est de construire une cartographie de tableau d à puis faire une multiplication ponctuelle avec un∑ré∣ kré× a [ d]rék % d == 0 ? d : 0
a utilisant .*
. Notez qu'ici, il est pratique d'avoir construit départ à l'index 1, car nous voulons éviter la division par zéro lors de la configuration des poids. Notez également que si les deux tableaux fournis pour l'opération point par point ne sont pas de la même longueur, alors les valeurs de la plus longue restent inchangées: nous devons donc soit prendre le premier kak termes de ou faire monter le tableau de poids jusqu'à n . Ce dernier semble plus court. Donc, cette transformation de Möbius inverse représenteanN\f{1$%!*}W$.*:+
Si nous appelons le résultat de la transformée de Möbius inverse M
, nous avons maintenant
a[n+1]=1n∑k=1na[n−k+1]×M[k]
aM1nn+1a
qi:X,{ ,:):N{N\f{1$%!*}W$.*:+}%1$W%.*:+N,/+}/
Le point de la fonction de génération auxiliaire est donné par la section de formule de 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\+
- 2 a [ x ] + ∑ni = 0a [ i ] × a [ n - i ]2un [ x ]
Nous avons donc expliqué
qi:X,{ ,:):N{N\f{1$%!*}W$.*:+}%1$W%.*:+N,/+}/W\+_1,*X=\_W%.*:+-Y/
1]
N= 1
1]qi:X,1>{ ... }/
X= 0une[-1 1]
0[ X = 0 ]X!+
1e|
.
une1N= 0
]qi:X,{ ... /+}/
donne évidemment la division par zéro. Mais si nous essayons
]qi:X,{1e| ... /+}/
alors ça marche. On a
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]
qui produit exactement la valeur dont nous avons besoin.
X= 0- 1[-1]
( - 1 - 12( - 1 × - 1 ) ) = - 101- 11z