Jupyterの小技の続き

Jupyterで等差数列または等比数列を計算する

準備として、まず、下記を実行してください。

import re, IPython.core.getipython
from math import log
class NumberSequence:
    def __init__(self, s):
        ss = [t.replace(' ','') for t in re.sub('(.)-', r'\1+-', s).split('+')]
        assert len(ss) == 3 or (len(ss) > 3 and ss[3] == '...')
        tt = [int(i) for i in ss[:3]]
        d, e = tt[1] - tt[0], tt[1]//(tt[0] if tt[0] else 1)
        isratio = tt[2]/(tt[1] if tt[1] else 1) == e
        assert isratio or tt[2]-tt[1] == d
        ssum, self.value = r'\sum_{i=0}', None
        if len(ss) > 4:
            last = int(ss[-1])
            if isratio:
                n = int(round(log(last / tt[0], abs(e)))) + 1
                assert last == tt[0]*e**(n-1)
                self.value = sum(tt[0]*e**i for i in range(n))
            else:
                n = (last-tt[0]) // d + 1
                assert last == tt[0]+d*(n-1)
                self.value = sum(tt[0]+d*i for i in range(n))
            ssum += '^{%d}'%(n-1)
        if isratio:
            self.form = '$%s{%s%d^i}$'%(ssum, '' if tt[0]==1 else r'%s \times '%tt[1], e)
        else:
            self.form = r'$%s{%s%s i}$'%(ssum, '' if tt[0]==0 else '%s + '%tt[0],
                '' if d==1 else '%d \times'%d)
    def _repr_html_(self):
        if self.value is not None:
            print(self.value)
        return self.form
def S_impl(s):
    return NumberSequence(s)
ip = IPython.core.getipython.get_ipython()
if ip:
    ip.register_magic_function(S_impl, magic_name='S')

実行してみる

%S 1+4+7+...

$\sum_{i=0}{1 + 3 \times i}$

計算式が表示されます。


%S 1+4+7+...+19
>>>
70

$\sum_{i=0}^{6}{1 + 3 \times i}$

最後の項があると、合計と計算式が表示されます。


%S 1-3+9+...

$\sum_{i=0}{-3^i}$


「%S」の「%」を省略できます。

S 1 - 3 + 9 + ... + 81
>>>
61

$\sum_{i=0}^{4}{-3^i}$

S {'+'.join(['0','1','2','...','100'])}
>>>
5050

$\sum_{i=0}^{100}{ i}$

「{ }」で囲むと、先に評価(eval)できます。

以上

广告
将在 10 秒后关闭
bannerAds