Php 将GMP整数转换为二(2n)的幂和

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[

我正在使用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[$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这样的数字