Hamamatsu.rb #54 問題2 再回答
作成日 | : | 2015/07/11 |
---|---|---|
最終更新日 | : | 2020/07/09 |
Hamamatsu.rb #54 問題2 再回答
作成日 | : | 2015/07/11 |
---|---|---|
最終更新日 | : | 2020/07/09 |
概要
- Hamamatsu.rb #54のCodeKataKataの問題2を解き直しました。
問題2
問題
1段目は1×1個、2段目は2×2個のレンガを使い、200段のピラミッドを作るとき、 使われているレンガの数は全部で何個?
証明
まず、\(n\)段目は\(n\)個である場合について考える。変数を\(k\)とし任意の正整数を取る。このとき以下の数式に着目する。
\[
\begin{align*}
(k + 1)^2 & = k^2 + 2k + 1 \\
(k + 1)^2 - k^2 & = 2k + 1 \\
\end{align*}
\tag{1}
\]
式1.
両辺について\(k=1,2,3,...,n\)の場合の総和を取る。
\[
\sum_{k=1}^{n} (k + 1)^2 - \sum_{k=1}^{n} k^2 = \sum_{k=1}^{n} 2k + \sum_{k=1}^{n} 1
\tag{2}
\]
式2.
式2.について左辺を整理する。
\[
(n + 1)^2 - 1 = \sum_{k=1}^{n} 2k + \sum_{k=1}^{n} 1
\tag{3}
\]
式3.
式3.について右辺を整理する。
\[
(n + 1)^2 - 1 = 2\sum_{k=1}^{n} k + n
\tag{4}
\]
式4.
式4.を整理すると以下のようになる。
\[
\begin{align*}
2\sum_{k=1}^{n} k & = (n + 1)^2 - 1 - n \\
& = (n + 1)^2 - (n + 1) \\
& = (n + 1)(n + 1 - 1) \\
& = n(n + 1) \\\\
\end{align*}
\tag{5}
\]
式5.
∴
\[
\sum_{k=1}^{n} k = \frac{n(n + 1)}{2}
\tag{6}
\]
式6.
同様に問題について考える。このとき以下の数式に着目する。
\[
\begin{align*}
(k + 1)^3 & = k^3 + 3k^2 + 3k + 1 \\
(k + 1)^3 - k^3 & = 3k^2 + 3k + 1 \\
\end{align*}
\tag{7}
\]
式7.
両辺について\(k=1,2,3,...,n\)の場合の総和を取る。
\[
\sum_{k=1}^{n} (k + 1)^3 - \sum_{k=1}^{n} k^3 = \sum_{k=1}^{n} 3k^2 + \sum_{k=1}^{n} 3k + \sum_{k=1}^{n} 1
\tag{8}
\]
式8.
式8.について左辺を整理する。
\[
(n + 1)^3 - 1 = \sum_{k=1}^{n} 3k^2 + \sum_{k=1}^{n} 3k + \sum_{k=1}^{n} 1
\tag{9}
\]
式9.
式9.について右辺を整理する。
\[
(n + 1)^3 - 1 = 3\sum_{k=1}^{n} k^2 + 3\sum_{k=1}^{n} k + n
\tag{10}
\]
式10.
ここで式10.に式6.を代入する。
\[
(n + 1)^3 - 1 = 3\sum_{k=1}^{n} k^2 + \frac{3n(n + 1)}{2} + n
\tag{11}
\]
式11.
式11.を整理すると以下のようになる。
\[
\begin{align*}
6\sum_{k=1}^{n} k^2 & = 2(n + 1)^3 - 2 - 2n + 3n(n + 1) \\
& = 2(n + 1)^3 - 2(n + 1) + 3n(n + 1) \\
& = (n + 1)(2(n + 1)^2 -2 + 3n) \\
& = (n + 1)(2n^2 + 4n + 2 -2 + 3n) \\
& = (n + 1)(2n^2 + n) \\
& = n(n + 1)(2n + 1) \\
\end{align*}
\tag{12}
\]
式12.
∴
\[
\sum_{k=1}^{n} k^2 = \frac{n(n + 1)(2n + 1)}{6}
\tag{13}
\]
式13.
プログラム
式13.を用いて問題を解くプログラムを作成する。calcメソッドを呼び出すことで値が得られるようにする。今回は\(n=200\)なので200で初期化する。
ソース1. math_langur2.rb
class Math2 def initialize(n) @num = n end def calc return @num * (@num + 1) * (2 * @num + 1) / 6 end end p Math2.new(200).calc
上記ソースコードをmath2_langur2.rbとして保存し、実行してみた。
コマンド1. コマンド実行結果
$ ruby ./math2_langur2.rb 2686700 $