【问题标题】:BigInteger modPow with BigDecimal exponentBigInteger modPow 与 BigDecimal 指数
【发布时间】:2020-09-17 14:17:33
【问题描述】:

我需要一个 BigInteger modPow 的计算,但使用 BigDecimal 作为指数。

在这种情况下,无法转换为 double 或使用 BigDecimal.pow 然后 mod,因为没有 mod 的完整结果将不适合内存。 (并且 double 缺乏精度) 因此,转换为具有适当规模的 BigInteger 也是不可能的。

我没有找到图书馆或类似的图书馆。

在数学上是否有可能在不计算完整幂之前使用分数指数进行有效的 modPow?

编辑: 示例

BigInteger base = BigInteger.valueOf("101");
BigDecimal exp = BigDecimal.valueOf("24.387207613444534);
BigInteger mod = BigInteger.valueOf("10403");

BigInteger result = base.modPow(exp, mod)

这些样本数量非常少,预期用途需要更大的样本。 它应该提供一个本身太大而无法保存在 RAM 中的数字的 mod,但是 log 和整数除数是已知的。

【问题讨论】:

  • ...BigInteger modPow 的计算,但使用 BigDecimal 作为指数... 这在数学上对您意味着什么?这似乎是一个XY problem。根据我能想到的最合理的定义,这涉及计算模数的 10 次根,它们甚至可能不存在。
  • 您能否给出输入示例以及这些输入的预期输出?远不清楚您要问的内容在数学上是明确定义的。这是用来干嘛的? (顺便说一句,你也没有提到一种语言。Java?)举个例子,你希望modPow(5, 3.2, 7) 产生什么,为什么?
  • @MarkDickinson 提供的示例。我是基于java的,但这并不重要。对于您的示例,我希望结果为 4,因为 5^3.2 = 172,... mod 7 = 4
  • 所以你要扔掉小数部分?也就是说,你想要integer_part_of(base ^ exponent) mod modulus
  • @MarkDickinson 是的。

标签: java math bigdecimal pow mod


【解决方案1】:

所以我在此期间找到了一种方法。 base ^ (floor(exp - 1)) 作为常规 modPow 乘以 基础 ^ (1+ (exp - floor(exp)) 然后地板和模组。 因子 1.x 的最后一次求幂仍然足够小,可以放入 RAM。

【讨论】:

  • 这不起作用。以这种方式获得的结果与使用int(base ^ exponent) % modulus 不同。您可以使用一些小示例轻松测试来检查这一点。从本质上讲,实数模模并没有像整数模模那样好的算术结构。
  • 是的,你是对的。它只是巧合地适用于我尝试这种方法时使用的示例。
  • 老实说,我同意 James Polk 的观点:这似乎是一个 XY 问题。您所描述的操作在数学上是一个非常特殊的操作(与整数 modpow 不同,它是常见且自然的),我怀疑它是否真的是您想要或需要的操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-09
  • 1970-01-01
  • 2021-07-13
  • 1970-01-01
  • 2019-05-29
相关资源
最近更新 更多