Forum Programmation.php Modulo sur des gros nombres

Posté par  (site web personnel) .
Étiquettes : aucune
0
1
déc.
2004
Bonjour,
J'ai converti une fonction de chiffrement assez basique du Javascript vers le PHP, mais les résultats ne sont pas ceux que j'attends.
Il semble que PHP ait des difficultés pour calculer un modulo sur des grands nombres.

Voici l'extrait qui pose problème:

Javascript

Math.pow(M, e) % N


PHP

pow($M, $e) % $N


Avec les valeurs suivantes:
M = 76
e = 7
N = 306353

PHP me retourne -259931.
Javascript me retourne 129131.

Alors la question est: j'ai fait une connerie quelque part ou c'est un bug de PHP ?
Merci d'avance pour vos réponses éclairées.
  • # Controle de l'erreur.

    Posté par  . Évalué à 1.

    Selon la doc :
     7.50.45 pow()Expression exponentielle
    [ Exemples avec pow ]   PHP 3, PHP 4
    
    number  pow ( number   base , number   exp )
    
    pow retourne base élevé à la puissance exp . Si possible, pow retourne un integer .
    
    Si le calcul ne peut être fait, une alerte sera affichée et pow retournera FALSE .
    Quelques exemples avec pow
    
    
    <?php
    
    var_dump( pow(2,8) ); // int(256)
    echo pow(-1,20); // 1
    echo pow(0, 0); // 1
    
    echo pow(-1, 5.5); // error
    
    ?>
    
    Attention
    
    En PHP 4.0.6 plus ancien, pow retournait toujours un nombre à virgule flottante ( float ), et n'affichait pas d'alerte. Si le calcul est impossible (racine d'un nombre négatif, par exemple), pow retournait NAN .
    
    Voir aussi exp et sqrt . 
    pow ne retourne qu'un integer. Vérifie si pow ne te renvoie pas FALSE ( ou NAN ) selon la version que tu utilises.
  • # Entiers

    Posté par  (site web personnel) . Évalué à 3.

    La taille des entiers dépend de la plate-forme de support, mais la valeur maximale est généralement de 2 milliards et des poussières (c'est un entier signé de 32 bits). PHP ne supporte pas les entiers non signés.

    pow(76,6) est supérieur je pense à ce qui tient sur 32 bits...

    Si tu as le module bc pour gerer les grands entiers, essaye bcmod et bcpow, ou plus implement et plus efficacement bcpowmod directement.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.