簡體   English   中英

如何計算寫成乘積的數學家的冪和?

[英]How to calculate Mathologer's power sums written as products?

我是一個沒有 sympy 經驗的 Python 程序員 - 只是為了好玩。 我正在嘗試生成整數冪和的公式,如最新的數學家視頻(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)      

Output (注意;必須用 ^ 替換雙 *):

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]])

這是做你想做的嗎?

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                 ⎦

請注意,作為替代方案,要檢查 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]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM