import math
def seq_cd(first, difference, start, n):
"""
初項first、公差differenceの等差数列の第start項目からn項を求めます
"""
a = first + (start - 1) * difference
for _ in range(n):
yield a
a += difference
def seq_natual(n):
"""
自然数の数列の最初のn項を求めます
"""
for i in seq_cd(1, 1, n):
yield i
def seq_cr(first, ratio, start, n):
"""
初項first、公比ratioの等比数列の第start項目からn項を求めます
"""
a = first * ratio ** (start - 1)
for _ in range(n):
yield a
a *= ratio
__FIB_PHI = (1 + math.sqrt(5)) / 2
def __fib(n):
"""
フィボナッチ数列の一般項 F[n] を求めます
"""
return math.floor(__FIB_PHI ** n / math.sqrt(5) + 0.5)
def seq_fib(start, n):
"""
フィボナッチ数列(F[t] = F[t-1] + F[t-2])の第start項目からn項を求めます
"""
f1 = __fib(start)
f2 = __fib(start + 1)
for _ in range(n):
yield f1
f1, f2 = f2, f1 + f2
__TRIB_OMEGA = (-1 + math.sqrt(3) * 1j) / 2
__TRIB_CBRT1 = (19 - 3 * math.sqrt(33)) ** (1 / 3)
__TRIB_CBRT2 = (19 + 3 * math.sqrt(33)) ** (1 / 3)
__TRIB_ALPHA = (1 + __TRIB_CBRT1 + __TRIB_CBRT2) / 3
__TRIB_BETA = (1 + __TRIB_OMEGA * __TRIB_CBRT1 + __TRIB_OMEGA ** 2 * __TRIB_CBRT2) / 3
__TRIB_GAMMA = (1 + __TRIB_OMEGA ** 2 * __TRIB_CBRT1 + __TRIB_OMEGA * __TRIB_CBRT2) / 3
def __trib(n):
"""
トリボナッチ数列の一般項 T[n] を求めます
"""
A, B, C = __TRIB_ALPHA, __TRIB_BETA, __TRIB_GAMMA
a = (B * C - B - C + 2) / ((B - A) * (C - A)) * A ** (n - 2)
b = (C * A - C - A + 2) / ((C - B) * (A - B)) * B ** (n - 2)
c = (A * B - A - B + 2) / ((A - C) * (B - C)) * C ** (n - 2)
return round((a + b + c).real)
def seq_trib(start, n):
"""
トリボナッチ数列(T[t] = T[t-1] + T[t-2] + T[t-3])の第start項目からn項を求めます
"""
t1 = __trib(start)
t2 = __trib(start + 1)
t3 = __trib(start + 2)
for _ in range(n):
yield t1
t1, t2, t3 = t2, t3, t1 + t2 + t3
def __lucas(n):
"""
n項目のリュカ数 L[n] を求めます
"""
return round(__FIB_PHI ** n + (-__FIB_PHI) ** (-n))
def seq_lucas_number(start, n):
"""
リュカ数によってなる数列の第start項目からn項を求めます
"""
l1 = __lucas(start)
l2 = __lucas(start + 1)
for _ in range(n):
yield l1
l1, l2 = l2, l1 + l2