我怎样才能计算bigmod(bigmod(a ^ n)-bigmod(b ^ m))?

时间:2015-10-06 17:52:00

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

我想要计算

  

(a ^ n%k - b ^ m%k)%k

a ^ n b ^ m 可能非常大

  

Bigmod(bigmod(a ^ n)-bigmod(b ^ m))?

我试图计算 bigmod(a ^ n) - bigmod(b ^ m)然后使用 bigmod 作为减法结果然后我意识到它错了回答!  有什么计算吗?

#include<cstdio>
using namespace std;

template<class T>T big_mod(T n,T p,T m)
   {
     if(p==0)
       return (T)1;
      T x=big_mod(n,p/2,m);
         x=(x*x)%m;
         if(p&1)
          x=(x*n)%m;
           return x;
    }

int main()
{
   long long int a=37,b=26,m=10,n=20,mod=1000000008,x,y,z;
    x=big_mod(a,m,mod);
    y=big_mod(b,n,mod);
    z=((x%mod-y%mod)%mod);
     cout<<z;
}

1 个答案:

答案 0 :(得分:1)

How can i calculate bigmod(bigmod(a^n)-bigmod(b^m)) ?

让你的模数为k。你的表达相当于:

((a^n) % k - (b^m) % k + k) % k

您需要添加k,因为减法可能会导致否定结果。这将使其成为正面,而不会影响结果,因为k % k == 0

要计算(x^y) % k,请使用平方算法求幂,并确保在每一步都采用模数:

x^y % k = ((x^(y / 2))^2) % k if y is even
          (x*x^(y - 1)) % k   else

对于您的代码,假设其他一切正常,您只需更改此行:

z=((x%mod-y%mod)%mod);

到此:

z=((x%mod-y%mod+mod)%mod);