Arbeiten mit großen Zahlen in PHP

Um die modulare Potenzierung so zu verwenden, wie Sie es bei der Verwendung des Fermat-Primalitätstests mit großen Zahlen (100.000+) benötigen würden, sind einige sehr umfangreiche Berechnungen erforderlich.

Wenn ich zwei große Zahlen multipliziere (z. B. 62574 und 62574), scheint PHP das Ergebnis in einen Gleitkomma zu casting. Das Erhalten des Moduluswerts von diesem gibt merkwürdige Werte zurück.

$x = 62574 * 62574; var_dump($x); // float(3915505476) ... correct var_dump($x % 104659); // int(-72945) ... wtf. 

Gibt es eine Möglichkeit, PHP dazu zu bringen, diese Berechnungen richtig durchzuführen? Gibt es alternativ eine andere Methode zum Finden von Modulwerten, die für große Zahlen funktionieren?

    Aus irgendeinem Grund gibt es zwei Standardbibliotheken in PHP, die die willkürlichen Längen- / Präzisionszahlen handhaben: BC Math und GMP . Ich persönlich bevorzuge GMP, da es frischer ist und eine reichhaltigere API hat.

    Basierend auf GMP habe ich die Decimal2-class zum Speichern und Verarbeiten von Währungsbeträgen implementiert ( zB 100,25 USD). Viele Mod-Berechnungen ohne Probleme. Getestet mit sehr großen Zahlen.

    benutze das

      $num1 = "123456789012345678901234567890"; $num2 = "9876543210"; $r = mysql_query("Select @sum:=$num1 + $num2"); $sumR = mysql_fetch_row($r); $sum = $sumR[0]; 

    hast du dir bcmod() ? PHP hat Probleme mit ganzen Zahlen über 2 ^ 31 – 1 auf 32-Bit-Plattformen.

     var_dump(bcmod("$x", '104659') ); // string(4) "2968" 

    Ich schlage vor, Sie versuchen BigInteger . Wenn das nicht funktioniert, können Sie SWIG verwenden , um C / C ++ – Code für die Berechnungen mit großen Ganzzahlen hinzuzufügen und ihn mit Ihrem Code zu verknüpfen.

    Ich habe eine andere Lösung gefunden, aber die Nummer wird als String gespeichert. Sobald Sie es auf einen numerischen Wert umwandeln, sind Sie auf die Genauigkeit der zugrunde liegenden Plattform beschränkt. Auf einer 32-Bit-Plattform kann das größte int, das Sie als int-Typ darstellen können, 2.147.483.647 lauten:

     /** * @param string $a * @param string $b * @return string */ function terminal_add($a, $b){ return shell_exec('echo "'.$a.'+'.$b.'"|bc'); } // terminal_add("123456789012345678901234567890", "9876543210") // output: "123456789012345678911111111100" 
     $x = 62574 * 62574; // Cast to an integer $asInt = intval($x); var_dump($asInt); var_dump($asInt % 104659); // Use use sprintf to convert to integer (%d), which will casts to string $asIntStr = sprintf('%d', $x); var_dump($asIntStr); var_dump($asIntStr % 104659); 

    Ich habe einen sehr kleinen Code für dich geschrieben, der bei großen Zahlen sicherlich funktioniert.

     < ?php $x = gmp_strval(gmp_mul("62574","62574")); // $x="3915505476" $mod=gmp_strval(gmp_mod($x,"104659")); //$mod="2968" echo "x : ".$x."
    "; echo "mod : ".$mod; /* Output: x : 3915505476 mod : 2968 */ ?>

    Sie müssen einfach Zeichenfolgen für die Speicherung großer Zahlen verwenden und damit arbeiten Sie GMP-functionen in PHP.

    Sie können einige gute GMP-functionen im offiziellen PHP-Handbuch hier http://php.net/manual/en/ref.gmp.php überprüfen