加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 不使用Math.BigInteger的高功率模数

发布时间:2020-12-15 04:48:37 所属栏目:Java 来源:网络整理
导读:我必须把这个公式变成 java代码: 如果我可以使用像Math.BigInteger这样的库会更容易,但遗憾的是我应该在没有它的情况下这样做. stackoverflow上的一些类似问题建议编写一个自己的bignum库,但我想在没有它的情况下这样做. 现在,我的进展是在这一步: int h(S
我必须把这个公式变成 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的幂,那么hash取决于(最多)前4个字符,这显然很糟糕.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读