F=(a,b=a)=>a?(b+~a)*F(--a,b-2)+F(a,b)*++b:+!b
Попробуйте онлайн!
Действителен для всех значений (как требуется), но не для целом (выводит для нечетных s.) Код модифицируется для уменьшения одного байта путем изменения вывода на где определено, как показано ниже. В частности, формула повторения для имеет видEnF(n,i)−F(n,i)nF′(n,i)=(−1)nF(n,i)FF′F′(n,i)=(i−n−1)F′(n−1,i−2)+(i+1)F′(n−1,i)
F=(a,b=a)=>a?-F(--a,b)*++b+F(a,b-=3)*(a-b):+!b
Попробуйте онлайн!
Удивлен, пока не нашел ответ на JavaScript, так что я попробую.
Код состоит только из базовой математики, но математика, стоящая за кодом, требует исчисления. Формула рекурсии получается из разложения производных от разных порядков.sech(x)
объяснение
Здесь я буду использовать некоторые удобные обозначения. Пусть и . Тогда у нас естьTn:=tanhn(t)Sn:=sechn(t)
dnSdtn=∑i=0nF(n,i)Tn−iSi+1
Поскольку и , мы можем сделать вывод, чтоdTdt=S2dSdt=−TS
ddt(TaSb)=aTa−1(S2)(Sb)+bSb−1(−TS)(Ta)=aTa−1Sb+2−bTa+1Sb
Пусть и , мы можем переписать вышеприведенное соотношение какb=i+1a=n−i
ddt(Tn−iSi+1)=(n−i)Tn−i−1Si+3−(i+1)Tn−i+1Si+1=(n−i)T(n+1)−(i+2)S(i+2)+1−(i+1)T(n+1)−iSi+1
То есть вносит вклад как в и в . В результате мы можем написать в терминах и :F(n,i)F(n+1,i+2)F(n+1,i)F(n,i)F(n−1,i−2)F(n−1,i)
F(n,i)=(n−i+1)F(n−1,i−2)−(i+1)F(n−1,i)
с начальным условием и где .F(0,0)=1F(0,i)=0i≠0
Связанная часть кода a?-F(--a,b)*++b+F(a,b-=3)*(a-b):+!b
точно рассчитывается с использованием приведенной выше формулы повторения. Вот разбивка:
-F(--a,b) // -F(n-1, i) [ a = n-1, b = i ]
*++b // *(i+1) [ a = n-1, b = i+1 ]
+F(a,b-=3) // +F(n-1, i-2) [ a = n-1, b = i-2 ]
*(a-b) // *((n-1)-(i-2)) [ a = n-1, b = i-2 ]
// which is equivalent to *(n-i+1)
Поскольку и , равен коэффициенту в разложении , то есть .T(0)=0S(0)=1EnSn+1dnSdtnF(n,n)
Для ветвей, которые никогда не могут быть достигнуты, повторения всегда заканчиваются на 0, поэтому где или нечетно. Последнее, в частности, подразумевает, что для всех нечетных s. Даже если строго больше , повторение может в конечном итоге позволить произойти в некоторой точке, но перед этим шагом оно должно достичь точки, где , а формула повторения показывает, что значение должно быть 0 в этой точке (поскольку первое слагаемое умножается на , а второе слагаемое находится дальше от "треугольника"F(0,0)F(n,i)=0i<0iEn=0nin0≤i≤ni=n+1n−i+1=n−(n+1)+1=00≤i≤n). В результате где . Это завершает доказательство правильности алгоритма.F(n,i)=0i>n
расширения
Код может быть изменен для вычисления еще трех связанных последовательностей:
Касательные числа (46 байтов)
F=(a,b=a)=>a?F(--a,b)*++b+F(a,b-=3)*(a-b):+!~b
Secant Numbers (45 байтов)
F=(a,b=a)=>a?F(--a,b)*++b+F(a,b-=3)*(a-b):+!b
Зигзагообразные числа Эйлера (48 байт)
F=(a,b=a)=>a?F(--a,b)*++b+F(a,b-=3)*(a-b):!b+!~b
-i/2
, которые выдают-i
при добавлении. Умножьте это наi
сумму суммирования, и вы получите1
.