我是一个没有Python经验的Python新手,只是为了好玩。我正在尝试生成最新的Mathologer视频(Power Sums)中所述的整数幂和的公式。下面的程序生成随后的方程组。虽然正确,但我希望在适当的情况下考虑分子中的多项式,并实际求和各个项(即,一个公分母)。我尝试了很多“简化程序”,但似乎没有任何效果。有什么想法吗?
程序:
from sympy import S, Matrix, Symbol, simplify, pprint
import math
def bn(n, k):
sign = n%2+k%2 # used to negate odd (0 based) diagonals
n = n+1 # shift triangle up and left
bc = math.factorial(n)//math.factorial(k)//math.factorial(n-k)
if sign == 1: bc = -bc
return bc
if __name__ == "__main__":
N = 5
n = Symbol('n')
v = Matrix([n**i for i in range(1,N+1)])
M = [[bn(i,k) for k in range(0,i+1)]+(N-i-1)*[S(0)] for i in range(0,N)]
eqs = simplify(Matrix(M).inv()*v)
print(eqs.__repr__())
# pprint(eqs, use_unicode=True)
输出(注意;必须用^代替双*):
Matrix([[ n],
[ n*(n + 1)/2],
[ n*(2*n^2 + 3*n + 1)/6],
[ n^2*(n^2 + 2*n + 1)/4],
[n^5/5 + n^4/2 + n^3/3 - n/30]])
答案 0 :(得分:1)
这是您想要的吗?
In [8]: eqs.applyfunc(factor)
Out[8]:
⎡ n ⎤
⎢ ⎥
⎢ n⋅(n + 1) ⎥
⎢ ───────── ⎥
⎢ 2 ⎥
⎢ ⎥
⎢ n⋅(n + 1)⋅(2⋅n + 1) ⎥
⎢ ─────────────────── ⎥
⎢ 6 ⎥
⎢ ⎥
⎢ 2 2 ⎥
⎢ n ⋅(n + 1) ⎥
⎢ ─────────── ⎥
⎢ 4 ⎥
⎢ ⎥
⎢ ⎛ 2 ⎞⎥
⎢n⋅(n + 1)⋅(2⋅n + 1)⋅⎝3⋅n + 3⋅n - 1⎠⎥
⎢────────────────────────────────────⎥
⎣ 30 ⎦
答案 1 :(得分:0)
请注意,作为替代方法,要检查Mathologer公式,您还可以将这些总和计算为:
from sympy import symbols, Sum, factor, expand, Poly
j, n = symbols("j n", integer=True, positive=True)
for k in range(11):
print(k, ":", factor(Sum(j**k, (j, 1, n)).doit()))
给予:
0 : n
1 : n*(n + 1)/2
2 : n*(n + 1)*(2*n + 1)/6
3 : n**2*(n + 1)**2/4
4 : n*(n + 1)*(2*n + 1)*(3*n**2 + 3*n - 1)/30
5 : n**2*(n + 1)**2*(2*n**2 + 2*n - 1)/12
6 : n*(n + 1)*(2*n + 1)*(3*n**4 + 6*n**3 - 3*n + 1)/42
7 : n**2*(n + 1)**2*(3*n**4 + 6*n**3 - n**2 - 4*n + 2)/24
8 : n*(n + 1)*(2*n + 1)*(5*n**6 + 15*n**5 + 5*n**4 - 15*n**3 - n**2 + 9*n - 3)/90
9 : n**2*(n + 1)**2*(n**2 + n - 1)*(2*n**4 + 4*n**3 - n**2 - 3*n + 3)/20
10 : n*(n + 1)*(2*n + 1)*(n**2 + n - 1)*(3*n**6 + 9*n**5 + 2*n**4 - 11*n**3 + 3*n**2 + 10*n - 5)/66
如果将factor()
替换为expand()
,则会分离所有权力:
0 : n
1 : n**2/2 + n/2
2 : n**3/3 + n**2/2 + n/6
3 : n**4/4 + n**3/2 + n**2/4
4 : n**5/5 + n**4/2 + n**3/3 - n/30
5 : n**6/6 + n**5/2 + 5*n**4/12 - n**2/12
6 : n**7/7 + n**6/2 + n**5/2 - n**3/6 + n/42
7 : n**8/8 + n**7/2 + 7*n**6/12 - 7*n**4/24 + n**2/12
8 : n**9/9 + n**8/2 + 2*n**7/3 - 7*n**5/15 + 2*n**3/9 - n/30
9 : n**10/10 + n**9/2 + 3*n**8/4 - 7*n**6/10 + n**4/2 - 3*n**2/20
10 : n**11/11 + n**10/2 + 5*n**9/6 - n**7 + n**5 - n**3/2 + 5*n/66
使用Poly(Sum(j**k, (j, 1, n)).doit()).all_coeffs()
,您可以获得系数:
0 : [1, 0]
1 : [1/2, 1/2, 0]
2 : [1/3, 1/2, 1/6, 0]
3 : [1/4, 1/2, 1/4, 0, 0]
4 : [1/5, 1/2, 1/3, 0, -1/30, 0]
5 : [1/6, 1/2, 5/12, 0, -1/12, 0, 0]
6 : [1/7, 1/2, 1/2, 0, -1/6, 0, 1/42, 0]
7 : [1/8, 1/2, 7/12, 0, -7/24, 0, 1/12, 0, 0]
8 : [1/9, 1/2, 2/3, 0, -7/15, 0, 2/9, 0, -1/30, 0]
9 : [1/10, 1/2, 3/4, 0, -7/10, 0, 1/2, 0, -3/20, 0, 0]
10 : [1/11, 1/2, 5/6, 0, -1, 0, 1, 0, -1/2, 0, 5/66, 0]