CJam (69 byte)
]qi:X,{1e|,:):N{N\f{1$%!*}W$.*:+}%1$W%.*:+N,/+}/W\+_1,*X=\_W%.*:+-Y/z
Demo online
Spiegazione
L'idea di base è implementare la funzione di generazione descritta in OEIS. L'input è un brutto caso speciale, ma le ultime modifiche che ho apportato hanno finito per produrre per quel caso, quindi (per valore assoluto) lo riordina. Questo è il trucco più strano qui.0- 1z
.*:+
viene ripetuto tre volte e sembra che potrebbe salvare un byte se estratto come {.*:+}:F~
. Tuttavia, questo si interrompe con il caso speciale , perché non esegue affatto il ciclo esterno.0
Usiamo la funzione di generazione ausiliaria per A000081 , i cui termini hanno la ricorrenza
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
Sono sicuro che alcune lingue hanno incorporato la trasformazione inversa di Möbius , ma CJam no; l'approccio migliore che ho trovato è quello di costruire una matrice mappatura a e poi fare una moltiplicazione puntuale con utilizzo . Si noti che qui è conveniente avere inizio a partire dall'indice 1, perché vogliamo evitare la divisione per zero durante l'impostazione dei pesi. Si noti inoltre che se i due array forniti all'operazione puntuale non hanno la stessa lunghezza, i valori di quello più lungo non vengono toccati: pertanto dobbiamo prendere i primi termini di o far salire l'array di pesi fino aΣd∣ kd× a [ d]dk % d == 0 ? d : 0
un'.*
un'Kun'n. Quest'ultimo sembra più breve. Quindi questa inversa trasformazione di Möbius rappresentaN\f{1$%!*}W$.*:+
Se chiamiamo il risultato della trasformazione inversa di Möbius M
, ora abbiamo
a [ n + 1 ] = 1nΣk = 1na [ n - k + 1 ] × M[ k ]
Il numeratore è ovviamente un termine di una convoluzione, quindi possiamo gestirlo invertendo una copia di o e quindi prendendo una moltiplicazione e una somma puntuali. Ancora una volta, il nostro indice varia da a , e inoltre vogliamo accoppiare gli indici che si sommano a , quindi è di nuovo conveniente indicizzare da 1 anziché a 0. Ora abbiamo consideratoun'M1nn + 1un'
qi:X,{ ,:):N{N\f{1$%!*}W$.*:+}%1$W%.*:+N,/+}/
Il punto della funzione di generazione ausiliaria è dato dalla sezione formula di 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.
un'
[ 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 ]
Quindi abbiamo spiegato
qi:X,{ ,:):N{N\f{1$%!*}W$.*:+}%1$W%.*:+N,/+}/W\+_1,*X=\_W%.*:+-Y/
1]
N= 1
1]qi:X,1>{ ... }/
X= 0un'[-1 1]
0[ x = 0 ]X!+
1e|
un'1N= 0
]qi:X,{ ... /+}/
ovviamente dà divisione per zero. Ma se ci proviamo
]qi:X,{1e| ... /+}/
allora funziona. Noi abbiamo
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]
che produce esattamente il valore richiesto.
X= 0- 1[-1]
( - 1 - 12( - 1 × - 1 ) ) = - 101- 11z