複素数を扱う
前回、√(ー1)みたいな数字は、プログラムでは困るので・・・、という話をしましたが、このような数も実は扱うことができます。
この、√(ー1×実数)のような形の数は、虚数(複素数)といいます。虚数というのは、例えば、
i=√(-1)
と置くと、
i2=-1 (2乗するとルートはとれます)
となります。2乗してマイナスになる数は存在しないので、このような i のことを虚数といいます。一般的に、
3+5i (iは虚数)
の形の数を複素数といいます。
複素数の計算例
4+5i と9+13i を足すといくらのなるでしょうか。実数部分同士、虚数部分同士で足し算します。
(4+9)+(5i+13i)=13+18i
になります。プログラムで確認しましょう。
a=complex(4,5) b=complex(9,13) print(str(a+b))
【プログラムを見てみよう】
複素数は、complex(実数部分の値、虚数部分の値)と書きます。a,bにそれぞれ複素数を入れて、printで打ち出します。結果は、
(13+18j)
と出ました。プログラムの出力は、虚数が j で表現されています。
掛け算を見てみます。
(4+5i) ×(5+13i)=4×9+4×13i+5i×9+5i×13i
=36+52i+45iー65
=ー29+97i
になります。計算中は i2=-1 であることに注意します。プログラムで確認してみましょう。
a=complex(4,5) b=complex(9,13) print(str(a*b))
結果は
(-29+97j)
となります。割り算も見ておきましょう。
(9+13i)/(4+5i) の分子、分母に4-5iをかけます。
分子=(9+13i)×(4-5i)=101+7i
分母=(4+5i)×(4-5i)=16+25=41
分子/分母=(101+7i)/41 =2.4+0.17i
ぐらいになります。プログラムで確認しておきましょう。
a=complex(4,5) b=complex(9,13) #途中計算確認 print(str(a*a.conjugate())) print(str(b*a.conjugate())) #確認以上 print(str(b/a))
【プログラムを確認しよう】
分子分母に(4-5i) をかける、という計算をしました。これは、計算前の分母の値(4+5i)の虚数部の符号がプラスマイナスが反転したものになっています。このとき、(4+5i)の複素共役は(4-5i)である、
もしくは(4-5i)の複素共役は(4+5i)である、といいます。
プログラムではa=(4+5i) としたときに、aの複素共役はa.conjugate()と表すことができます。なので、
a*a.conjugate()
で分母の値を見ることができます。(b*a.conjugate()は分子の値です。)
プログラムでは、b/a と書くことで、一発で求めることができます。
(41+0j)
(101+7j)
(2.4634146341463414+0.17073170731707324j)
となりました。
プログラムでは計算できない問題
実は人間でもあまり答えられない問題があります。
- 0/0 はいくつですか?
- 2/0 はいくつですか?
私が20代で定職がなかったころ、塾講師の募集があり面接に行ってみたことがあります。そこで、試験を受けたのですが、その後、試験の受講者を相手に5分程度模擬授業をする、というテストがありました。(塾の関係者は後ろで見ていました)そのときに扱った問題の1つがこれです。
そのときに、私の目の前に座っていた方数名(受験者なので、おそらく皆さん大卒)に聞いてみたのですが、一人も答えられなかったです。意外と盲点の問題かもしれません。
プログラムでこの問題をさせると、エラーになります。
この問題は、実は結構やらかしますし、バグの原因にもなります。またプログラムのコードが長いと、エラーの記述場所の発見が遅れる、という人泣かせなこともあります。
【0/0はいくら?】
分数の性質として、次のようなものがあります。
例えば、2/4=1/2 ですが、4×1/2=2 になっています。なので
0/0=a
と置くと、
0×a=0
が成立する a が求める答えになります。ところで、0には何を掛けても0ですよね。だから、このaはどんな数字でもいい、ということで、あなたが高校生以上ならC(constant)と書くのが答えになります。
【2/0はいくら?】
同じ要領で、
2/0=a
と置くと、
0×a=2
になります。ところで、0には何を掛けても0ですので、0に何かを掛けて2になる数は存在しません。なので、このようなaは存在しません。
まとめると、
- 0/0=C (数字ならなんでもいい)
- 2/0 の値は存在しない
となります。
プログラムでやってみましょう。
a=complex(4,5) print(str(a/0))
結果は、
print(str(a/0)) ZeroDivisionError: complex division by zero
”complex division by zero” は 複素数を0で割ってるよ、とエラーの内容を教えてくれています。プログラムではこの0で割る、という計算はしてはいけない、ということになります。
おすすめ書籍
pythonに入門したい方向け
Pythonの絵本 Pythonを楽しく学ぶ9つの扉【電子書籍】[ 株式会社アンク ]
他の言語もかじりました系の方向け
コメント