java - 不使用 Math.BigInteger 的高幂模

标签 java math modulo exponent

我必须将这个公式转换成 java 代码:

如果我可以使用诸如 Math.BigInteger 之类的库,那会容易得多,但不幸的是,没有它我应该这样做。 stackoverflow 上的一些类似问题建议编写一个自己的 bignum 库,但我想在没有它的情况下进行。

目前,我的进度是在这一步:

int h(String s) {
  long value = 1;
  int mod = ht.length;

  for (int i=0; i < s.length()-1; i++) {
     h += s.charAt(i) * Math.pow(256,i);
  }
  return (int) h % mod;
}

我知道幂的值很快就会超出整数范围,所以我考虑编写一个自己的方法来计算该值的幂和模。我的数学知识还不够好,不知道何时使用模数以及如何简化事情。

提前致谢!

最佳答案

如果你从后面走,你根本不需要任何权力。在每一步简单地乘以 256 将产生相同的效果(后面的值“累积”更多的乘法,将它们提高到所需的幂)。例如(未测试)

int h(String s) {
  int res = 0;
  int n = ht.length;

  for (int i = s.length() - 1; i >= 0; i--) {
     // using a long here to prevent premature wrapping
     long t = res * 256L + s.charAt(i);
     res = (int)(t % n);
  }
  return (res + 1) % n;
}

另请注意,ht.length 不应为 2 的幂(因此您不能跳过循环中的模约减,如果 ht.length 2 的幂),因为如果它是 2 的幂,那么哈希值(至多)取决于前 4 个字符,这显然很糟糕。

关于java - 不使用 Math.BigInteger 的高幂模,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41428384/

相关文章:

c# - 模数运算如何与 float 数据类型一起使用?

c - 对于非零 "(a/b)*b + a%b - a",表达式 'b' 在 C 中如何始终为零?

c++ - 模数最接近零

java - super 油漆组件没有出现(我已经尝试了一切)

java - 对在构造函数中使用 Parent to Child 感到困惑

javascript - 三个JS轨道相机短旋转

c++ - 如何将欧拉角转换为方向 vector ?

javascript - 计算太阳的赤经和赤纬

java - 如何获取对匿名对象的引用 2 级

java - 相当于 Java 中的 C# Action() 委托(delegate)吗?