PHP-Glitchy mod(%)运算符
出于某些原因:显示如下所示:PHP-Glitchy mod(%)运算符,php,operators,modulo,diffie-hellman,Php,Operators,Modulo,Diffie Hellman,出于某些原因:显示如下所示: 3 to the power of x mod 17 is 19. This is called v. Shared person a (v): 19 在脚本中,它看起来像这样(该脚本用于描述Diffie-Hellman密钥交换算法): $p=“17”; $g=“3”; $px=gmp_nextprime(rand()); $x=gmp\U标准($px); $a=$g^$x%$p; echo“$g乘以x的幂mod$p等于$a。这称为v.”; 回声“共享人a(v
3 to the power of x mod 17 is 19. This is called v.
Shared person a (v):
19
在脚本中,它看起来像这样(该脚本用于描述Diffie-Hellman密钥交换算法):
$p=“17”;
$g=“3”;
$px=gmp_nextprime(rand());
$x=gmp\U标准($px);
$a=$g^$x%$p;
echo“$g乘以x的幂mod$p等于$a。这称为v.
”;
回声“
共享人a(v):
”;
回声“$a
”;
想知道这是否是PHP的一个小故障,因为:
if{x mod y=z}, z<y
如果{x mod y=z},z那么,^
不是幂运算符,模在它们之前;此外,GMP已经具有功率模功能:
$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>";
$p=“17”;
$g=“3”;
$px=gmp_nextprime(rand());
$a=gmp_功率($g,$px,$p);
echo“$g乘以x的幂mod$p等于$a。这称为v.
”;
回声“
共享人a(v):
”;
回声“$a
”;
^
不是指数运算符,而是按位异或运算符。从PHP5.6开始,指数运算符是**
。所以它应该是
$a = ($g ** $x) % $p;
或
PHP5.6中添加了指数运算符。在此之前,您需要使用pow()
函数:
$a = pow($g, $x) % $p;
我喜欢你的答案,但我得到了这个错误:PHP解析错误:语法错误,意外的“*”在PHP5.6中添加了指数运算符。听起来你运行的是一个旧版本。“PHP版本5.4.4-14+deb7u11”感谢你给我的老式消息。这让我不得不更新Linux标题。:)你为什么不使用gmp\u powm()
?第二个问题是:数字太大了。PHP语言本身只支持整数的大小不超过2^31-1。我不认为3^(20亿)对我有好处。这正是你应该使用gmp的原因。
$a = $g ** ($x % $p);
$a = pow($g, $x) % $p;