Реализации алгоритмов/Числа Эйлера первого рода: различия между версиями
Содержимое удалено Содержимое добавлено
м Ivan Shmakov переименовал страницу Программное вычисление чисел Эйлера первого рода в Реализации алгоритмов/Числа Эйлера первого рода: С… |
Использован {{BookCat}}; пробелы; →К переименованию: снят шаблон после переименования. |
||
Строка 1: | Строка 1: | ||
{{К переименованию |2014-11-21|Реализации алгоритмов/Числа Эйлера первого рода}} |
|||
== [[w:en:PARI/GP|PARI/GP]] == |
== [[w:en:PARI/GP|PARI/GP]] == |
||
<source lang="text"> |
<source lang="text"> |
||
\\ рекуррентная формула |
\\ рекуррентная формула |
||
{ E(n, k) = |
{ E(n, k) = |
||
if(k<1 || k>n, 0, |
if(k<1 || k>n, 0, |
||
if(n==1, 1, k*E(n-1,k) + (n-k+1)*E(n-1,k-1) ); |
if(n==1, 1, k*E(n-1,k) + (n-k+1)*E(n-1,k-1) ); |
||
) |
) |
||
} |
} |
||
\\ явная формула |
\\ явная формула |
||
{ E(n, k) = sum(j=0, k, (-1)^j * (k-j)^n * binomial(n+1,j) ) } |
{ E(n, k) = sum(j=0, k, (-1)^j * (k-j)^n * binomial(n+1,j) ) } |
||
Строка 27: | Строка 25: | ||
def table(f, n): |
def table(f, n): |
||
return [[f(i, j) for j in range(n)] for i in range(n)] |
return [[f(i, j) for j in range(n)] for i in range(n)] |
||
def format(table): |
def format(table): |
||
return "\n".join([" ".join(["%6s" % col for col in row]) for row in table]) |
return "\n".join([" ".join(["%6s" % col for col in row]) for row in table]) |
||
Строка 53: | Строка 51: | ||
return sum([binomial(n+1, j) * (-1)**j * (k-j)**n for j in range(k)]) |
return sum([binomial(n+1, j) * (-1)**j * (k-j)**n for j in range(k)]) |
||
# демонстрация работы |
# демонстрация работы |
||
print(format(table(euler_rec, 10))) |
print(format(table(euler_rec, 10))) |
||
print(format(table(euler_iter, 10))) |
print(format(table(euler_iter, 10))) |
||
Строка 71: | Строка 69: | ||
</source> |
</source> |
||
{{BookCat}} |
|||
[[Категория:Программирование]] |
Версия от 12:40, 7 декабря 2014
PARI/GP
\\ рекуррентная формула
{ E(n, k) =
if(k<1 || k>n, 0,
if(n==1, 1, k*E(n-1,k) + (n-k+1)*E(n-1,k-1) );
)
}
\\ явная формула
{ E(n, k) = sum(j=0, k, (-1)^j * (k-j)^n * binomial(n+1,j) ) }
Python
from math import factorial
# вспомогательные функции
def binomial(n, k):
if n >= k:
return factorial(n) / (factorial(k) * factorial(n-k))
else:
return 0
def table(f, n):
return [[f(i, j) for j in range(n)] for i in range(n)]
def format(table):
return "\n".join([" ".join(["%6s" % col for col in row]) for row in table])
# рекуррентная формула
def euler_rec(n, k):
if k<1:
return 0
elif k>n:
return 0
elif n==1:
return 1
else:
return k * euler_rec(n-1, k) + (n-k+1) * euler_rec(n-1, k-1)
# явная формула
def euler_iter(n, k):
if k<1:
return 0
elif k>n:
return 0
elif n==1:
return 1
else:
return sum([binomial(n+1, j) * (-1)**j * (k-j)**n for j in range(k)])
# демонстрация работы
print(format(table(euler_rec, 10)))
print(format(table(euler_iter, 10)))
"""
0 0 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0 0
0 1 1 0 0 0 0 0 0 0
0 1 4 1 0 0 0 0 0 0
0 1 11 11 1 0 0 0 0 0
0 1 26 66 26 1 0 0 0 0
0 1 57 302 302 57 1 0 0 0
0 1 120 1191 2416 1191 120 1 0 0
0 1 247 4293 15619 15619 4293 247 1 0
0 1 502 14608 88234 156190 88234 14608 502 1
"""