如何以指数形式获取值的模数

时间:2012-02-03 15:06:11

标签: math modulus

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

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

在StackOverflow上阅读了很多答案后,我使用了对数来完成它。

现在考虑将日志值设为1923.32877864。

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

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

修改 得到了解决方案:)

感谢duedl0r。

使用Modular Multiplicative Inverse指定的方式。谢谢:)

2 个答案:

答案 0 :(得分:1)

我不确定这是否真的可行且正确,但让我总结一下我的评论,并扩展Miky Dinescu的答案。

正如米奇已经写道:

  

a×b≣ m a m ×b m

您可以在平等中使用它:

  

90! / 10!^9≣ m x

计算每个词:

  

90! m / 10!^ 9 m m x

然后从10找到你的multiplicative inverse!^ 9 m 。然后将逆数乘以90! m


<强>更新 这似乎是正确的(至少对于这种情况:))。我和沃尔夫拉姆一起检查过:

(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

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

答案 1 :(得分:0)

我认为计算模m的排列总数的方法,其中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&lt; =&gt; 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计算。

当然,有效地实现算法来执行简化将是棘手的,所以最终必须有一种更好的方法让我现在不能使用。