祝! はてなブログの月間ランキングTOP100に掲載
祝! はてなブログの月間ランキングTOP100に掲載
2018年2月の「はてなブログの被ブクマ数の増加ランキングTOP100」の94位に載りました。(2018年2月の一ヵ月間で各ブログが集めたはてなブックマーク数(増加数)でのランキングだそうです)
なお、下記サイトのタイトルは、「はてなブログ被ブクマ数増加ランキング〔2018年1月〕」となっていますが、「〔2018年2月〕」が正しいようです。
yto.hatenablog.com
1つの記事(下記)が俄か人気になったおかげであり、興味を持ってブックマーク登録していただいた方々に、感謝いたします。
itsukara.hateblo.jp
「数学の現在」が積読本になっており、勿体ない件
数学の理解が不十分な割に、「最新の数学が知りたい、数学の美しさに触れたい」という思いばかり先行していたため、1年ぐらい前に勢いで下記3冊を買ったのですが、勉強が足りないため殆ど理解できず、積読本になっています。
1人では読み進めなそうなので、「興味を持っている人がいるようならば、輪講会をやりたい」、などと思ってはいるのですが、なかなか実行に移せないです...
なお、これらの本の名称は「i」「e」「π」になってます。
「」は美しい数式だと、改めて感銘しています。
- 作者: 斎藤毅,河東泰之,小林俊行
- 出版社/メーカー: 東京大学出版会
- 発売日: 2016/05/28
- メディア: 単行本
- この商品を含むブログ (2件) を見る
- 作者: 斎藤毅,河東泰之,小林俊行
- 出版社/メーカー: 東京大学出版会
- 発売日: 2016/05/28
- メディア: 単行本
- この商品を含むブログを見る
- 作者: 斎藤毅,河東泰之,小林俊行
- 出版社/メーカー: 東京大学出版会
- 発売日: 2016/05/28
- メディア: 単行本
- この商品を含むブログ (1件) を見る
PowerShellでGUIを簡単作成
でんき家計簿:最新版及び将来変更への対応
今週のはてなブログランキング [2018年2月第2週]に掲載!
今週のはてなブログランキング [2018年2月第2週]に載りました。
ずっと下の方の14位ではありますが、載って非常に嬉しいです。
exp(π*i) = -1をPythonでも計算してみました
直前の記事でexp(π*i) = -1をrubyで計算しましたが、Pythonでも特殊メソッドを使うとでオーバーロードできるので、試しに書いてみました。
rubyのプログラムと同じ構造にしましたが、特殊メソッドの部分(__add__等)が、今一つ美しくない気がします。なお、計算結果は最後の桁まで全く同じでした。
プログラム
import math class C(): def __init__(self, r, i): self.r = r self.i = i def __add__(self, c2): if type(c2) != C: raise return C(self.r + c2.r, self.i + c2.i) def __mul__(self, c2): if type(c2) != C: raise return C(self.r * c2.r - self.i * c2.i, self.r * c2.i + self.i * c2.r) def __truediv__(self, r): if type(r) != float: raise return C(self.r / r, self.i / r) def __str__(self): return str(self.r) + " + " + str(self.i) + "i" def cexp(c, n, c1): s = c1 + c num = c # Numerator den = 1.0 # Denominator for i in range(2, n+1): print("i={}, s={}, 1/den={}".format(i, s, 1/den)) num = num * c den = den * i s = s + num / den return s pi_i = C(0, math.pi) c1 = C(1.0, 0.0) print("cexp(pi_i, 50, c1)={}".format(cexp(pi_i, 50, c1)))
計算結果
結果は、正確なにはならず、「-1.1e-16」程度の大きさの虚数部が残ってしまいましたが、rubyでの計算結果と全く同じでした(最後の桁まで同じ)。
i=2, s=1.0 + 3.141592653589793i, 1/den=1.0 i=3, s=-3.934802200544679 + 3.141592653589793i, 1/den=0.5 i=4, s=-3.934802200544679 + -2.0261201264601763i, 1/den=0.16666666666666666 i=5, s=0.1239099258720886 + -2.0261201264601763i, 1/den=0.041666666666666664 i=6, s=0.1239099258720886 + 0.5240439134171684i, 1/den=0.008333333333333333 i=7, s=-1.2113528429825005 + 0.5240439134171684i, 1/den=0.001388888888888889 i=8, s=-1.2113528429825005 + -0.0752206159036235i, 1/den=0.0001984126984126984 i=9, s=-0.9760222126236073 + -0.0752206159036235i, 1/den=2.48015873015873e-05 i=10, s=-0.9760222126236073 + 0.006925270707504691i, 1/den=2.7557319223985893e-06 i=11, s=-1.0018291040136214 + 0.006925270707504691i, 1/den=2.755731922398589e-07 i=12, s=-1.0018291040136214 + -0.00044516023820965686i, 1/den=2.505210838544172e-08 i=13, s=-0.9998995297042175 + -0.00044516023820965686i, 1/den=2.08767569878681e-09 i=14, s=-0.9998995297042175 + 2.1142567557955476e-05i, 1/den=1.6059043836821613e-10 i=15, s=-1.0000041678091423 + 2.1142567557955476e-05i, 1/den=1.1470745597729725e-11 i=16, s=-1.0000041678091423 + -7.72785889874728e-07i, 1/den=7.647163731819816e-13 i=17, s=-0.9999998647395553 + -7.72785889874728e-07i, 1/den=4.779477332387385e-14 i=18, s=-0.9999998647395553 + 2.2419510272822888e-08i, 1/den=2.8114572543455206e-15 i=19, s=-1.00000000352908 + 2.2419510272822888e-08i, 1/den=1.5619206968586225e-16 i=20, s=-1.00000000352908 + -5.289187244469688e-10i, 1/den=8.22063524662433e-18 i=21, s=-0.9999999999243491 + -5.289187244469688e-10i, 1/den=4.110317623312165e-19 i=22, s=-0.9999999999243491 + 1.0347741813843647e-11i, 1/den=1.9572941063391263e-20 i=23, s=-1.0000000000013562 + 1.0347741813843647e-11i, 1/den=8.896791392450574e-22 i=24, s=-1.0000000000013562 + -1.7072990308840883e-13i, 1/den=3.8681701706306835e-23 i=25, s=-0.9999999999999793 + -1.7072990308840883e-13i, 1/den=1.6117375710961184e-24 i=26, s=-0.9999999999999793 + 2.292021495202086e-15i, 1/den=6.446950284384474e-26 i=27, s=-1.0000000000000002 + 2.292021495202086e-15i, 1/den=2.4795962632247972e-27 i=28, s=-1.0000000000000002 + -1.405396847913007e-16i, 1/den=9.183689863795546e-29 i=29, s=-1.0 + -1.405396847913007e-16i, 1/den=3.2798892370698385e-30 i=30, s=-1.0 + -1.1097266936275162e-16i, 1/den=1.1309962886447718e-31 i=31, s=-1.0 + -1.1097266936275162e-16i, 1/den=3.769987628815906e-33 i=32, s=-1.0 + -1.1128644865909646e-16i, 1/den=1.2161250415535181e-34 i=33, s=-1.0 + -1.1128644865909646e-16i, 1/den=3.800390754854744e-36 i=34, s=-1.0 + -1.1128351600992583e-16i, 1/den=1.151633562077195e-37 i=35, s=-1.0 + -1.1128351600992583e-16i, 1/den=3.387157535521162e-39 i=36, s=-1.0 + -1.1128354033268814e-16i, 1/den=9.67759295863189e-41 i=37, s=-1.0 + -1.1128354033268814e-16i, 1/den=2.6882202662866367e-42 i=38, s=-1.0 + -1.112835401524659e-16i, 1/den=7.265460179153072e-44 i=39, s=-1.0 + -1.112835401524659e-16i, 1/den=1.9119632050402823e-45 i=40, s=-1.0 + -1.1128354015366612e-16i, 1/den=4.902469756513544e-47 i=41, s=-1.0 + -1.1128354015366612e-16i, 1/den=1.225617439128386e-48 i=42, s=-1.0 + -1.112835401536589e-16i, 1/den=2.989310827142405e-50 i=43, s=-1.0 + -1.112835401536589e-16i, 1/den=7.11740673129144e-52 i=44, s=-1.0 + -1.1128354015365895e-16i, 1/den=1.6552108677421951e-53 i=45, s=-1.0 + -1.1128354015365895e-16i, 1/den=3.761842881232262e-55 i=46, s=-1.0 + -1.1128354015365895e-16i, 1/den=8.359650847182804e-57 i=47, s=-1.0 + -1.1128354015365895e-16i, 1/den=1.8173154015614793e-58 i=48, s=-1.0 + -1.1128354015365895e-16i, 1/den=3.866628513960594e-60 i=49, s=-1.0 + -1.1128354015365895e-16i, 1/den=8.055476070751238e-62 i=50, s=-1.0 + -1.1128354015365895e-16i, 1/den=1.643974708316579e-63 cexp(pi_i, 50, c1)=-1.0 + -1.1128354015365895e-16i
参考にした記事
exp(π*i) = -1をrubyで計算してみました
仕事でRubyを少し使っていたのですが、これまでは、Rubyの勉強をあまりせずに、既存のプログラムを見よう見まねで改修していました。少し深く理解したいと思い、Rubyのリファレンスマニュアルを読んだので、試しにプログラムを書いてみました。
内容は、を計算して、値がになるか確認するものです。
代入や加減乗除のオーバーロードにより非常に簡潔に書け、便利と感じました。
プログラム
RubyにはComplex型があるのですが、意図的にこれを使わずに、自前で複素数演算クラスを定義しています。
class C attr_reader :r, :i def initialize(r, i) @r = r; @i = i end def +(c) raise unless c.class == C C.new(@r + c.r, @i + c.i) end def *(c) raise unless c.class == C C.new(@r * c.r - @i * c.i, @r * c.i + @i * c.r) end def /(r2) raise unless r2.class == Float C.new(@r / r2, @i / r2) end def to_s @r.to_s + " + " + @i.to_s + "i" end end def exp(c, n, c1) s = c1 + c num = c # Numerator den = 1.0 # Denominator for i in 2..n puts "i=#{i}, s=#{s}, 1/den=#{1/den}" num = num * c den = den * i s = s + num / den end return s end pi_i = C.new(0, Math::PI) c1 = C.new(1.0, 0.0) puts "exp(pi_i, 50, c1)=#{exp(pi_i, 50, c1)}"
計算結果
結果は、正確なにはならず、「-1.1e-16」程度の大きさの虚数部が残ってしまいました。原因は、Rubyの浮動小数点の精度の限界によるものですね。
i=2, sum=1.0 + 3.141592653589793i, 1/den=1.0 i=3, sum=-3.934802200544679 + 3.141592653589793i, 1/den=0.5 i=4, sum=-3.934802200544679 + -2.0261201264601763i, 1/den=0.16666666666666666 i=5, sum=0.1239099258720886 + -2.0261201264601763i, 1/den=0.041666666666666664 i=6, sum=0.1239099258720886 + 0.5240439134171684i, 1/den=0.008333333333333333 i=7, sum=-1.2113528429825005 + 0.5240439134171684i, 1/den=0.001388888888888889 i=8, sum=-1.2113528429825005 + -0.0752206159036235i, 1/den=0.0001984126984126984 i=9, sum=-0.9760222126236073 + -0.0752206159036235i, 1/den=2.48015873015873e-05 i=10, sum=-0.9760222126236073 + 0.006925270707504691i, 1/den=2.7557319223985893e-06 i=11, sum=-1.0018291040136214 + 0.006925270707504691i, 1/den=2.755731922398589e-07 i=12, sum=-1.0018291040136214 + -0.00044516023820965686i, 1/den=2.505210838544172e-08 i=13, sum=-0.9998995297042175 + -0.00044516023820965686i, 1/den=2.08767569878681e-09 i=14, sum=-0.9998995297042175 + 2.1142567557955476e-05i, 1/den=1.6059043836821613e-10 i=15, sum=-1.0000041678091423 + 2.1142567557955476e-05i, 1/den=1.1470745597729725e-11 i=16, sum=-1.0000041678091423 + -7.72785889874728e-07i, 1/den=7.647163731819816e-13 i=17, sum=-0.9999998647395553 + -7.72785889874728e-07i, 1/den=4.779477332387385e-14 i=18, sum=-0.9999998647395553 + 2.2419510272822888e-08i, 1/den=2.8114572543455206e-15 i=19, sum=-1.00000000352908 + 2.2419510272822888e-08i, 1/den=1.5619206968586225e-16 i=20, sum=-1.00000000352908 + -5.289187244469688e-10i, 1/den=8.22063524662433e-18 i=21, sum=-0.9999999999243491 + -5.289187244469688e-10i, 1/den=4.110317623312165e-19 i=22, sum=-0.9999999999243491 + 1.0347741813843647e-11i, 1/den=1.9572941063391263e-20 i=23, sum=-1.0000000000013562 + 1.0347741813843647e-11i, 1/den=8.896791392450574e-22 i=24, sum=-1.0000000000013562 + -1.7072990308840883e-13i, 1/den=3.8681701706306835e-23 i=25, sum=-0.9999999999999793 + -1.7072990308840883e-13i, 1/den=1.6117375710961184e-24 i=26, sum=-0.9999999999999793 + 2.292021495202086e-15i, 1/den=6.446950284384474e-26 i=27, sum=-1.0000000000000002 + 2.292021495202086e-15i, 1/den=2.4795962632247972e-27 i=28, sum=-1.0000000000000002 + -1.405396847913007e-16i, 1/den=9.183689863795546e-29 i=29, sum=-1.0 + -1.405396847913007e-16i, 1/den=3.2798892370698385e-30 i=30, sum=-1.0 + -1.1097266936275162e-16i, 1/den=1.1309962886447718e-31 i=31, sum=-1.0 + -1.1097266936275162e-16i, 1/den=3.769987628815906e-33 i=32, sum=-1.0 + -1.1128644865909646e-16i, 1/den=1.2161250415535181e-34 i=33, sum=-1.0 + -1.1128644865909646e-16i, 1/den=3.800390754854744e-36 i=34, sum=-1.0 + -1.1128351600992583e-16i, 1/den=1.151633562077195e-37 i=35, sum=-1.0 + -1.1128351600992583e-16i, 1/den=3.387157535521162e-39 i=36, sum=-1.0 + -1.1128354033268814e-16i, 1/den=9.67759295863189e-41 i=37, sum=-1.0 + -1.1128354033268814e-16i, 1/den=2.6882202662866367e-42 i=38, sum=-1.0 + -1.112835401524659e-16i, 1/den=7.265460179153072e-44 i=39, sum=-1.0 + -1.112835401524659e-16i, 1/den=1.9119632050402823e-45 i=40, sum=-1.0 + -1.1128354015366612e-16i, 1/den=4.902469756513544e-47 i=41, sum=-1.0 + -1.1128354015366612e-16i, 1/den=1.225617439128386e-48 i=42, sum=-1.0 + -1.112835401536589e-16i, 1/den=2.989310827142405e-50 i=43, sum=-1.0 + -1.112835401536589e-16i, 1/den=7.11740673129144e-52 i=44, sum=-1.0 + -1.1128354015365895e-16i, 1/den=1.6552108677421951e-53 i=45, sum=-1.0 + -1.1128354015365895e-16i, 1/den=3.761842881232262e-55 i=46, sum=-1.0 + -1.1128354015365895e-16i, 1/den=8.359650847182804e-57 i=47, sum=-1.0 + -1.1128354015365895e-16i, 1/den=1.8173154015614793e-58 i=48, sum=-1.0 + -1.1128354015365895e-16i, 1/den=3.866628513960594e-60 i=49, sum=-1.0 + -1.1128354015365895e-16i, 1/den=8.055476070751238e-62 i=50, sum=-1.0 + -1.1128354015365895e-16i, 1/den=1.643974708316579e-63 cexp(pi_i, 50, c1)=-1.0 + -1.1128354015365895e-16i