gpt4 book ai didi

algorithm - 使用加、减和减半计算三角根

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:54:44 25 4
gpt4 key购买 nike

特定游戏的规则是角色的力量与 triangular root 成正比。角色的经历。比如15-20经验5力量,21-27经验6力量,28-35经验7力量等等。有些玩家的经验值已经上千亿了。

我试图在只有三个算术指令的 8 位机器上实现这个游戏:加、减和除以 2。例如,要将一个数乘以 4,程序会将它与自身相加两次.一般乘法要慢得多;我已经编写了一个软件子例程来使用四分之一方形表来完成它。

我曾考虑通过 bisection search 计算三角根 T(p)对于从上方和下方限定经验数的连续三角形数。我的计划是使用 T(2*p) 的递归标识,直到它超出经验,然后将其用作二分搜索的上限。但是我在不使用 x*y 的二等分中找不到 T((x+y)/2) 的身份(x+y)^2.

是否有一种有效的算法可以通过加、减和减半来计算一个数的三角根?还是我最终不得不执行 O(log n) 次乘法,一次计算二分搜索中的每个中点?或者考虑实现长除法以使用牛顿法会更好吗?

T(x)的定义:

T(x) = (n * (n + 1))/2

我得出的身份:

T(2*x) = 4*T(x) - x
# e.g. T(5) = 15, T(10) = 4*15 - 5 = 55

T(x/2) = (T(x) + x/2)/4
# e.g. T(10) = 55, T(5) = (55 + 5)/4 = 15

T(x + y) = T(x) + T(y) + x*y
# e.g. T(3) = 6, T(7) = 28, T(10) = 6 + 28 + 21 = 55

T((x + y)/2) = (T(x) + T(y) + x*y + (x + y)/2)/4
# e.g. T(3) = 6, T(7) = 28, T(5) = (6 + 28 + 21 + 10/2)/4 = 15

最佳答案

进行二分搜索,但要确保 y - x 始终是 2 的幂。 (这不会增加渐近运行时间。)然后 T((x + y)/2) = T(x) + T(h) + x * h,其中 h 是 2 的幂,所以 x * h 可以通过移位计算。

这是一个 Python 概念验证(仓促编写,或多或少未优化但避免了昂贵的操作)。

def tri(n):
return ((n * (n + 1)) >> 1)

def triroot(t):
y = 1
ty = 1

# Find a starting point for bisection search by doubling y using
# the identity T(2*y) = 4*T(y) - y. Stop when T(y) exceeds t.
# At the end, x = 2*y, tx = T(x), and ty = T(y).
while (ty <= t):
assert (ty == tri(y))
tx = ty
ty += ty
ty += ty
ty -= y
x = y
y += y

# Now do bisection search on the interval [x .. x + h),
# using these identities:
# T(x + h) = T(x) + T(h) + x*h
# T(h/2) = (T(h) + h/2)/4
th = tx
h = x
x_times_h = ((tx + tx) - x)
while True:
assert (tx == tri(x))
assert (x_times_h == (x * h))

# Divide h by 2
h >>= 1
x_times_h >>= 1
if (not h):
break
th += h
th >>= 1
th >>= 1

# Calculate the midpoint of the search interval
tz = ((tx + th) + x_times_h)
z = (x + h)
assert (tz == tri(z))

# If the midpoint is below the target, move the lower bound
# of the search interval up to the midpoint
if (t >= tz):
tx = tz
x = z
x_times_h += ((th + th) - h)
return x
for q in range(1, 100):
p = triroot(q)
assert (tri(p) <= q < tri((p + 1)))
print(q, p)

关于algorithm - 使用加、减和减半计算三角根,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22699066/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com