自作問題の検算に Python を活用しています

自作問題の検算に Python を活用しています

検算に Python を使っています

 BlogCat のプログラミング日記です。数学サイトの演習問題コーナーには BlogCat が作成したオリジナル問題が載っていたりしますが、万が一にも解答が間違っていたら大変なので(←何度も間違えているくせに)、ミスをなるべく減らすために Python を活用しています。そこで今回は 演習問題 SQ-28 を題材に Python の実践コードを紹介します。

見えにくいからという理由で変数を使うこともあるのです

 SQ-28 では複素数の和を計算します。
 Python において、複素数は complex型として扱います。
 下のサンプルは $2k-1+i^k$ の $k=10$ ~ $12$ の和をとる計算です。

# sの初期値
s = 0

# 虚数iを定義
cpx = 1j

# a_k = 2k - 1 + i**k の k = 10, 11, 12 の和をとる
for k in range(10, 13):
    s += 2 * k - 1 + cpx ** k

print(s)
(63-1j)

 complex型は a + bj のような形式で定義します。
 上のコードでは虚数 $i$ を cpx = 1j と定義してあります。わざわざ変数を使う理由は、1j のような文字が式の中に入り込んでしまうと、

  s += 2 * k - 1 + (1j) ** k

のようになって、目がちかちかしてして見えにくいからです。

 for文では range関数を使って 10, 11, 12 という数を順に生成しています。つい忘れがちですが、このような場合は range(10, 12) ではなく、range(10, 13) と記述します。

もう少し複雑な計算例です

 次も複素数の和をとる計算です。先ほどより少し複雑で、
 
\[\sum_{M=1}^{12}\left\{M^2-\frac{(i-1)(i^M-1)}{2}\right\}\]
という計算をさせるコードです。

# sの初期値
s = 0

# 虚数iを定義
cpx = 1j

for k in range(1, 13):
    s += k ** 2 - (cpx - 1) * (cpx ** k - 1) / 2

print(s)
(644+6j)

 $k$ について $1$ から $12$ の和をとるので、for文のイテラブルオブジェクトは range(1, 13) です。このコードで虚数を変数に置き換えていないと、

  s += k ** 2 - ((1j) - 1) * ((1j) ** k - 1) / 2

のようになって、目がちかちかちかっとなってしまいます。
 

老猫の食欲

 話は変わりますけど、飼い猫(アメショ)の旺盛な食欲に困惑しています(←話が変わりすぎ)。ドライフードと缶詰を交互にあげているのですが、缶詰に換算すると 1 日に 4 ~ 5 缶は平らげてしまいます。いくらなんでも食べ過ぎだと思うのですが、あげないと「もっとちょうだい」みたいな口調で鳴いて仕事の邪魔をします。パソコンの上に乗られたこともありました。昔はこれほど食べなかったのに、いったいどうしたんだろうと心配する毎日です。親戚の話によると、猫は年を取るとたくさん食べるようになるようです。うちの猫も今年で 16 歳。立派なお婆さんです。食べること以外に楽しみがないのかなあと思ったりします。わあ。ちょうどこの記事を書いている最中にも「もっとちょうだい」が始まりました。