查找具有非常大数的两个非常大的数的乘法模数

时间:2013-04-03 02:47:45

标签: c algorithm data-structures

在编程练习中,我需要找出一个非常大的模数,例如2加到500000(输入的最大数),其中1000000007作为其他计算的一部分。

由于我可能需要多次发现,一种方法是创建一个5,00,000的数组。但它会的 阻止大量内存,所以我想知道有更好的方法吗?

2 个答案:

答案 0 :(得分:5)

这是使用repeated squaring algorithm的绝佳时机。您可以按如下方式计算x y (mod modulus):

int repeatedSquaring(int x, int y, int modulus) {
    if (y == 0) return 1;
    int val = repeatedSquaring(x, y / 2);
    val = (val * val) % modulus;

    if (y % 2 == 1) {
        val = (val * x) % modulus;
    }

    return val;
}

该算法仅需要O(log y)乘法和模数来计算。此外,每个中间值最多为modulus 2 ,因此如果您的模数不是太大,您可以使用普通int来进行计算。

希望这有帮助!

答案 1 :(得分:0)

这样简单的事情怎么样?:

#include <stdio.h>

unsigned long PowMod(unsigned long p)
{
  unsigned long prod;

  if (p == 0)
    return 1;
  if (p == 1)
    return 2;

  prod = PowMod(p / 2);
  prod = (unsigned long long)prod * prod % 1000000007ULL;
  if (p % 2 != 0)
  {
    prod = prod * 2 % 1000000007ULL;
  }

  return prod;
}

int main(void)
{
  printf("%lu\n", PowMod(3));
  printf("%lu\n", PowMod(4));
  printf("%lu\n", PowMod(30));
  printf("%lu\n", PowMod(31));
  printf("%lu\n", PowMod(32));
  printf("%lu\n", PowMod(33));
  return 0;
}

输出(ideone):

8
16
73741817
147483634
294967268
589934536