在PHP中使用巨型数字

罗宾93K

早上好。我正在寻找一种方法/扩展名,以便可以用PHP中很大的数字(例如,与50位数字相乘)来计算FAST。

而且请不要告诉我,我将使用BC Math或GMP。它们是我的第二个想法,但是当结果都超过38位且都都返回“ false”时,两者都没用。

我已经尝试编写自己的计算函数,该函数实际上是有效的,但是我认为它有点慢。它会将数字的每个数字保存在一个数组中,并且进行计算(就像我在小学时所学的那样)。

只有当输入数字也是数组时,它才能完美工作。否则计算机将在保存它们之前将其破坏。

有没有办法使我的函数更快一些,还是存在一个真正用bignumbers计算的库?

function multiplicate($A, $B)
{
    if (!is_array($A))
    {
        $A = preg_split("//", strval($A), -1, PREG_SPLIT_NO_EMPTY);
    }
    if (!is_array($B)) 
    {
        $B = preg_split("//", strval($B), -1, PREG_SPLIT_NO_EMPTY);
    }

    if ( $A[0]=='-') 
    {
        array_splice($A, 0, 1);
        $negA=-1;
    }
    else 
    {
        $negA=1;
    };
    if ( $B[0]=='-') 
    {
        array_splice($B, 0, 1);
        $negB=-1;
    }
    else 
    {
        $negB=1;
    };

    $l = 0;
    $m = 0;
    $Erg[0] = 0;

    for ( $i=0; $i < count($A); $i++) 
    {
        for ( $j=0; $j < count($B); $j++) 
        {
            $ZwErg = preg_split("//", strval($A[$i]*$B[$j]), -1, PREG_SPLIT_NO_EMPTY);      
            if ($i==0&&$j==0&&count($ZwErg)==2) 
            {
                $l = 1;
            }
            if (count($ZwErg)==2)
            {
                $m = -1;
            }
            for ( $k=0; $k < count($ZwErg); $k++) 
            {
                $s = $i + $j + $l + $m + 1;
                if (isset($Erg[$s])) 
                {
                    $Erg[$s] = intval($Erg[$s]) + intval($ZwErg[$k]);

                    for ( $n=$s; $n >= 0; $n--)
                    {
                        if (intval($Erg[$n])>9) 
                        {
                            $Erg[$n-1] = intval($Erg[$n-1]) + 1 ;
                            $Erg[$n] = intval($Erg[$n] - 10);
                        }
                     };
                }
                else
                {
                    $Erg[$s] = $ZwErg[$k];
                }
                $m = 0;
            }
        }           
    }
    if ($Erg[0]==0) 
    {
        array_splice($Erg,0,1);
    }

    if ($negA*$negB==-1) 
    {
        array_splice($Erg,0,0,"-"); 
    }
    //$Erg = implode("", $Erg);
    return $Erg;
}

$time_start = microtime(true);

require'mathlab.php';

$a=array(1,2,3,4,3,1,0,9,5,8,7,6,4,2,5,6,1,2,3,9,5,2,6,7,9,0,4,6,3,9,5,2,6,7,9,0,4,6,7,1,2,3,4,3,1,0,9,5,8,7,6,4,2,5,6,7,8,9,0,3,8,1,5,2,8,1,4,0,7,1,2,3,4,3,1,0,9,5,8,7,6,4,2,5,6,7,8,9,0,3,8,1,5,2,8,1,4,0,3,4,3,1,0,9,5,8,7,6,4,2,5,6,7,8,9,0,7,8,9,0); // 100-digits

$b=array(3,9,5,2,6,7,9,0,4,6,7,1,2,3,4,3,1,0,9,5,8,7,3,9,5,2,6,7,9,3,9,5,2,6,7,9,0,4,6,7,1,2,3,4,3,1,0,9,5,8,7,6,4,2,5,6,7,8,9,0,3,8,1,5,2,8,1,4,0,0,4,6,7,1,2,3,4,3,1,0,9,5,8,7,6,4,2,5,6,7,8,9,0,3,8,1,5,2,8,1,4,0,6,4,2,5,6,7,8,9,0,3,8,1,5,2,8,1,4,0); // 100-digits

$a2=123431095876425612395267904639526790467123431095876425678903815281407123431095876425678903815281403431095876425678907890;

$b2=395267904671234310958739526793952679046712343109587642567890381528140046712343109587642567890381528140642567890381528140;

$d=multiplicate($a, $b);

$time_end = microtime(true);

$time = $time_end - $time_start;

$erg= implode("", $d);

echo $erg;  // returns 48788350638348981414888625840026024706504222587793349182466850334644805413224925671434030836485835140547446449665876539897036829747577622276768694829991017552834308659985345098432904112370002027411248553582029194707890154740774064503024600

echo $time; // returns 0.75173783302307

$erg3=bcmul($a2, $b2);

$erg4=bcmul(123431095876425612395267904639526790467123431095876425678903815281407123431095876425678903815281403431095876425678907890, 395267904671234310958739526793952679046712343109587642567890381528140046712343109587642567890381528140642567890381528140);

$erg2=gmp_mul($a2, $b2);

$erg5=gmp_mul(123431095876425612395267904639526790467123431095876425678903815281407123431095876425678903815281403431095876425678907890, 395267904671234310958739526793952679046712343109587642567890381528140046712343109587642567890381528140642567890381528140);


echo gmp_strval($erg2); // returns 0

echo gmp_strval($erg5); // returns 0

echo $erg3; // returns 0

echo $erg4; // returns 0
乔尼

使用bcmathGMP

例如,

echo bcmul("123431095876425612395267904639526790467123431095876425678903815281407123431095876425678903815281403431095876425678907890",
           "395267904671234310958739526793952679046712343109587642567890381528140046712343109587642567890381528140642567890381528140");

给出输出:

48788350638348981414888625840026024706504222587793349182466850334644805413224925671434030836485835140547446449665876539897036829747577622276768694829991017552834308659985345098432904112370002027411248553582029194707890154740770154740774064503024600

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在原子中使用氢的巨型IPKernelApp错误

来自分类Dev

如何在巨型循环中使用GDB

来自分类Dev

在igraph中使用Python绘制巨型组件中节点的身份

来自分类Dev

在PHP中使用大量数字输出0

来自分类Dev

在PHP中使用for循环求和的数字

来自分类Dev

在PHP变量中使用以0开头的数字

来自分类Dev

如何在 PHP 中使用 URL 更改多行数字

来自分类Dev

在Python中使用数字

来自分类Dev

计算序列中使用的数字

来自分类Dev

使用php转换数字

来自分类Dev

如何在 php 中使用 tcpdf 在已经有数字签名的 pdf 中添加数字签名

来自分类Dev

如何在PHP中使用按位运算符生成数字

来自分类Dev

在PHP中使用一组预定义的数字填充数组

来自分类Dev

如何在PHP中使用数字删除特定的字符串?

来自分类Dev

如何在PHP中使用REGEX解析功能参数字符串

来自分类Dev

如何在PHP中使用特殊字符或数字对数组进行排序?

来自分类Dev

为什么我不能在开机自检(php页面)中使用#(数字符号)作为值

来自分类Dev

如何在PHP中使用数字删除特定的字符串?

来自分类Dev

2个不同的数字输入阶乘在php中使用函数和for循环

来自分类Dev

如何在PHP中使用不同格式的特定数字进行preg_grep?

来自分类Dev

在PHP中使用echo

来自分类Dev

在PHP中使用接口

来自分类Dev

在PHP中使用foreach

来自分类Dev

在PHP中使用WADL

来自分类Dev

在PHP中使用数组

来自分类Dev

在脚本中使用php

来自分类Dev

在PHP中使用getelementbyid

来自分类Dev

在PHP中使用JSON

来自分类Dev

在PHP中使用简码