我如何取两个非常大的数的模数?

时间:2010-10-22 17:10:37

标签: algorithm math

我需要一个带有

的A mod B的算法
  1. A是一个非常大的整数,只包含数字1(例如:1111,111111111111111)
  2. B是一个非常大的整数(例如:1231,1231231823127312918923)
  3. 大,我的意思是1000位数。

4 个答案:

答案 0 :(得分:5)

要计算数字mod n,给定一个除以(n + 1)得到商和余数的函数,首先在数字上加1。然后,只要数字大于'n',迭代:

number = (number div (n+1)) + (number mod (n+1))
最后,最后减去一个。在开头添加一个并在结尾减去一个的替代方法是检查结果是否等于n,如果是则返回零。

例如,给定一个除以10的函数,可以计算出12345678 mod 9:

12345679 -> 1234567 + 9
 1234576 -> 123457 + 6
  123463 -> 12346 + 3
   12349 -> 1234 + 9
    1243 -> 124 + 3
     127 -> 12 + 7
      19 -> 1 + 9
      10 -> 1

减1,结果为零。

答案 1 :(得分:4)

1000位数字不是很大,使用任何大整数库来获得相当快的结果。

如果你真的担心性能,对于某些n,A可写为1111 ... 1 =(10 n -1)/ 9,因此计算A mod B可以简化为计算((10 ^ n-1)mod(9 * B))/ 9,你可以do that faster

答案 2 :(得分:3)

尝试蒙哥马利减少如何找到大数的模数 - http://en.wikipedia.org/wiki/Montgomery_reduction

答案 3 :(得分:2)

1)只需找到一个执行任意精度算术的语言或包 - 在我的例子中,我会尝试java.math.BigDecimal。

2)如果你自己这样做,你可以避免使用加倍和减法进行除法。例如。 10 mod 3 = 10 - 3 - 3 - 3 = 1(重复减去3直到你不能再多了) - 这是非常慢的,所以加倍3直到它小于10(例如到6),减去离开4,并重复。