Php 将GMP整数转换为二(2n)的幂和
我正在使用php的GMP库来解决一个公式集问题Php 将GMP整数转换为二(2n)的幂和,php,algorithm,gmp,Php,Algorithm,Gmp,我正在使用php的GMP库来解决一个公式集问题 public function gmp_sum($aRessource) { // Avec le while $i = 0; $nb_ressource = count($aRessource); while ($i < $nb_ressource) { if ($i == 0) { $tmp = gmp_init($aRessource[
public function gmp_sum($aRessource)
{
// Avec le while
$i = 0;
$nb_ressource = count($aRessource);
while ($i < $nb_ressource)
{
if ($i == 0)
{
$tmp = gmp_init($aRessource[$i]);
}
else
{
$tmp = gmp_add(gmp_init($aRessource[$i]),$tmp);
}
$i++;
}
return $tmp;
}
公共函数gmp\u sum($aresource)
{
//阿维克勒伊夫酒店
$i=0;
$nb_ressource=计数($aresource);
而($i<$nb\u资源)
{
如果($i==0)
{
$tmp=gmp_init($aresource[$i]);
}
其他的
{
$tmp=gmp\u add(gmp\u init($aresource[$i]),$tmp);
}
$i++;
}
返回$tmp;
}
变量$aresource等于:array(1,2,4,8)
所以我的函数gmp_sum返回15
我想创建一个执行反向运算的算法,函数取整数15并返回一个包含1 2 4 8的数组。但我不知道从哪里开始
谢谢你的帮助
解决方案:
在php中将整数分解为2的幂
public function gmp_reverse($gmp_sum)
{
$res = array();
$i = 1;
while ($i < 64) // 64 bytes
{
$tmp = $gmp_sum & $i; // check if bytes equal to 1
if ($tmp != 0)
{
array_push($res,$i);
}
$i = $i * 2;
}
return $res;
}
公共功能gmp\U反向($gmp\U总和)
{
$res=array();
$i=1;
而($i<64)//64字节
{
$tmp=$gmp\u sum&$i;//检查字节是否等于1
如果($tmp!=0)
{
阵列推送($res,$i);
}
$i=$i*2;
}
返回$res;
}
假设您想要一个数组,它与总和相加,那么您需要一个相反的数组。此函数假设您有一个完美的输入,例如,17将不起作用。
试试看
function reversegen($gmpsum)
{
$stack = array();
$limit = $gmpsum;
$cur = 1;
for($sum = 0; $sum < $limit; )
{
echo $cur. "<br>";
array_push($stack,$cur);
$sum = $sum + $cur;
$cur = 2 * $cur;
}
return($stack);
}
$stack = reversegen(15);
print_r($stack);
function reversegen($gmpsum)
{
$stack=array();
$limit=$gmpsum;
$cur=1;
对于($sum=0;$sum<$limit;)
{
echo$cur.“
”;
阵列推送($stack,$cur);
$sum=$sum+$cur;
$cur=2*$cur;
}
返回($stack);
}
$stack=reversegen(15);
打印(堆栈);
以上第15条仅供参考。您可以使用、31、63、127等,它仍然可以正常工作。如何将15除以1 2 4 8??你能解释一下原因吗output@rahulpatel老实说我自己也不太清楚,但它与我的函数相反我已经编辑了将整数分解为2的幂的解决方案sumBro代码对任何大于15的数字都不起作用是的,这是一个问题,特别是对于大数字gmp。谢谢你的回答,它返回了一个空数组。顺便问一下:/Nassim-你能提供我,你正在使用的数字吗。我试了31次。这似乎奏效了。1 2 4 8 16数组([0]=>1[1]=>2[2]=>4[3]=>8[4]=>16)Rahul-您需要将15替换为31、63、127等等,看看它是否可以工作。我更新了一点我的函数,它工作得更快,例如对于22这样的数字