指数乘以平方。
int ipow(int base, int exp) { int result = 1; while (exp) { if (exp & 1) result *= base; exp >>= 1; base *= base; } return result; }
这是在非对称密码学中对大数进行模幂运算的标准方法。
请注意, 通过平方的指数并不是最优的方法。 对于所有指数值,这可能是您可以做的最好的一种常规方法,但对于特定的指数值,可能会有更好的序列,需要更less的乘法。
例如,如果你想计算x ^ 15,平方的幂乘方法会给你:
x^15 = (x^7)*(x^7)*xx^7 = (x^3)*(x^3)*xx^3 = x*x*x
这是总共6次乘法。
事实certificate,这可以通过使用“正好”5乘法通过加法链求幂来完成 。
n*n = n^2 n^2*n = n^3 n^3*n^3 = n^6 n^6*n^6 = n^12 n^12*n^3 = n^15
没有有效的algorithm来find这个最佳的乘法序列。 维基百科 :
寻找最短加法链的问题不能通过dynamic规划来解决,因为它不能满足最优子结构的假设。 也就是说,将功率分解成更小的功率是不够的,每个功率的计算最小,因为较小功率的加法链可能是相关的(以共享计算)。 例如,在上述第十五条的最短加法链中,由于a³被重新使用(相对于a⁶=a²(a²)2),a⁶的子问题必须计算为(a³)²,这也需要三次相乘)。
这是Java中的方法
priva