Math 计算机科学数学中的递推关系T(n)=6T(n/6)+;2n+;对于n,6t(1)的幂=1?

Math 计算机科学数学中的递推关系T(n)=6T(n/6)+;2n+;对于n,6t(1)的幂=1?,math,recurrence,Math,Recurrence,递归关系可以直接从递归算法中导出,但是 它们的形式不允许我们快速确定效率 算法是简单的 请问我怎样才能解决这个问题 T(n)=6T(n/6)+2n+3表示n的幂为6T(1)=1的解决方案?可以使用Python的符号数学库from解决此问题 from sympy import Function, rsolve from sympy.abc import k, n f = Function('f') g = Function('g') # T(n) = 6T(n/6) + 2n + 3 for

递归关系可以直接从递归算法中导出,但是 它们的形式不允许我们快速确定效率 算法是简单的

请问我怎样才能解决这个问题


T(n)=6T(n/6)+2n+3表示n的幂为6T(1)=1的解决方案?

可以使用Python的符号数学库from解决此问题

from sympy import Function, rsolve
from sympy.abc import k, n

f = Function('f')
g = Function('g')

# T(n) = 6T(n/6) + 2n + 3 for n a power of 6     T(1) = 1
T = f(n) - 6*f(n/6) - 2*n - 3
Tk = T.subs({n: 6**k, f(n): g(k), f(n/6):g(k-1)})

s = rsolve(Tk, g(k), {g(0): 1})
print ("solution for k:", s.cancel())

for k in range(0,11):
    print(f"k={k}, n={6**k}, T(n)={2*6**k*k + (8*6**k - 3)//5}")
这使得:

  • Tk(k)=2*6**k*k+8*6**k/5-3/5
    或Tk(k)=((10k+8)6k-3)/5
  • T(n)=2*n*log(n)/log(6)+8*n/5-3/5
    或T(n)=(n(10log6(n)+8)-3)/5
前11个值:

k=0, n=1, T(n)=1
k=1, n=6, T(n)=21
k=2, n=36, T(n)=201
k=3, n=216, T(n)=1641
k=4, n=1296, T(n)=12441
k=5, n=7776, T(n)=90201
k=6, n=46656, T(n)=634521
k=7, n=279936, T(n)=4367001
k=8, n=1679616, T(n)=29561241
k=9, n=10077696, T(n)=197522841
k=10, n=60466176, T(n)=1306069401
我们可以通过递归公式检查公式:

def recursive_t(n):
    if n == 1:
        res =  1
    else:
        t_ndiv6 = recursive_t(n//6)
        res = 6 * t_ndiv6 + 2 * n + 3
    print(f"T({n})={res}")
    return res

recursive_t(6**10)

这将为相同的
n

打印出相同的值,用6^k替换n,从T(k-1)得到T(k),最后从T(1)得到T(k)。看看并使用“主定理”()你需要找到精确解,还是仅仅是渐近行为(大O)后者很容易用主定理来做。我需要从理论上找到问题的精确解。妮特:T(k)和T(n)的意思不同,这有点让人困惑。通常,你会要求T(k)=T(n)当k=n时,我现在引入Tk来帮助澄清差异。我认为这不起作用。
n
应该是6的幂,但你要计算的是6的幂,这不是一回事。你给出的
t(n)的公式
也不起作用:从文档中看,
rsolve
似乎只适用于特定的复发形式,不包括这一种。正确的解决方案似乎是
t(6**k)=(2*k+1)*6**k+3*(6**k-1)//5
。抱歉:在重读时,
rsolve
确实适用于此,但为了获得正确的解决方案,您希望使用
{g(0):1}
作为初始条件,而不是
{g(1):1}