Problem mit einem Förmelchen



  • Vorsicht es folgt vermutlich ein Anfängerproblem!!!

    Ich versuche gerade folgende Formel in C++ umzusetzen (ich benutze den C++Builder von Borland, der 1997 erschienen ist):

    M = (C hoch d) modulo N

    Da es sich um sehr große Zahlen dreht benutze ich den Datentyp long double

    Wenn ich die Werte C = 11, d = 23 und N = 187 einsetze, weiß ich, dass M den Wert 88 hat.

    Der Computer spuckt nach eingabe folgender Zeilen allerdings M = 168 aus:

    long double C,d,N,M;
    C=11;
    d = 23;
    N = 187;
    M = fmodl(powl(C,d),N);

    Noch erschreckender ist, dass wenn ich den Datentyp auf double abändere und bei den Funktionen das l wegenehme, ich als Ergebnis M = 149 bekomme.

    ICH WILL ABER M=88

    Hiiiiiiiiiiiiiillllllllllllllllffffffffffffeeeeeeeeeeeeeeeee

    Vielen dank schonmal im voraus

    MrFox



  • Rundungsfehler.

    Bye, TGGC \-/



  • inline u32 mulMod(u32 a,u32 b,u32 m){
    	return u64(a)*b%m;
    }
    inline u32 powMod(u32 a,u32 b,u32 m){
    	u32 x=1;
    	while(b!=0){
    		while((b%2)==0){
    			b/=2;
    			a=mulMod(a,a,m);
    		}
    		--b;
    		x=mulMod(x,a,m);
    	}
    	return x;
    }
    


  • MrFox schrieb:

    Da es sich um sehr große Zahlen dreht benutze ich den Datentyp long double

    Wenn ich die Werte C = 11, d = 23 und N = 187 einsetze, weiß ich, dass M den Wert 88 hat.

    nein, es dreht sich nicht um große zahlen. du musst das 11^23 gar nicht berechnen.

    #include <iostream>
    
    int xHochMod( int value, int exp, int mod )
    {
        int result = (exp % 2) ? (value % mod) : 1;
        while( exp /= 2 )
        {
            value = (value * value) % mod;
            if( exp % 2 )
                result = (result * value) % mod;
        }
        return result % mod;
    }
    
    int main( )
    {
        std::cout << xHochMod( 11, 23, 187 );
    }
    

    edit: ohgott, bin viel zu spät. hab volkards post gar nicht gesehen 😮



  • man kann es nicht oft genug sagen.


Anmelden zum Antworten