【问题标题】:How can i calculate bigmod(bigmod(a^n)-bigmod(b^m))?我如何计算 bigmod(bigmod(a^n)-bigmod(b^m))?
【发布时间】:2015-10-06 17:52:00
【问题描述】:

我要计算

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

a^nb^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;
}

【问题讨论】:

  • 我也会感兴趣。是不是这个:golammostaeen.wordpress.com/2012/10/20/big-mod-algorithm
  • @Nidhoegger 是的,对!
  • 请显示一些代码并添加编程语言的标签。我们不会为您完成这项工作,但我们会帮助您找出错误...
  • 请编辑您的问题以解释bigmod 在此上下文中的含义。
  • 我猜你的模运算符会在你没想到的时候返回负数。

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


【解决方案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);

【讨论】:

  • 但我必须计算 a^n 和 b^n 的模数。
  • @CodeHead 是的,我写了如何做到这一点。更多详情,您还获得了这个链接:golammostaeen.wordpress.com/2012/10/20/big-mod-algorithm
  • @CodeHead 我添加了您应该将代码更改为的内容。请看看是不是这样。
猜你喜欢
  • 2020-07-20
  • 2015-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多