簡體   English   中英

在C ++中處理非常大的整數

[英]Working with very large integers in c++

因此,基本上,我正在從事一個涉及一些涉及大量數字的代數表達式的項目。 並且使用標准運算符(int,long int,long long等)只是不會削減它。 我當前使用的代碼編寫為(並且是較大項目的一部分):

#include<iostream>
long int myPow(long int base, long int exponent, long int mod) {
    long int prod = 1;

    while (exponent > 0) {
        if (exponent & 1 == 1) {
            prod *= base;
            prod %= mod;
        }
        base *= base;
        base %= mod;
        exponent /= 2;
        }
    return prod;
}

int main () {
    long int a = myPow(2 , 1000, 100007);
    std::cout << a << std::endl;
    system("pause");
    return 0;
}

現在,我讀到可以使用GMP處理非常大的數字。 不幸的是,我對編程世界還是陌生的。 據我了解,GMP依賴於MinGW編譯器。 我目前正在運行Visual Studio 2015。

我瀏覽了不同的論壇和Google,但是(2014年之后)我找不到任何有關如何設置GMP(和/或與MinGW)的新指南,這意味着鏈接已斷開,引用不存在等。我也非常害怕開始篡改Windows / Visual Studio(嘗試“安裝”(?)MinGW),因為我不想丟失當前的工作安裝程序/編譯器(標准Visual Studio編譯器-不知道它是什么)稱為)。

無論如何,如果有人可以指出正確的方向或推薦一些文獻,將不勝感激。

作為最后的選擇,我正在考慮安裝Code :: Blocks(標准的MinGW ?!),但是我擔心它會破壞當前的Visual Studio設置嗎? 另一種可能性是使用Ubuntu創建虛擬機並在其上運行Code :: Blocks。 無論如何,它似乎相當廣泛,如果可能的話,我寧願留在Windows中使用VS。

看看Boost.Multiprecision以下代碼可在VS 2015上運行:

#include "boost/multiprecision/cpp_int.hpp"
#include <iostream>

namespace mp = boost::multiprecision;

typedef mp::number<mp::cpp_int_backend<4096, 4096, mp::signed_magnitude, mp::unchecked, void> >  int4096_t;

int4096_t myPow(int4096_t base, long int exponent, long int mod) {
    int4096_t prod = 1;

    while (exponent > 0) {
        if (exponent & 1 == 1) {
            prod *= base;
            prod %= mod;
        }
        base *= base;
        base %= mod;
        exponent /= 2;
    }
    return prod;
}



int main()
{
    int4096_t a = myPow(2, 1000, 100007);
    std::cout << a << std::endl;

    int i;
    std::cin >> i;
    return 0;
}

並顯示44850。例如,我定義了int4096_t整數類型(長度為4096位),但是您可以使用預定義的boost :: multiprecision :: int1024_t或其他合適的類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM