特定游戏中的规则是角色的力量与角色体验的triangular root成比例。例如,15-20经验给5力量,21-27经验给6力量,28-35经验给力7等等。有些玩家已经获得了数千亿的经验。使用加,减和减半计算三角根
我试图在一个只有三个算术指令的8位机器上实现这个游戏:加,减,除以2.例如,要将数乘以4,程序会将其添加到自身两次。一般乘法速度要慢得多;我已经写了一个软件子程序来使用四分之一平方的表格来完成它。
我已经考虑计算三角形根T(p)
到bisection search对于从上面和下面限定经验数的连续三角形数。我的计划是使用T(2*p)
的复发身份,直到它超出经验为止,然后将其用作平分搜索的上限。但我无法在对分中找到T((x+y)/2)
的身份,但不使用x*y
或(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
下面是ARM的平方根例程,它启发了这个答案:http://www.finesse.demon.co.uk/steven/sqrt.html –
谢谢。我一时忘记了在平分中,(y - x)总是两个幂。 –