PHP: GMP 関数 - Manual
PHP  
downloads | documentation | faq | getting help | mailing lists | | php.net sites | links | my php.net 
search for in the  
<textdomaingmp_abs>
view the version of this page
Last updated: Tue, 21 Dec 2004

XL. GMP 関数

導入

以下の関数により、GNU MP ライブラリを使用して任 意長の整数を使用することが可能になります。

これらの関数は、PHP 4.0.4 で追加されました。

注意: 多くの GMP 関数は、resource で定義されたGMP 数 を引数としてとります。しかし、これらの関数の多くは、数値と文字列 の両方を引数として指定可能で、後者は数値に変換することが可能です。 また、整数引数を使用して処理を行うより高速な関数がある場合には、 指定された引数が整数である場合により低速となる関数の代わりに使用 されます。これは透過的に行われるため、結果的にGMP数値を引数とする 全ての関数について整数を使用することが可能です。関数 gmp_init() も参照下さい。

警告

より大きな整数を明示的に指定するには、文字列として指定して下さい。 そうしない場合、PHPは整数リテラルを最初に解釈し、 GMP にわたるまでに精度の劣化を生じる可能性が あります。

注意: この拡張モジュールはWindows環境 では利用できません。

要件

から GMP ライブラリをダウンロード可能です。このサイ トでは、GMP のマニュアルも入手可能です。

これらの関数を使用するには、GMP バージョン 2 以降が必要です。いく つかの関数はより新しいバージョンの GMP ライブラリを必要とする可能性 があります。

インストール手順

これらの関数を利用可能とするには、オプション --with-gmp を使用することにより GMPサポートを有効にしてPHPをコンパイルする必要が あります。

実行用の設定

この拡張モジュールは設定ディレクティブを全く定義しません。

リソース型

この拡張モジュールはリソース型を全く定義しません。

定義済みの定数

これらの定数は、この拡張モジュールで定義されており、 この拡張モジュールがPHP内部にコンパイルされているか実行時に動的にロー ドされるかのどちらかの場合のみ使用可能です。

GMP_ROUND_ZERO (integer)

GMP_ROUND_PLUSINF (integer)

GMP_ROUND_MINUSINF (integer)

例 1. GMP を使用した階乗関数

<?php
function fact ($x) {
   if (
$x <= 1)
       return
1;
   else
       return
gmp_mul ($x, fact ($x-1));
}

print
gmp_strval (fact (1000)) . "\n";
?>

この例は、1000の階乗(非常に大きな数です)を非常に高速に計算します。

以下も参照下さい

より数学的な関数は、 BCMath 任意精度関数および 数学関数の節にあります。

目次
gmp_abs -- 絶対値
gmp_add -- 数値の加算
gmp_and -- 論理演算 AND
gmp_clrbit -- ビットをクリアする
gmp_cmp -- 数を比較する
gmp_com --  aの補数を計算する
gmp_div_q -- 数値の割算
gmp_div_qr -- 割算を行い、商と余りを得る
gmp_div_r -- 割算の余り
gmp_div -- 割算を行う
gmp_divexact -- 正確な割算
gmp_fact -- 階乗
gmp_gcd -- 最大公約数を計算する
gmp_gcdext -- 最大公約数と乗数を計算する
gmp_hamdist -- ハミング距離
gmp_init -- GMP 数を作成する
gmp_intval -- GMP 数を整数に変換する
gmp_invert -- 法による逆
gmp_jacobi -- ヤコビ記号
gmp_legendre -- ルジェンドル記号
gmp_mod -- モジュロ演算
gmp_mul -- 数値の乗算
gmp_neg -- 符号を反転する
gmp_or -- 論理演算 OR
gmp_perfect_square -- 平方数かどうかを調べる
gmp_popcount -- カウントを増やす
gmp_pow -- 累乗
gmp_powm -- 累乗とモジュロ
gmp_prob_prime -- 数が"ほぼ素数"であるかどうかを調べる
gmp_random -- 乱数
gmp_scan0 -- 0を探す
gmp_scan1 -- 1 を探す
gmp_setbit -- ビットを設定する
gmp_sign -- 数の符号
gmp_sqrt -- 平方根
gmp_sqrtrem --  Square root with remainder
gmp_strval -- GMP 数を文字列に変換する
gmp_sub -- 数値の減算
gmp_xor -- 論理演算 XOR


add a note add a note User Contributed Notes
GMP 関数
richard-slater.co.uk
22-Feb-2004 09:03
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));
  }
?>
helvecio_oliveira at yahoo dot com dot br
15-Oct-2003 08:51
=============================================================
A set of very nice functions to handle IP Address with gmplib:

The best way to store a range into a database is store:
dNet ..... decimal representation of a Net
dMask .... decimal representation of a Mask

All another parameters can be calculated.

<?
/*
f_ip2dec($a) ................... IP string to decimal
f_dec2ip($a) ................... decimal to IP string

f_dec2ipall($dNet,$dMask) ...... decimal Net and Mask to an Array with several IP parameters

f_dec2cidr($a) ................. decimal Mask to CIDR

f_and($a,$b) ................... and
f_or($a,$b) .................... or
f_xor($a,$b) ................... xor
f_not($a) ...................... not
f_dec2bin($a) .................. decimal to binary string
f_bin2dec($a) .................. binary string to decimal
*/

function f_and($a,$b){
$a=gmp_init(strval($a));
$b=gmp_init(strval($b));
$d=gmp_and($a,$b);
return
floatval(gmp_strval($d));
}

function
f_or($a,$b){
$a=gmp_init(strval($a));
$b=gmp_init(strval($b));
$d=gmp_or($a,$b);
return
floatval(gmp_strval($d));
}

function
f_xor($a,$b){
$a=gmp_init(strval($a));
$b=gmp_init(strval($b));
$d=gmp_xor($a,$b);
return
floatval(gmp_strval($d));
}

function
f_not($a){
$a=gmp_init(strval($a));
$d=gmp_strval($a,2);
$d=str_replace("1","x",$d);
$d=str_replace("0","1",$d);
$d=str_replace("x","0",$d);
$d=gmp_init($d,2);
return
floatval(gmp_strval($d,10));
}

function
f_dec2bin($a){
$a=gmp_init(strval($a));
return
gmp_strval($a,2);
}

function
f_bin2dec($a){
$a=gmp_init(strval($a),2);
return
floatval(gmp_strval($a,10));
}

function
f_ip2dec($a){
$d = 0.0;
$b = explode(".", $a,4);
for (
$i = 0; $i < 4; $i++) {
      
$d *= 256.0;
      
$d += $b[$i];
   };
return
$d;
}

function
f_dec2ip($a){
  
$b=array(0,0,0,0);
  
$c = 16777216.0;
  
$a += 0.0;
   for (
$i = 0; $i < 4; $i++) {
      
$k = (int) ($a / $c);
      
$a -= $c * $k;
      
$b[$i]= $k;
      
$c /=256.0;
   };
  
$d=join('.', $b);
   return(
$d);
}

function
f_dec2cidr($a){
$a=gmp_init(strval($a));
$d=strlen(str_replace("0","",gmp_strval($a,2)));
return
$d;
}

function
f_dec2ipall($dNet,$dMask){
 
$dWildCard=f_not($dMask);
 
$IpAll["Net"]=f_dec2ip($dNet);
 
$IpAll["Mask"]=f_dec2ip($dMask);
 
$IpAll["WildCard"]=f_dec2ip($dWildCard);
 
$IpAll["Cidr"]=f_dec2cidr($dMask);
 
$IpAll["Bcast"]=f_dec2ip(f_or($dNet,$dWildCard));
 
$IpAll["nIp"]=$dWildCard+1;
 
$IpAll["nIpUtil"]=$dWildCard-1;
  if(
$IpAll["nIp"] > 2){
      
$IpAll["IpFrom"]=f_dec2ip($dNet+1);
      
$IpAll["IpTo"]=f_dec2ip($dNet+$dWildCard-1);
  }
  else
  {
      
$IpAll["IpFrom"]="-";
      
$IpAll["IpTo"]="-";
      
$IpAll["nIpUtil"]=0;
  }
  return
$IpAll;
}

?>

=============================================================
GMP install steps in Mandrake 9.1:
----------------------------------------------------------
cp -r /usr/src/php-devel/extensions/gmp /tmp/gmp
cd /tmp/gmp
phpize
./configure
make install
echo "extension = gmp.so" > /etc/php/90_gmp.ini

Restart apache web server.
----------------------------------------------------------
gmp.so is in:
/usr/lib/php/extensions/

look in phpinfo, the string:
/etc/php/90_gmp.ini

Needs these tools:
autoconf
automake
libtool
m4
php430-devel-430-11mdk.rpm
all rpm�s that are envolved to run and compile gmp (*gmp*.rpm)

Some docs about self contained extensions:
/usr/share/doc/php430-devel-430/SELF-CONTAINED-EXTENSIONS
=============================================================
php at prezent dot nl
07-Jul-2003 11:57
Notice there are some broken gmp libs out there ..
if our code is not working try the following.
<code>
$BIT=gmp_init(0,10);
for( $i=0; $i<=50; $i++) {
     echo $i." ".gmp_scan1($BIT,$i).'<BR />';
}
</code>
if only one of them returns something other than -1
your libgmp is broken

<textdomaingmp_abs>
 Last updated: Tue, 21 Dec 2004
show source | credits | sitemap | contact | advertising | mirror sites 
Copyright © 2001-2005 The PHP Group
All rights reserved.
This unofficial mirror is operated at: /
Last updated: Mon Mar 14 08:13:06 2005 Local time zone must be set--see zic manual page