【发布时间】:2014-03-27 20:59:02
【问题描述】:
特定游戏中的规则是角色的力量与角色经验的triangular root 成正比。比如15-20经验5点,21-27点6点,28-35点7点,等等。有的玩家经验值上千亿。
我正在尝试在只有三个算术指令的 8 位机器上实现这个游戏:加法、减法和除以 2。例如,要将一个数字乘以 4,程序会将其与自身相加两次.一般乘法要慢得多;我已经编写了一个软件子程序来使用四分之一方表来完成它。
我考虑过计算三角根T(p) 到bisection search 用于从上到下限定经验数的连续三角数。我的计划是使用T(2*p) 的重复标识,直到它超出经验,然后将其用作二等分搜索的上限。但我无法在不使用 x*y 或 (x+y)^2 的二等分中找到 T((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
【问题讨论】:
标签: algorithm math optimization