【问题标题】:About a method for an integer to nth power using BigInteger to calculate big numbers关于使用 BigInteger 计算大数的整数 n 次方方法
【发布时间】:2015-11-03 19:43:08
【问题描述】:

书中的问题: 许多加密技术依赖于将大整数提高到整数幂的能力。这是一种实现整数求幂的(合理的)快速技术的方法:

public static int pow(int x, int n) { 
    if (n == 0){
        return 1;
    }
    int t = pow(x, n/2);
    // find x to the n/2 recursively
    // if n is even, the result is t squared 
    // if n is odd, the result is t squared times x
    if (n%2 == 0){ 
        return t*t; 
    } else { 
        return t*t*x; 
    }
} 

这种方法的问题是它只在结果小于 20 亿时才有效。重写它,使结果为 BigInteger。不过,参数仍应为整数。

您可以使用BigInteger 方法加法和乘法,但不要使用pow,这会破坏乐趣。

这个方法,我并不真正关心它是如何工作的,但是“箭头”部分是我感到困惑的部分。它说“不要使用pow。”这意味着什么?他们给你方法并告诉你实现BigInteger,但是“不要使用pow”是什么意思?有人知道吗?

【问题讨论】:

  • 这意味着不要使用为BigInteger 定义的pow。也就是说,不要使用this。示例代码显示了一个递归调用自身的pow 方法。您可以使用BigInteger 方法编写相同的东西。当然,如果你调用方法pow你仍然可以递归使用它。你不能使用BigInteger.pow
  • 所以.. 我不太明白。这是否意味着更改整个 pow 方法,使其默认使用 BigInteger 对象而不是使用 BigInteger.pow?我不确定第二个是做什么的。这是java库中的方法之一还是pow指的是作者创建的pow?
  • 仅供参考,该技术称为平方求幂,它将所需的乘法次数从 n 减少到 lg N
  • 我的意思是,更改整个pow 方法,使其使用BigInteger 而不是int。这就是我认为他们正在寻找的东西。是的,BigInteger.pow 是 Java 库中的方法之一,您不应该使用它。如果您使用它,整个代码将只是没有算法的一行,但他们试图让您使用BigInteger 重写算法。并且告诉导师下次不要调用自己的方法pow,因为和库方法同名,所以比较混乱。
  • pow 无论如何都是一个糟糕的名字。它让我想起卡通暴力而不是求幂。

标签: java


【解决方案1】:

在 java.math.BigInteger 对象中有一个方法 pow.The

java.math.BigInteger pow(int)

使用这种方法可以计算任意数的幂。

在您的示例中,我们可以使用 BigInteger 将函数编写为

import java.math.BigInteger;
public static BigInteger power(int a,int b){
BigInteger b1 = new BigInteger(Integer.toString());
b1 = b1.pow(b);
return b1;//returns a^b
}

现在使用 pow 是内置函数。我认为该声明意味着您应该使用不同的方法提供流程的替代实现,例如

import java.math.BigInteger;
public static BigInteger power(int a,int b){
BigInteger b1 = new BigInteger(Integer.toString(a));  
BigInteger b2 = new BigInteger("1");
for(int i = 0; i < b; i++){
b2=b2.multiply(b1);
}
return b2;//return a^b
}

【讨论】:

  • 你能给我解释一下 Integer.toString() 部分吗?为什么要在那里使用它?
  • 抱歉这么晚才回复.....Integer.toString() 用于将整数转换为字符串对象。 BigInteger 的构造函数的参数为​​ String
  • 请注意,您无需将整数转换为字符串即可从中生成BigInteger。你可以说BigInteger b1 = BigInteger.valueOf((long)a);。由于BigInteger 将值存储为二进制整数数组,而不是十进制数字,因此避免字符串转换应该更有效(如果它在循环中完成数百万次可能很重要)。
  • 谢谢!这绝对是更好的解决方法。
猜你喜欢
  • 2023-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-15
  • 1970-01-01
  • 1970-01-01
  • 2019-12-18
相关资源
最近更新 更多