GMP 関数
参考
より数学的な関数が、 数学 の節にあります。
目次
- gmp_abs — 絶対値
- gmp_add — 数値を加算する
- gmp_and — ビット AND を計算する
- gmp_binomial — 二項係数を計算する
- gmp_clrbit — ビットをクリアする
- gmp_cmp — 数を比較する
- gmp_com — 1 の補数を計算する
- gmp_div — gmp_div_q のエイリアス
- gmp_div_q — 数値を除算する
- gmp_div_qr — 除算を行い、商と余りを得る
- gmp_div_r — 除算の余りを計算する
- gmp_divexact — 正確な除算
- gmp_export — バイナリ文字列にエクスポートする
- gmp_fact — 階乗
- gmp_gcd — 最大公約数を計算する
- gmp_gcdext — 最大公約数と乗数を計算する
- gmp_hamdist — ハミング距離
- gmp_import — バイナリ文字列からインポートする
- gmp_init — GMP 数を作成する
- gmp_intval — GMP 数を整数に変換する
- gmp_invert — 法による逆
- gmp_jacobi — ヤコビ記号
- gmp_kronecker — クロネッカーの記号を計算する
- gmp_lcm — 最小公倍数を計算する
- gmp_legendre — ルジェンドル記号
- gmp_mod — モジュロ演算
- gmp_mul — 数値を乗算する
- gmp_neg — 符号を反転する
- gmp_nextprime — 次の素数を見つける
- gmp_or — ビット OR を計算する
- gmp_perfect_power — 累乗数かどうかを調べる
- gmp_perfect_square — 平方数かどうかを調べる
- gmp_popcount — セットされているビットの数
- gmp_pow — べき乗を計算する
- gmp_powm — べき乗とモジュロを計算する
- gmp_prob_prime — 数が"おそらく素数"であるかどうかを調べる
- gmp_random — 乱数を生成する
- gmp_random_bits — 乱数を生成する
- gmp_random_range — 等確率に選ばれた整数を取得する
- gmp_random_seed — 乱数シードを設定する
- gmp_root — n乗根の整数部を返す
- gmp_rootrem — n乗根の整数部分と小数部分を返す
- gmp_scan0 — 0 を探す
- gmp_scan1 — 1 を探す
- gmp_setbit — ビットを設定する
- gmp_sign — 数の符号
- gmp_sqrt — 平方根を計算する
- gmp_sqrtrem — 余りつきの平方根
- gmp_strval — GMP 数を文字列に変換する
- gmp_sub — 数値の減算
- gmp_testbit — ビットが設定されているかどうかを調べる
- gmp_xor — ビット XOR を計算する
+add a note
User Contributed Notes 2 notes
Nitrogen ¶
14 years ago
I made a function that can be used for converting numbers to any base you wish.. instead of returning a string of pre-defined index of characters (i.e. 0-9a-z) you could simply make your own of any length using the array of indexes it returns.
I looked around and didn't see anybody made one, I needed one for a simple compression algorithm with only numbers, I've not actually made it yet but this was an initial idea.
<?php
// ConvertBase function explained:
// we add an array item $Input%$Base floored and divide $Input by $Base floored.
// repeat until $Input is no longer above 0.
function ConvertBase($Input,$Base=10) {
$Input=gmp_init($Input);
$Result=array();
for($i=0;$i<1||gmp_sign($Input)==1;$i++) {
$Result[]=gmp_intval(gmp_mod($Input,$Base));
$Input=gmp_div_q($Input,$Base);
}
$Result=array_reverse($Result);
return($Result);
}
// an example how gmp_strval($.., 36); could be achieved:
// the funny emergency number from The IT Crowd
// (leading zeroes aren't liked in gmp_init though)
$Input = '1189998819991197253';
// our example 36 characters used in gmp_strval($.., 36);
$Chars = '0123456789abcdefghijklmnopqrstuvwxyz';
// count the $Chars so they're all used
// or use your own number less than the length of $Chars
$Base = strlen($Chars);
// perform
$Result = ConvertBase($Input,$Base);
// replace the resulting index with the corrosponding characters of the index in $Chars
for($i=0;$i<count($Result);$i++)
$Result[$i]=$Chars{$Result[$i]};
// compare
printf("gmp_strval: %s\r\n",gmp_strval($Input,36));
printf("BaseConvert: %s\r\n",implode($Result));
/* OUTPUT:
gmp_strval: 91h7dixfq6h1
BaseConvert: 91h7dixfq6h1
*/
?>
The example shows a familiar result of course, but the idea of this function was so that you can use whatever base you wish, and display entirely your own output to represent any number of choice.
Also, for those who wish to do bitwise shifting, it's quite simple.. to shift left, just multiply the number by pow(2,x), and to shift right, divide by pow(2,x).
<?php
function gmp_shiftl($x,$n) { // shift left
return(gmp_mul($x,gmp_pow(2,$n)));
}
function gmp_shiftr($x,$n) { // shift right
return(gmp_div($x,gmp_pow(2,$n)));
}
?>
Have fun,
Nitrogen.
richard-slater.co.uk ¶
20 years ago
For those (like me) who are trying to do bit masking with very large numbers, here is a useful function to do the work for you.
<?php
function isBitSet($bitMask, $bitMap)
{
return (bool) gmp_intval(gmp_div(gmp_and($bitMask, $bitMap),$bitMask));
}
?>