まずは、数列をlistに格納してからsumで総和を計算する方法。
- Space Complexity: O(n)(たぶん)
- Time Complexity: O(n)
# 等差数列
def sigma_arith_loop(a, d, l, m):
"""
a: int or float - 初項
d: int or float - 公差
l: int - 計算の始点
m: int - 計算の終点
"""
ls = [a + d * (k - 1) for k in range(l, m + 1)]
return sum(ls)
# 等比数列
def sigma_geo_loop(a, r, l, m):
"""
a: int or float - 初項
r: int or float - 公比
l: int - 計算の始点
m: int - 計算の終点
"""
ls = [a * r ** (k - 1) for k in range(l, m + 1)]
return sum(ls)
次に、公式を使用する方法。こちらの方が計算効率はいい。
- Sapce Complexity: O(1)
- Time Complexity: O(1)
# 等差数列
def sigma_arith(a, d, l, m):
"""
a: int or float - 初項
d: int or float - 公差
l: int - 計算の始点
m: int - 計算の終点
"""
# この数列の一般式は a_n = a + (n-1)d
# これをa_n = dn + Bの形に変換すると a_n = dn + (a-b)
# 等差数列の総和の公式に当てはめる
return (m - l + 1) * (2 * a + (m + l - 2) * d) / 2
# 等比数列
def sigma_geo(a, r, l, m):
"""
a: int or float - 初項
r: int or float - 公比
l: int - 計算の始点
m: int - 計算の終点
"""
# この数式の一般式はa_n = a * r ** (n-1)
return a * (r ** m - r ** (l - 1)) / (r - 1)