2017-03-13 5 views
0

Donc, fondamentalement, je travaille sur un projet impliquant des expressions algébriques impliquant de très grands nombres. Et en utilisant les opérateurs standard (int, long int, long long et ainsi de suite) ne suffit pas de le couper. Le code J'utilise actuellement est écrit (et fait partie d'un projet plus vaste):Travailler avec de très grands entiers en C++

#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; 
} 

Maintenant, je l'ai lu, il est possible d'utiliser les BPF pour traiter un très grand nombre. Malheureusement, je suis plutôt nouveau dans le monde de la programmation. Et comme je comprends, GMP s'appuie sur le compilateur MinGW. Je suis actuellement en cours d'exécution Visual Studio 2015.

J'ai parcouru différents forums et Google, mais je n'ai pas été en mesure de trouver de nouveaux guides (après 2014) sur la façon de configurer GMP (et/avec MinGW), ce qui signifie que les liens sont rompus, les références inexistantes, etc. J'ai également peur de commencer à falsifier Windows/Visual Studio (en essayant de "installer" (?) MinGW), car je ne veux pas perdre mon travail actuel setup/compiler (compilateur Visual Studio standard - aucune idée de ce que l'on appelle). Quoi qu'il en soit, si quelqu'un pouvait me diriger dans la bonne direction ou recommander de la documentation, ce serait grandement apprécié. En dernier recours, j'envisage d'installer Code :: Blocks (standard MinGW?!), Mais je crains que cela ne gâche mon installation actuelle pour Visual Studio? Une autre possibilité serait de créer une machine virtuelle avec Ubuntu et d'y exécuter Code :: Blocks. Quoi qu'il en soit, il semble assez vaste et je préférerais rester dans Windows avec VS - si possible.

+1

Jetez un oeil à: http://stackoverflow.com/questions/19688442/how-to-install-mpfr-and-gmp-for-c-on-visual-studio –

+0

@RichardCritten Bonjour Richard. J'ai déjà vu ce fil. Mais cette solution repose sur (citation): des binaires "relativement sans bug". Il ne prend également en charge que les systèmes 32 bits, ce qui semble être un gâchis lorsque l'on travaille avec de très grands nombres. En tout cas, j'espérais une "meilleure" solution, mais merci pour votre réponse. – bgaard

Répondre

1

Jetez un oeil à Boost.Multiprecision Le code suivant fonctionne sur 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; 
} 

et imprime 44850. I défini int4096_t type entier (longueur 4096 bits) par exemple, mais vous pouvez utiliser l'amplification prédéfini :: multiprecision :: int1024_t ou un autre type approprié.

+0

C'est incroyable! Je vous remercie. Si quelqu'un d'autre est intéressé, vous pouvez commencer ici (leur page web n'est pas trop intuitive): http://www.boost.org/doc/libs/1_63_0/more/getting_started/windows.html – bgaard