00001 <?php 00002 /*************************************************************************** 00003 * Copyright (C) 2007 by Anton E. Lebedevich * 00004 * * 00005 * This program is free software; you can redistribute it and/or modify * 00006 * it under the terms of the GNU Lesser General Public License as * 00007 * published by the Free Software Foundation; either version 3 of the * 00008 * License, or (at your option) any later version. * 00009 * * 00010 ***************************************************************************/ 00011 /* $Id: GmpBigIntegerFactory.class.php 4687 2007-12-09 18:57:18Z voxus $ */ 00012 00016 final class GmpBigIntegerFactory extends BigNumberFactory 00017 { 00021 public static function me() 00022 { 00023 return Singleton::getInstance(__CLASS__); 00024 } 00025 00029 public function makeNumber($number, $base = 10) 00030 { 00031 return GmpBigInteger::make($number, $base); 00032 } 00033 00037 public function makeFromBinary($binary) 00038 { 00039 return GmpBigInteger::makeFromBinary($binary); 00040 } 00041 00045 public function makeRandom($stop, RandomSource $source) 00046 { 00047 if (is_string($stop)) { 00048 $stop = $this->makeNumber($stop); 00049 } elseif ( 00050 $stop instanceof BigInteger 00051 && !$stop instanceof GmpBigInteger 00052 ) { 00053 $stop = $this->makeNumber($stop->toString()); 00054 } 00055 00056 Assert::isTrue($stop instanceof GmpBigInteger); 00057 00058 $numBytes = ceil(log($stop->floatValue(), 2) / 8); 00059 00060 return $this-> 00061 makeFromBinary("\x00".$source->getBytes($numBytes))-> 00062 mod($stop); 00063 } 00064 } 00065 ?>