【问题标题】:Digit wise modulo for calculating power function for very very large positive integers用于计算非常非常大的正整数的幂函数的数字模数
【发布时间】:2014-08-04 11:12:32
【问题描述】:

您好,我正在编写代码来计算 P^Q 的位置

P, Q are positive integers which can have number of digits upto 100000

我想要的结果是

result = (P^Q)modulo(10^9+7)

例子:

P = 34534985349875439875439875349875 
Q = 93475349759384754395743975349573495
Answer = 735851262

我尝试过使用这个技巧:

 (P^Q)modulo(10^9+7) = (P*P*...(Q times))modulo(10^9+7)

 (P*P*...(Q times))modulo(10^9+7) = ((Pmodulo(10^9+7))*(Pmodulo(10^9+7))...(Q times))modulo(10^9+7)

由于 P 和 Q 都非常大,我应该将它们存储在一个数组中,并逐位取模。

是否有任何有效的方法可以做到这一点,或者我缺少一些数论算法?

提前致谢

【问题讨论】:

  • 如果你决定存储在数组上,你可以使用 BCD 编码来节省内存。
  • @JoachimPileborg 谢谢。它看起来很有趣,但由于数字 (10^9) 是一个素数并且这个问题涉及一个素数模数,我有一种直觉,我忘记了一些数论定理可能会在这里有所帮助。我正在寻找一些数论技巧,因为这个问题更多的是关于数学技巧而不是编程范式。
  • 那么也许你应该像math.stackexchange.com那样代替?
  • @JoachimPileborg 感谢您的指出。我没有意识到这一点。我已经在那里发布了这个问题。

标签: c++ algorithm math modulo number-theory


【解决方案1】:

这是一个相当有效的方法:

1)计算 p1 = P 模 10^9 + 7

2)计算 q1 = Q 模 10^9 + 6

3) 那么 P^Q 模 10^9 + 7 等于 p1^q1 模 10^9 + 7。由于费马小定理,这个等式成立。请注意,p1 和 q1 足够小以适合 32 位整数,因此您可以使用标准整数类型实现二进制指数(对于中间计算,64 位整数类型就足够了,因为初始值适合 32 位)。

【讨论】:

  • 是的,费马的小家伙
猜你喜欢
  • 1970-01-01
  • 2020-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-15
  • 1970-01-01
  • 2011-12-17
  • 1970-01-01
相关资源
最近更新 更多