I discovered that the gmp functions use [0-9a-f] up to base 16, but [0-9A-Za-z] (i.e. upper case first) from bases 17 to 62. This differs from most of the base-62 implementations I've found that tend to use lower case first.
gmp_init
(PHP 4 >= 4.0.4, PHP 5)
gmp_init — Crée un nombre GMP
Description
Crée un nombre GMP, à partir d'un entier ou d'une chaîne.
Liste de paramètres
- number
-
Un entier ou une chaîne de caractères. La chaîne peut être une représentation décimale, hexadécimale ou octale.
- base
-
La base.
La base peut varier de 2 à 36. Si la base vaut 0 (valeur par défaut), la base actuelle est déterminée depuis les derniers caractères ; si les deux premiers caractères sont 0x ou 0X, on suppose que c'est de l'hexadécimal, sinon, si le premier caractère est "0", on suppose que c'est de l'octal, sinon, on suppose que c'est de la décimale.
Valeurs de retour
Une ressource GMP.
Historique
| Version | Description |
|---|---|
| 5.3.2 | Le paramètre base a été étendu de "2 à 36", à "2 à 62" et "-2 à -36". |
| 4.1.0 | Le paramètre optionnel base a été ajouté. |
Notes
Note:
Pour utiliser la base étendue introduite en PHP 5.3.2, vous devez compiler PHP avec GMP 4.2.0 ou supérieur.
Exemples
Exemple #1 Création d'un nombre GMP
<?php
$a = gmp_init(123456);
$b = gmp_init("0xFFFFDEBACDFEDF7200");
?>
Notes
Note:
Il n'est pas nécessaire d'appeler gmp_init() si vous voulez utiliser des entiers ou des chaînes à la place de nombre GMP dans les fonctions GMP, comme gmp_add(). Les arguments de ces fonctions sont automatiquement convertis en nombres GMP, si cette conversion est possible et nécessaire, en utilisant les mêmes règles que gmp_init().
Unless the base is 16, gpm_init will fail if the string begins with "0b".
> php -r '$v = gmp_init("b83", 17); print("$v\n");'
Resource id #4
> php -r '$v = gmp_init("0b83", 17); print("$v\n");'
[nothing prints]
In may case, where I am explicitly specifying the base, the solution is to apply ltrim first:
> php -r '$v = gmp_init(ltrim("0b83", "0"), 17); print("$v\n");'
Resource id #4
gmp_* functions don't accept strings with a leading '+':
<?php
echo gmp_strval(gmp_init('+42')); #0
echo gmp_strval(gmp_add('42', '+42')); #42
echo bcadd('+42', '+42'); #84
?>
Here's a way to parse a decimal (eg 3.25) into an integer and exponent:
<?
if (preg_match("/^[0-9]+\.[0-9]+$/",$input)){
//Input is a base-10 decimal. Multiply as necessary to remove the decimal
//point. Convert that to a gmp_resource, then decrement the exponent
//to compensate.
$pieces=explode(".", $input); //Split at the d.p.
$input="$pieces[0]$pieces[1]"; //Remove the decimal point.
$input=ltrim($input,'0');
//Remove any leading zeros, or gmp_init will parse the number as octal.
if ($input==''){ //Deal with "0.0" which would otherwise be ''.
$input=0;
}
$integer=gmp_init($input);
$ns_exponent=-strlen($pieces[1]);
//exponent = (-) the number of characters after the decimal point.
}
?>
Note: Leading zeros will make gmp_init parse this as octal.
Thus gmp_init(010) becomes 8.
$a=010; //8
$b="010" + 0; //10
$c=gmp_strval(gmp_init(010)); //8
$d=gmp_strval(gmp_init("010")); //8
This behaviour is inconsistent: either $d should equal $b, or
$b should equal $a.
If you call a gmp_* function directly with an interger as parameter, this integer MUST NOT be 0:
for($i=-1;$i<=1;$i++) { echo gmp_strval(gmp_add(2,gmp_mul(1,$i))) . ' '; }
The result is 1 0 3 (wrong)
In this case you have to use gmp_init():
for($i=-1;$i<=1;$i++) { echo gmp_strval(gmp_add(2,gmp_mul(1,gmp_init($i)))) . ' '; }
The result is 1 2 3 (right)
Happy number crunching! :-)
