找到一个范围的pow(a ^ b)modN

时间:2013-08-04 09:17:18

标签: c algorithm math modulo

对于给定的bN以及一系列a(0...n)

我需要找ans(0...n-1) 在哪里,

{p> ans[i] = a's

pow(a, b)modN == i的否

我在这里搜索的是pow(a,b)modN可能会在a范围内重复,以减少计算时间。

实施例: -

如果b = 2 N = 3n = 5

for a in (0...4):
    A[pow(a,b)modN]++;

这样就是

pow(0,2)mod3 = 0
pow(1,2)mod3 = 1
pow(2,2)mod3 = 1
pow(3,2)mod3 = 0
pow(4,2)mod3 = 1

所以最终结果将是:

ans[0] = 2 // no of times we have found 0 as answer .

ans[1] = 3

...

2 个答案:

答案 0 :(得分:1)

您的算法的复杂度为O(n)。 这意味着当n变大时需要花费很多时间。

您可以使用算法O(N)获得相同的结果。 如N <&lt;它会减少你的计算时间。

第一,两个数学事实:

pow(a,b) modulo N == pow (a modulo N,b) modulo N

if (i < n modulo N)
   ans[i] = (n div N) + 1
else if (i < N)
   ans[i] = (n div N)
else
   ans[i] = 0

因此,解决问题的方法是使用以下循环填充结果数组:

int nModN = n % N;
int nDivN = n / N;
for (int i = 0; i < N; i++)
{
    if (i < nModN)
        ans[pow(i,b) % N] += nDivN + 1;
    else
        ans[pow(i,b) % N] += nDivN;
}

答案 1 :(得分:0)

您只能为素数计算pow,并使用pow(a*b,n) == pow(a,n)*pow(b,n)

因此,如果pow(2,2) mod 3 == 1pow(3,2) mod 3 == 2,则pow(6,2) mod 3 == 2