回答編集履歴
3
d
    
        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
    
        answer	
    CHANGED
    
    | @@ -51,4 +51,40 @@ | |
| 51 51 | 
             
            plt.show()
         | 
| 52 52 | 
             
            ```
         | 
| 53 53 |  | 
| 54 | 
            -
            
         | 
| 54 | 
            +
            
         | 
| 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
    
        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()
         | 
