簡體   English   中英

求兩個非常大的數與一個非常大的數相乘的模數

[英]Finding Modulus of multiplication of two very large number with a very large number

在編程練習中,我需要找出一個非常大的模數,例如2提高到500000(輸入中的最大數)的冪,其中1000000007作為其他計算的一部分。

我可能必須找出很多次,一種方法是創建一個5,00,000的數組。 但是它將阻塞大量的內存,所以我想知道還有更好的方法嗎?

這是使用重復平方算法的絕佳時機。 您可以如下計算x y (模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 ,因此,如果模數不太大,則可以使用plain int進行計算。

希望這可以幫助!

像這樣簡單的東西怎么樣?:

#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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM