2014-07-09 11:05

# PHP - Glitchy mod（％）运算符

For some reason: the display looks like this:

``````3 to the power of x mod 17 is 19. This is called v.

Shared person a (v):
19
``````

and in the script, it looks like this (this script is used to describe Diffie-Hellman key exchange algorithm.):

``````\$p="17";
\$g="3";
\$px=gmp_nextprime(rand());
\$x=gmp_strval(\$px);
\$a=\$g^\$x%\$p;
echo "\$g to the power of x mod \$p is \$a. This is called v.<br>";
echo "<br>Shared person a (v):<br>";
echo "\$a <br>";
``````

Wondering if this is kind of a PHP glitch, because:

``````if{x mod y=z}, z<y
``````

Now my questions: How to fix this? Had I done anything wrong? Is this a PHP glitch?

(The code needs a clean up, I know.)

• 写回答
• 好问题 提建议
• 关注问题
• 收藏
• 邀请回答

#### 2条回答默认 最新

• dongzuoyue6556 2014-07-09 11:12
已采纳

Well, `^` is not the power operator and modulo precedes both of them; besides, GMP has a function for power-modulo already:

``````\$p="17";
\$g="3";
\$px=gmp_nextprime(rand());

\$a = gmp_powm(\$g, \$px, \$p);

echo "\$g to the power of x mod \$p is \$a. This is called v.<br>";
echo "<br>Shared person a (v):<br>";
echo "\$a <br>";
``````
已采纳该答案
评论
解决 无用
打赏 举报
• doxd96148 2014-07-09 11:12

`^` is not the exponent operator, it's the bitwise XOR operator. As of PHP 5.6, the exponent operator is `**`. So it should be either

``````\$a = (\$g ** \$x) % \$p;
``````

or

``````\$a = \$g ** (\$x % \$p);
``````

The exponent operator was added in PHP 5.6. Prior to this, you need to use the `pow()` function:

``````\$a = pow(\$g, \$x) % \$p;
``````
评论
解决 无用
打赏 举报