杨辉三角的运用-Ⅱ
上一篇,我们把杨辉三角所对应的 C m n C^{n}_{m} Cmn的连加展开式,通过一道题给出,现在我们继续利用杨辉三角求解另一个数学问题:如何求 ∑ i = 1 n \sum_{i=1}^{n} ∑i=1n i m i^m im,这用编程时很好解的,但是如何能提高运算速度呢?我们下面给出一种解法。
数学理论:
我们知道
(
n
+
1
)
m
−
n
m
(n+1)^m - n^m
(n+1)m−nm=
C
m
0
C^0_m
Cm0
n
0
n^0
n0+
C
m
1
C^1_m
Cm1
n
1
n^1
n1+
C
m
2
C^2_m
Cm2
n
2
n^2
n2+
…
\dots
…+
C
m
m
−
1
C^{m-1}_m
Cmm−1
n
m
−
1
n^{m-1}
nm−1,把n从1到n取一遍,我们可以得到如下的式子
(
k
+
1
)
m
(k+1)^m
(k+1)m-
k
m
k^m
km=
∑
i
=
0
m
−
1
\sum^{m-1}_{i=0}
∑i=0m−1
C
m
i
C^i_m
Cmi
k
i
k^i
ki
然后把k进行累加
∑
k
=
1
n
\sum^n_{k=1}
∑k=1n
(
(
k
+
1
)
m
−
k
m
)
((k+1)^m - k^m)
((k+1)m−km)=
∑
i
=
0
m
−
1
\sum^{m-1}_{i=0}
∑i=0m−1
C
m
i
C^i_m
Cmi
⋅
\cdot
⋅
∑
j
n
\sum^n_j
∑jn
j
i
j^i
ji。可以得到
(
n
+
1
)
m
−
1
(n+1)^m - 1
(n+1)m−1 =
∑
i
=
0
m
−
1
\sum^{m-1}_{i=0}
∑i=0m−1
C
m
i
C^i_m
Cmi
⋅
\cdot
⋅
∑
j
n
\sum^n_j
∑jn
j
i
j^i
ji,我们记
S
(
m
)
S(m)
S(m) =
∑
j
=
1
n
\sum^n_{j=1}
∑j=1n
j
m
j^m
jm,那么就简单了,
(
n
+
1
)
m
−
1
(n+1)^m - 1
(n+1)m−1 =
∑
i
=
0
m
−
1
\sum^{m-1}_{i=0}
∑i=0m−1
C
m
i
C^i_m
Cmi
S
(
i
)
S(i)
S(i),我们把m从1到m-1展开一下,可以得到:
(
n
+
1
)
k
−
1
(n+1)^k - 1
(n+1)k−1 =
∑
i
=
0
k
−
1
\sum^{k-1}_{i=0}
∑i=0k−1
C
k
i
C^i_k
Cki
S
(
i
)
S(i)
S(i),k从1到m可以列m个式子,如果把
S
(
m
)
S(m)
S(m) =
∑
j
=
1
n
\sum^n_{j=1}
∑j=1n
j
m
j^m
jm看成一个未知数,我们可以得到一个
m
×
m
m × m
m×m的一个矩阵,即
A
X
=
b
AX = b
AX=b的矩阵,如图:
学过线性代数的我们知道只要把A给求逆一下就能得到最后的答案,这里我们用
m
a
t
l
a
b
matlab
matlab进行求解,代码很简单如下:
format rat
a=input('Please input an integer');
b=a-1;
c=eye(a);
for i=1:a
c(i,1)=1;
end
for i=2:a
for j=1:i-1
d=1;
for l=i:-1:i-j+1
d=d*l;
end
e=1;
for k=1:j
e=e*k;
end
c(i,j+1)=d/e;
end
end
inv(c)
代码所生成的矩阵 A A A和上面我们讲的矩阵 A A A恰好是上下颠倒的,所以我们把 b b b也上下颠倒一下,一样可以求解这个问题。那么这个问题就解决了。接下来的操作就请客官自己做了。
(总算抽出时间把这个写一下啦)