模数操作的数量非常大

时间:2016-07-22 15:44:45

标签: javascript algorithm math modulo

如果不能采用模幂运算方法,你将如何在相当大的数上执行模运算?

例如,采用此素数模运算:

6864797660130609714981900799081393217269435300143305409394463459185543183
3976560521225596406614545549772963113914808580371219879997166438125740282
91115057151 % 4

WolframAlpha告诉我它3.这太棒了,但我想写一个算法,以便我自己的计算器应用程序可以处理。

我假设对于如此大的数字,我会将数字存储在一个数组中,每个数字一个元素。

2 个答案:

答案 0 :(得分:5)

我没有足够的声誉来评论,但这两个人说,你只能查看最后的数字是错误的,例如以%7为例 - 你总是要查看所有数字。

你可能知道(a + b)%n =(a%n + b%n)%n和(a * b)%n =(a%n * b%n)%n使用我们可以首先计算1%n,10%n,100%n等等,然后将这些值乘以您的数字中的数字,最后将它们加在一起。

我是用c ++编写的:

//assume we have number of length len in reversed order
//example: 123%9 -> n = 9, num[0] = 3, num[1] = 2; num[2] = 1, len = 3
int mod(int n, int num[], int len)
{
    int powersOf10modn = 1;
    int anwser = 0;
    for(int i = 0; i < len; i++)
    {
        anwser = (anwser + powersOf10modn * num[i]) % n;
        powersOf10modn = (powersOf10modn*10) % n;
    }
    return anwser;
}

答案 1 :(得分:-2)

如果你有一个像:xyz%n的数字,你只需要做yz%n。 您需要n%10 + 1个最后数字才能使您的操作获得最佳效果。