Я не уверен, что это то, что вы имели в виду, но вы могли бы сделать что-то вроде
Binet[ker_List, init_List] :=
Module[{charp, roots, polynomials, coeffs, base, p},
roots = Tally[
N@Eigenvalues[
PadLeft[Append[IdentityMatrix[Length[ker] - 1], Reverse[ker]]]]];
coeffs = Table[p[i, j], {i, Length[roots]}, {j, roots[[i, 2]]}];
polynomials =
Table[(Evaluate[i.#^Range[0, Length[i] - 1]]) &, {i, coeffs}];
base = roots[[All, 1]];
{polynomials /.
Solve[Table[
Through[polynomials[n]].base^n == init[[n + 1]], {n, 0,
Length[init] - 1}], Flatten[coeffs]][[1]], base}]
Тогда для линейного повторения kernel
и начальных значений init
, Binet[kernel, init]
возвращает два списка.Первый содержит многочлены, а второй - корни характеристического многочлена.n
-ая запись в таблице повторений будет равна a[kernel, init][n]
с
a[kernel_, init_] := Evaluate@Module[{p, b},
{p, b} = Binet[kernel, init];
Through[p[#]].b^#] &
Так, например, для последовательности Фибоначчи вы получите
kernel = {1, 1};
init = {1, 1};
{p, b} = Binet[kernel, init]
(* ==> {{0.723607 &, 0.276393 &}, {1.61803, -0.618034}} *)
With[{sol = a[{1, 1}, {1, 1}]},
Table[Chop@sol[n], {n, 0, 10}]];
(* ==> {1., 1., 2., 3., 5., 8., 13., 21., 34., 55., 89.} *)