strip_tags - Trabajando con números grandes en PHP
strip_tags wordpress (7)
Para usar la exponenciación modular como lo requeriría al usar la Prueba de Primalidad de Fermat con números grandes (100,000+), requiere cálculos muy grandes.
Cuando multiplico dos números grandes (p. Ej .: 62574 y 62574) PHP parece arrojar el resultado a un flotador. Obtener el valor de módulo de eso devuelve valores extraños.
$x = 62574 * 62574;
var_dump($x); // float(3915505476) ... correct
var_dump($x % 104659); // int(-72945) ... wtf.
¿Hay alguna manera de hacer que PHP realice estos cálculos correctamente? Alternativamente, ¿hay otro método para encontrar valores de módulo que funcionarían para números grandes?
¿Has echado un vistazo a bcmod()
? php tiene problemas con enteros superiores a 2 ^ 31 - 1 en plataformas de 32 bits.
var_dump(bcmod("$x", ''104659'') ); // string(4) "2968"
Encontré otra solución, pero el número se almacenará como una cadena. Tan pronto como lo devuelva a un valor numérico, estará restringido a la precisión de la plataforma subyacente. En una plataforma de 32 bits, la int más grande que puede representar como un tipo int es 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"
Escribí un código muy pequeño para usted que seguramente funcionará en caso de grandes números-
<?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
*/
?>
Simplemente tiene que usar cadenas para almacenar números grandes y para operarlos use funciones GMP en PHP.
Puede verificar algunas buenas funciones de GMP en el manual oficial de PHP aquí- http://php.net/manual/en/ref.gmp.php
Por alguna razón, hay dos bibliotecas estándar en PHP que manejan los números arbitrarios de longitud / precisión: BC Math y GMP . Personalmente prefiero GMP, ya que es más fresco y tiene una API más rica.
Basado en GMP, implementé la clase Decimal2 para almacenar y procesar montos de moneda (como USD 100.25). Muchos cálculos mod sin problemas. Probado con números muy grandes.
Te sugiero que pruebes BigInteger . Si eso no funciona, puede usar SWIG para agregar el código C / C ++ para los cálculos de enteros grandes y vincularlo a su código.
utilizar esta
$num1 = "123456789012345678901234567890";
$num2 = "9876543210";
$r = mysql_query("Select @sum:=$num1 + $num2");
$sumR = mysql_fetch_row($r);
$sum = $sumR[0];
$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);