2016-06-09 16 views
0

Ich habe eine große Zahl, die ich den Rest nehmen möchte. Zum Beispiel 300^31. Wenn ich versuche, % Operator zu verwenden, sagt es, dass ich es nicht im Doppel verwenden kann, da es nur für Ganzzahlen funktioniert. Gibt es eine Funktion für diese Berechnung?Modulo für große Zahlen, die quadriert werden

Ich versuchte a=pow(b,x)%d;

+8

Sind Sie versuchen, genaue Berechnungen über die ganzen Zahlen (zB für Kryptographie) zu tun? Wenn dies der Fall ist, werden Sie keine eingebaute C++ Funktion dafür finden, und Sie werden keine Art von Gleitkomma-Approximation wollen. Versuchen Sie nach "modular exponentiation" zu suchen und Sie werden einige relativ einfache Methoden finden, um das zu erreichen, was Sie wollen, ohne die enormen Zwischenwerte erzeugen zu müssen. –

Antwort

0

Ich denke, es ist besser zu nehmen Rest zu verwenden, während Sie zu potenzieren versuchen. Sie können Big Modulo Algorithm verwenden. Es wird Ihnen helfen, große Zahlen zu vermeiden. Und danach können Sie einfach lange statt doppelt verwenden.

Ich versuche, diesen Code in Codeblöcken 16,01 (codeblocks-16.01mingw-setup.exe) zu schreiben und es funktioniert ziemlich gut (mein Code etwas anders als der Link-Code, aber es das gleiche Konzept hat):

#include<iostream> 
using namespace std; 

int bmod = 33; 

int bigmod(long long int x,long long int b){ // x^b 
    int ans=1; 
    while(b){ 
     if(b%2)ans=((long long)ans*x)%bmod; 
     b=b>>1; 
     x=((long long)x*x)%bmod; 
    } 
    return ans;} 

int main(){ 
    cout<<bigmod(300,31); 
} 
+0

mein C++ unterstützt nicht lange lang, ich benutze Codeblocks, jede Idee, wie das zu beheben? – Sick654

+0

ernst? impossible, long long int ist ein integrierter Datentyp – malioboro

+0

| 11 | Fehler: ISO C++ 1998 unterstützt 'long long' nicht – Sick654

1

Wenn b, x und d passen in ganzen Zahlen, können Sie

int expoModulo(int b, int x, int d) { 
    int a = 1; 
    for(int i=0; i<x; i++) { 
     a = (a*b)%d; 
    } 
    return a; 
} 
Verwandte Themen