2017-11-29 5 views
0

Ich habe nur eine kleine Frage: Warum bekomme ich das Ergebnis von 25, wenn ich 13^30 mod 31 in Java berechne? Das Ergebnis sollte 1 sein. Thx für die Antwort im Voraus. p.s. Ich schrieb den Code auf https://www.compilejava.net/Pow() Funktion mit den Parametern 13 und 30 fehlgeschlagen

import java.lang.Math; 
public class HelloWorld 
{ 
    public static void main(String[] args) 
    { 
    System.out.println(calculateModulo()); 

    } 

    public static String calculateModulo(){ 

    String res = new String(); 

    for (int i = 1; i < 31; i++){ 
     for (int j = 1; j < 31; j++){ 

      double var = Math.pow((double)i, (double)j); 


     if (j == 30) { 
      System.out.println("adding: "+i); 
      res = res + " " + i; 
      } 
      if (var % 31 == 1) { 
      System.out.println("The number " + i +" to the power of "+j +" modulo 31 results in "+var % 31); 
      break; 
      } 

     } 
    } 
    System.out.println(Math.pow(13,30)+"   "+(Math.pow(13,30)%31)); // why is the output of this "2.619995643649945E33   25.0" 
    return res; 
    } 
} 
+1

Die Nummer ist zu groß, um genau intern gespeichert zu werden. Was Sie bekommen, ist hier ein rundes Ergebnis. Sie können Ihr Glück mit der 'BigInteger'-Klasse versuchen oder eine intelligentere Methode entwickeln, um den Modul dieser Zahl zu berechnen. – Sirko

+0

Vielleicht @ @ Jon Skeet post https://stackoverflow.com/questions/11317875/finding-really-big-power-of-a-number. Wenn alles andere fehlschlägt, eine einfache Funktion wie pow zu erstellen, die mit großen Zahlen arbeitet, wie Sie möchten, könnte eine Idee sein. – SimperT

Antwort

1

Sie sind die Ergebnisse dieser Operationen in double s zu speichern. Beachten Sie, dass double nur 64 Byte lang ist. Es ist nicht möglich, das Ergebnis von 13 genau in 64 Bytes zu speichern. Und nein, der Compiler wird das auch nicht mit Tricks berechnen können. Siehe Is floating point math broken?

BigInteger mit Versuchen:

BigInteger a = new BigInteger("13"); 
BigInteger b = a.pow(30); 
BigInteger c = b.mod(new BigInteger("31")); 
System.out.println(c); 
1

Die Nummer, die Sie nach 13^30 erhalten zu groß ist in int oder double zu halten, so dass Sie BigInteger hierfür verwenden. Wenn Sie dies wirklich berechnen möchten, können Sie Folgendes tun:

BigInteger bf = new BigInteger("13"); 
BigInteger bf1 = new BigInteger("30"); 
BigInteger bf2 = new BigInteger("31"); 
BigInteger p =bf.pow(30); 
System.out.println(p.mod(bf2)); 
Verwandte Themen