C++ 使用C+计算大数的乘法逆+;

C++ 使用C+计算大数的乘法逆+;,c++,C++,我试图计算一个大数的乘法逆,另一个大数。例如,我想计算6003722857 mod 77695236973的乘法逆。我写了一些C++代码来做这个。它适用于小数字,如a=1891和n=3797,但一旦我尝试了非常大的数字,程序就不起作用了。没有错误。看起来它在计算一些东西,但是程序就这样结束了 如有任何建议,将不胜感激。谢谢 #include <iostream> using namespace std; int main () { long long int a = 0, n

我试图计算一个大数的乘法逆,另一个大数。例如,我想计算6003722857 mod 77695236973的乘法逆。我写了一些C++代码来做这个。它适用于小数字,如a=1891和n=3797,但一旦我尝试了非常大的数字,程序就不起作用了。没有错误。看起来它在计算一些东西,但是程序就这样结束了

如有任何建议,将不胜感激。谢谢

#include <iostream>

using namespace std;

int main ()
{
  long long int a = 0, n = 0;
  cout << "Enter a: ";
  cin >> a;
  cout << "Enter n: ";
  cin >> n;

  for (long long int c = 1; c < n; c++) {
   long long int num = a*c - 1;
    if (num%n == 0) {
      cout << "The multiplicative inverse is " << c << "." << endl;
      break;
    }
  }
  return 0;
}
#包括
使用名称空间std;
int main()
{
长整型a=0,n=0;
cout>a;
cout>n;
for(长整型c=1;ccout您可以使用扩展的欧几里德算法执行此操作:


这里是用超高速c++编写的:

#include <iostream>
#include <utility>
#include <exception>
#include <tuple>

using namespace std;

using temp_t = std::tuple<long long, long long>;

long long calcInverse(long long a, long long n)
{
    long long t = 0, newt = 1;
    long long r = n, newr = a;  
    while (newr != 0) {
        auto quotient = r /newr;
        tie(t, newt) = make_tuple(newt, t- quotient * newt);
        tie(r, newr) = make_tuple(newr, r - quotient * newr);
    }
    if (r > 1)
        throw runtime_error("a is not invertible");
    if (t < 0)
        t += n;
    return t;
}

int main ()
{
  long long int a = 6003722857 , n = 77695236973;
/*
  cout << "Enter a: ";
  cin >> a;
  cout << "Enter n: ";
  cin >> n;
  */
  try {
    auto inverse = calcInverse(a, n);
    cout << "The multiplicative inverse is " << inverse << endl;
  }
  catch(exception& e) {
      cout << e.what() << endl;
  }
  return 0;
}
#包括
#包括
#包括
#包括
使用名称空间std;
使用temp\u t=std::tuple;
长诗(长a,长n)
{
长t=0,牛顿=1;
长r=n,新r=a;
while(newr!=0){
自动商=r/newr;
tie(t,newt)=构成元组(newt,t-商*newt);
tie(r,newr)=make_tuple(newr,r-商*newr);
}
如果(r>1)
抛出运行时错误(“a不可逆”);
if(t<0)
t+=n;
返回t;
}
int main()
{
长长整型a=6003722857,n=77695236973;
/*
cout>a;
cout>n;
*/
试一试{
自动反转=反向(a,n);

你可能会溢出变量。尝试使用“bignum”库,例如。你是如何运行程序的?(你用什么编译它?)“just ends”似乎是一个令人惊讶的结果。对我来说(使用VS2013),它只是挂起,就像在如此大的搜索空间上爬行时所预期的那样。如果程序“just ends”,可能是c>=n吗?如果这不是预期的情况,可能是@JoachimPileborg建议的。它可以工作,但速度非常慢。没有办法在多个线程中运行问题吗?你使用了哪个输入导致了问题?请更清楚地定义“非常大的数字”!刚刚意识到临时的定义是不必要的。Tha谢谢你。我有我自己的扩展欧几里德算法版本,虽然没有你的干净。最坏的情况是两个最大的斐波那契数:<2^63 a=466004661037530309,n=7540113804746346429,需要90个循环。在这种情况下,(1/a mod n)==a。<2^63的最大素数是2^63-25=9223372036854775783,它对9223372036854775782的每个数字1都有一个倒数。