Pour utiliser exponentiation modulaire comme vous le feriez en utilisant l'option Test de primauté de Fermat avec de grands nombres (100 000+), cela demande de très grands calculs.
Lorsque je multiplie deux grands nombres (par exemple 62574 et 62574), PHP semble convertir le résultat en un flottant. Obtenir la valeur du modulus renvoie des valeurs étranges.
$x = 62574 * 62574;
var_dump($x); // float(3915505476) ... correct
var_dump($x % 104659); // int(-72945) ... wtf.
Existe-t-il un moyen de faire en sorte que PHP effectue ces calculs correctement ? Sinon, existe-t-il une autre méthode pour trouver les valeurs du module qui fonctionne pour les grands nombres ?
0 votes
Note : comme vous pouvez le voir dans le manuel officiel de PHP, dans les commentaires c'est parce que
%
utilise une enveloppe pour les entiers.0 votes
L'implémentation des nombres entiers de PHP est fatalement défectueuse dans la mesure où 1) elle est totalement dépendante de la plate-forme (endianess et taille des bits) 2) PHP n'utilise que des nombres entiers SIGNÉS et 3) si l'on sort de la plage des nombres entiers signés, la partie fatale entre en jeu, car elle sera convertir ce résultat en un flottant. Cela signifie que si vous faites 1 + 2147483647 sur un système 32 bits, vous obtiendrez un flottant, ce qui rend le conditionnement des données binaires "vraiment intéressant".
0 votes
Les utilisateurs modernes peuvent constater qu'ils ne peuvent pas reproduire ce comportement en utilisant les chiffres de la question sur leurs machines modernes et brillantes à 64 bits.
var_dump($x)
ils obtiennent un int et non un float . Cependant, s'ils essaient de faire$x = PHP_INT_MAX + 1
au lieu de$x = 62574 * 62574;
ils seront en mesure de reproduire le reste de la folie avec succès.0 votes
Peut-être que la technologie PHP s'est améliorée depuis ou que c'est une configuration PHP différente mais votre code fonctionne bien sur repl.it