Работа с большими числами в PHP

Использовать модульное возведение в степень, как вам потребуется при использовании Fermat Primality Тест с большими номерами (100 000+), он требует очень больших вычислений.

Когда я умножаю два больших числа (например: 62574 и 62574), PHP, похоже, приводит результат к float. Получение значения модуля, возвращающего странные значения.

$x = 62574 * 62574;
var_dump($x);          // float(3915505476) ... correct
var_dump($x % 104659); // int(-72945)  ... wtf.

Есть ли способ заставить PHP правильно выполнить эти вычисления? Альтернативно, существует ли еще один метод для определения значений модуля, которые будут работать для больших чисел?

48
17 окт. '08 в 10:49
источник поделиться
8 ответов

По какой-то причине в PHP обрабатываются две стандартные библиотеки: BC Math и GMP. Я лично предпочитаю GMP, поскольку он более свежий и имеет более богатый API.

На основе GMP я внедрил класс Decimal2 для хранения и обработки сумм валют (например, 100,25 долларов США). Там много модных расчетов без каких-либо проблем. Протестировано с очень большими номерами.

49
17 окт. '08 в 12:35
источник

используйте этот

 $num1 = "123456789012345678901234567890";
 $num2 = "9876543210";
 $r    = mysql_query("Select @sum:=$num1 + $num2");
 $sumR = mysql_fetch_row($r);
 $sum  = $sumR[0];
49
17 мая '11 в 9:23
источник

Вы взглянули на bcmod()? php имеет проблемы с целыми числами более 2 ^ 31 - 1 на 32-битных платформах.

var_dump(bcmod("$x", '104659') ); // string(4) "2968"
19
17 окт. '08 в 11:10
источник

Я предлагаю вам попробовать BigInteger. Если это не сработает, вы можете использовать SWIG, чтобы добавить код C/С++ для вычислений большого целого и связать его с вашим код.

4
17 окт. '08 в 11:08
источник

Я нашел другое решение, но число будет сохранено в виде строки. Как только вы вернете его к числовому, вы будете ограничены точностью базовой платформы. На 32-битной платформе наибольший int, который вы можете представить как тип int, составляет 2 147 483 647:

/**
 * @param string $a
 * @param string $b
 * @return string
 */
function terminal_add($a, $b){
    return shell_exec('echo "'.$a.'+'.$b.'"|bc');
}

// terminal_add("123456789012345678901234567890", "9876543210")
// output: "123456789012345678911111111100"
3
02 февр. '14 в 13:08
источник
$x = 62574 * 62574;

// Cast to an integer
$asInt = intval($x);
var_dump($asInt);
var_dump($asInt % 104659);

// Use use sprintf to convert to integer (%d), which will casts to string
$asIntStr = sprintf('%d', $x);
var_dump($asIntStr);
var_dump($asIntStr % 104659);
3
15 сент. '12 в 11:04
источник

Я написал для вас очень маленький код, который, несомненно, будет работать в случае больших чисел -

<?php
    $x = gmp_strval(gmp_mul("62574","62574")); // $x="3915505476"
    $mod=gmp_strval(gmp_mod($x,"104659"));  //$mod="2968"

    echo "x : ".$x."<br>";
    echo "mod : ".$mod;

    /* Output:
        x : 3915505476
        mod : 2968
    */
?>

Вам просто нужно использовать строки для хранения больших чисел и работать с ними, используя функции GMP в PHP.

Вы можете проверить некоторые хорошие функции GMP в официальном руководстве PHP здесь - http://php.net/manual/en/ref.gmp.php

1
17 мая '15 в 14:57
источник

Я нашел очень интересный проект.

https://github.com/ValentinMorar/bigintegers-as-a-string

Но это в начале. Использование чисел в качестве строк может быть ответом на выполнение операций с большими числами независимо от платформы или языка программирования.

0
02 февр. '19 в 5:33
источник

Посмотрите другие вопросы по меткам или Задайте вопрос