with strip_tags remove ent_quotes ejemplo php bignum

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);