【问题标题】:Algorithm of A^B(A power B) for Big numbers [closed]大数的A ^ B(A幂B)算法[关闭]
【发布时间】:2014-08-05 11:53:36
【问题描述】:

你能帮我在不使用任何库(如 java Math.Biginteger)的情况下找到 A^B(A 幂 B)的算法吗?我懂JAVA,如果用java写的代码就好了。

【问题讨论】:

标签: java algorithm biginteger exponentiation


【解决方案1】:

一个很好的求幂算法是square and multiply

下面我包含了来自同一篇维基百科文章的一些伪代码。

1.  y := 1; i := l-1
2.  while i > -1 do
3.      if ni=0 then y:=y2' i:=i-1
4.      else
5.          s:=max{i-k+1,0}
6.          while ns=0 do s:=s+1 [2]
7.          for h:=1 to i-s+1 do y:=y2
8.          u:=(ni,ni-1,....,ns)2
9.          y:=y*xu
10.         i:=s-1
11. return y

【讨论】:

    【解决方案2】:

    您的问题并未说明是否仅假设参数最多为 9*1018 或结果。这很重要,因为此范围内的最大参数保证会溢出您可以使用的任意数量的 RAM,无论算法如何,您的任务都显然是不可能的。

    您的问题没有说明您为什么要使用 Java,而不是 BigInteger,否则它将非常适合该任务。不使用BigInteger 相当于重新实现BigInteger 的部分内容。这是作业吗?

    尝试设计这样的算法。一旦你知道怎么做,你就会发现 Java 拥有实现它所需的所有操作:位运算符、移位和乘法。

    作为第一步,考虑指数是 2 的幂的情况。您是否能够高效地计算 A2,然后是 A4,然后是 A8,然后是 A16?将这些称为“基本权力”。

    如果是:你能结合基本幂的任何其他指数吗? (提示:将指数转换为二进制。例如,A20 = A16+4 = A16 * A4)。

    实施它,你就解决了你的任务。

    如果您发现上述内容足够简单,作为延伸目标:如果您使用存储所有基本幂的数组实现上述内容,您现在可以优化它,稍微加快您的算法。您一次只需要保留一种基本能力。诀窍是通过使用exponent & 1 != 0 对其进行测试来从指数中提取单个位,并将其所有位右移(使用exponent >>= 1exponent /= 2),以便相关位始终处于最低有效位置(使剩余的指数为奇数或偶数)。如果以这种方式遍历指数中的位,则可以在同一个循环中遍历相应的指数,将适用的指数相乘。

    如果你做到了这里,你现在有一个平方和乘法的 Java 实现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-25
      • 1970-01-01
      • 2016-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-28
      相关资源
      最近更新 更多