Я бы хотел установить значение для DiscreteShift, которое изменяет правила для повышения до степени:
Unprotect[DiscreteShift];
DiscreteShift /: Power[DiscreteShift[f_, i_], r_] := DiscreteShift[f, {i, r}];
Protect[DiscreteShift];
Power[DiscreteShift[f[n], n], 2] === DiscreteShift[f[n], {n, 2}]
Но я получаю следующие сообщения об ошибках:
Rule::rhs: "Pattern i_ appears on the right-hand side of rule i_->1+i_. "
TagSetDelayed::tagnf: "Tag DiscreteShift not found in (1+Pattern[f_,_])^r_."
Кажется, ему не нравится шаблон для аргументов DiscreteShift, но я также не могу заставить что-то там работать. Как правильно написать это?
Edit:
Я постараюсь уточнить мою цель. Вот что я хочу сделать математически:
(N + n) f(n) = N f(n) + n f(n)
= f(n+1) + n f(n)
(N + n)^2 f(n) = (N^2 + Nn + nN + n^2) f(n)
= N^2 f(n) + Nn f(n) + nN f(n) + n^2 f(n)
= f(n+2) + (n+1) f(n+1) + n f(n+1) + n^2 f(n)
= f(n+2) + (2n+1) f(n+1) + n^2 f(n)
Итак, у меня есть этот забавный N-оператор, который действует как дискретный сдвиг, и мы как бы перегружаем смысл умножения, чтобы заставить его работать с функцией. Я надеялся представить N f(n)
, используя DiscreteShift[f[n],n]
, а затем исправляя правило мощности для него.