teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

d

2019/08/19 04:27

投稿

tiitoi
tiitoi

スコア21960

answer CHANGED
@@ -87,4 +87,32 @@
87
87
 
88
88
  f = mpmath.factorial(mpmath.mpf(1000))
89
89
  print(f"1000! = {f}")
90
+ ```
91
+
92
+ ### 質問の式を mpmath で計算する例
93
+
94
+ ```python
95
+ import sys
96
+
97
+ import mpmath as mp
98
+
99
+ mpmath.mp.dps = 2000
100
+
101
+ s = 0
102
+ l = 0.3
103
+ n = 1000
104
+ t = 0.2
105
+
106
+ for k in range(n + 1):
107
+ s += (
108
+ (-1) ** k
109
+ / mp.factorial(1000)
110
+ * mp.sin(mpmath.pi * l * k)
111
+ * mp.gamma(l * k + 1)
112
+ / (t ** (l * k + 1))
113
+ )
114
+
115
+ s *= -1 / mpmath.pi
116
+ print(s)
117
+ # -4.6852969663640794183052611442921398568086793342834616462334696324903867843231395630449988227880810131784478141659219945020203824927023753145340152275411511818373558920285872536714395228721948271826415724657244356679410653902566023614945014042952126178451891146305498687076853150690388109943827589984735451898842139557958621055625632539663091175942064908619685606545219293485810476695033253309084612857919257606784710540821141287519704017988233984166363710615914801845057844847498708240109737744243798479965501611309757531588120324018949625977650842536557835170122470528575372965177074318211049609908479423513835244125701516943697486654794175290551525218964214548834205190130209616768780024865572422562319780254088489151655831942096511712901359285285313156837232190787227348293663807776826088102389004523746146439727884614438552769772052583787278931259025862266267527347055478532365682291188279115875850275919795196649524369131042988665553942619715595168719062131399527261531325133906580769041387916239304444853504881787451700196905154750706687217882182421629624078044956529865543544068656579784986705519747832854686508939351378181527847396122106095160866115322720223585062715943851550247952235652437843682553103198759150039829159286341277372652777332702063251410719991844368057697345823111259489942513149539813031718828345330830157844803109246345868740928996257665817861367467687161910693184414807511579751981740167047404088833058340052830658962523612136648135596475773090234244305096492102145406041366097252467314623275357778005920563778105868762907482707819978490405043196844875157208281722161855859448349229516220667066123504490431317899702446327175215167205030224795654189487061289564293054352001359895654181422873855808898785005875909967936576766340843356222045846500038297018788320027808611619194276127030472392754256051166888548527686436583618833795960420300558879420743599986345799684146483437131704540648998092418292801233242752904307374935321733025575849004051292291211225721865580467562778e-1745
90
118
  ```

2

d

2019/08/19 04:27

投稿

tiitoi
tiitoi

スコア21960

answer CHANGED
@@ -51,4 +51,40 @@
51
51
  plt.show()
52
52
  ```
53
53
 
54
- ![イメージ説明](af8e0f2ea41090c2e518632636d10dda.png)
54
+ ![イメージ説明](af8e0f2ea41090c2e518632636d10dda.png)
55
+
56
+ ## 追記
57
+
58
+ > 1点質問なのですが、どうしても1000項以上計算したい場合は、どのような方法が考えられますでしょうか?アドバイスいただけますと幸いです。
59
+
60
+ 1000項以上計算したい理由がグラフ描画であるならば、意味がないかもしれません。
61
+ 例えば、頑張って有効数字20桁ぐらい計算したとしても、グラフ上ではその差は表現できないからです。
62
+ 質問の式がなにかの関数のテイラー展開の結果なのだとしたら、最初の10項ぐらいでも有効数字が小数点以下何桁かはあると思いますが、グラフで描画する際の精度としては十分といえます。
63
+
64
+ ### その上でどうしても1000項ぐらい計算したい場合
65
+
66
+ 一般的に扱われる倍精度 (Python の float 型) の範囲では、1000!は表現できる範囲を超えてしまうので、[任意精度演算](https://ja.wikipedia.org/wiki/%E4%BB%BB%E6%84%8F%E7%B2%BE%E5%BA%A6%E6%BC%94%E7%AE%97) のライブラリを使う必要があります。
67
+ 任意精度演算ライブラリを使えば、メモリが許す限り、任意の桁数の値を扱うことができます。
68
+ ただし、欠点として、単精度/倍精度などハードウェアレベルで最適化されている演算ではないので、計算はかなり遅くなるでしょう。
69
+
70
+ Python で使える任意精度演算ライブラリとしては sympy についてくる mpmath があります。
71
+ float では170項ぐらいで階乗はオーバーフローしますが、2000ビットの多倍長演算で1000項まで計算でき、[Wolfram Alpha の結果](https://www.wolframalpha.com/input/?i=1000!) と一致することを確認しました。
72
+
73
+ ```python
74
+ import sys
75
+
76
+ import mpmath
77
+ from scipy.special import factorial
78
+
79
+ mpmath.mp.dps = 2000 # 1000ビット
80
+
81
+ for i in range(1001):
82
+ f = factorial(i)
83
+ print(f"{i}! = {f:.2e}")
84
+
85
+ if f > sys.float_info.max:
86
+ break # 171! で倍精度で表される範囲を超える。
87
+
88
+ f = mpmath.factorial(mpmath.mpf(1000))
89
+ print(f"1000! = {f}")
90
+ ```

1

d

2019/08/19 04:05

投稿

tiitoi
tiitoi

スコア21960

answer CHANGED
@@ -42,7 +42,7 @@
42
42
  print(seq.shape) # (t, n) の配列
43
43
 
44
44
  # 級数を求めるには、行方向に和を取ればよいので、
45
- series = 1 / np.pi * seq.sum(axis=1)
45
+ series = -1 / np.pi * seq.sum(axis=1)
46
46
  print(series.shape) # (100,)
47
47
 
48
48
  fig, ax = plt.subplots()