【问题标题】:how to get modulo of a value in exponential form如何以指数形式取模
【发布时间】:2023-03-16 17:35:01
【问题描述】:

问题是关于非常大数的模运算符。

例如考虑一个要计算排列总数的问题。 考虑一个 90 位数字,9 个数字(1 到 9)中的每一个都重复 10 次 所以要计算90!/(10!)^9)

在阅读了 StackOverflow 上的许多答案后,我使用了对数。

现在考虑日志值为 1923.32877864。

现在我的问题是如何显示以“m”为模的答案(即 10 ^ log10(value) )?

这是计算可能排列数的最佳方法吗?

编辑 得到了解决方案:)

感谢 duedl0r。

按照您使用模乘逆指定的方式进行操作。谢谢 :)

【问题讨论】:

  • m 是适合 31 位的整数吗?
  • m 的质数,还是至少与10! 互质?
  • 是的,它适合 31 位 .. 最多 10^9 。
  • m 是 10^9+7 对于这个特定的问题(它来自一个 spoj 网站)
  • 如果您确实需要整数模数,那么使用对数是错误的方法。请注意,结果将是一个整数,因此您可以只使用一个大整数形式。

标签: math modulus


【解决方案1】:

我不确定这是否真的可能和正确,但让我总结一下我的 cmets 并扩展 Miky Dinescu 的答案。

正如米奇已经写的那样:

a × b ≣m am × bm

你可以在你的平等中使用它:

90! / 10!^9 ≣m x

计算每一项:

90!m / 10!^9mm x

然后从 10!^9m 中找出您的 multiplicative inverse。然后乘以 90!m.


更新 这似乎是正确的(至少在这种情况下:))。我检查了 wolfram:

(90!/10!^9) mod (10^9+7) = 998551163

这导致相同的结果:

90! mod (10^9+7) = 749079870
10!^9 mod (10^9+7) = 220052161

做相反的事情:

(220052161 * x) mod(10^9+7) = 1 = 23963055

然后:

(749079870*23963055) mod (10^9+7) = 998551163

没有证据,但有一些证据表明它可能有效:)

【讨论】:

  • 得到了解决方案 :) 感谢 duedl0r。是按照你指定的方式使用模乘逆吗谢谢:)
【解决方案2】:

我认为计算排列的总数以m为模的方法是使用以下属性:

 (a * b) % m = ((a % m) * (b % m)) % m

考虑到N的排列总数为N! = 1 * 2 * 3 * .. * N,如果你需要计算N! % m,你基本上可以应用上面的性质进行模m乘法,你有:

 ((((1 * (2 % m)) % m) * (3 % m)) % m) * .. 

编辑

为了计算 90! / (10! ^ 9) 值,您可以简化因子,然后使用乘法模 m 计算最终结果模 m。

这就是我的想法:

90! = 10! * (11 * 12 * .. * 20) * (21 * 22 * .. * 30) * .. * (81 * 82 * .. * 90)

然后你可以将原来的表达式改写为:

(10! * (11 * 12 * .. * 20) * (21 * 22 * .. * 30) * .. * (81 * 82 * .. * 90)) / (10!* 10! * ... * 10!)

在分子处,您有 9 个因子的乘积 - 将括号中的每个表达式视为一个因子。分母也是如此(您有 9 个因子,每个因子等于 10!)。

分母的第一个因素很容易简化。之后你还有 8 对需要简化。

因此,您可以考虑乘积的每个术语并简化分母。例如:

11 * 12 * 13 * 14 * 15 * 16 * 17 * 18 * 19 * 20 11 * 2 * 2 * 3 * 13 * 2 * 7 * 3 * 5 * 2 * 2 * 2 * 2 * 17 * 2 * 9 * 2 * 2 * 5

分母永远是:2 * 3 * 2 * 2 * 5 * 2 * 3 * 7 * 2 * 2 * 2 * 2 * 3 * 3 * 2 * 5

简化后第二对减少为:2 * 2 * 11 * 13 * 17 * 19

同样的方法可以应用于每个后续对,您最终会得到一个简单的乘积,可以使用上面的公式以 m 为模计算。

当然,有效地实现算法来执行简化是很棘手的,所以最终必须有一个更好的方法让我现在无法理解。

【讨论】:

  • 你如何用这个计算90!/10!^9(90! % m) / 10!^9 看起来不正确.. 或者即使您使用 10^1923.32 也会遇到问题,因为 1923.32 不是偶数..
  • 正如 duedl0r 所说的那样。这就是我面临的问题。我如何处理除法.. 如果完成,主要是它的结果 0,作为分子
  • 我认为你可以乘以 10!^9。但是这个解决方案中没有提到它......像这样的东西:90!%m = x *(10!^ 9%m)%m。然后搜索x :)
  • 也许你甚至可以使用 euler 得到逆.. en.wikipedia.org/wiki/Modular_multiplicative_inverse
  • 嗯,我想我错过了你的问题@anudeep2011 的一个重要方面。我记得有一种用非整数指数计算模幂的方法,但我不记得它到底是怎么回事。整数指数的模幂运算很容易..
猜你喜欢
  • 2021-05-25
  • 1970-01-01
  • 2021-11-28
  • 1970-01-01
  • 1970-01-01
  • 2016-07-13
  • 1970-01-01
  • 1970-01-01
  • 2021-01-07
相关资源
最近更新 更多