PHP-kode til beregning af e

   1 <?
   2 // ---------------- Constants ----------------
   3 
   4 define ('LENGTH', 12);
   5 define ('ZEROS', '00000000000000000000');
   6 define ('MAX', 1000000000000); // LENGTH 0'er.
   7 define ('MAXLIMIT', 30000); // Serverbestemt - i princippet næsten uendelig.
   8 
   9 // ---------------- Functions ----------------
  10 
  11 function zerofill ($block) {
  12   $extra=LENGTH-strlen($block);
  13   return substr(ZEROS,0,$extra).$block;
  14 }
  15 
  16 function long_divide ($number,$n) {
  17   $rest=0;
  18   foreach ($number as $nr => $block) {
  19     $tal=$block+$rest*MAX;
  20     $number[$nr]=floor($tal/$n);
  21     $rest=$tal%$n;
  22   }
  23   return $number;
  24 }
  25 
  26 function long_add ($number,$addend) {
  27   $blocks=count($number);
  28   $mente=0;
  29   for ($nr=$blocks-1; $nr>=0; --$nr) {
  30     $sum=$number[$nr]+$addend[$nr]+$mente;
  31     $number[$nr]=$sum%MAX;
  32     $mente=$sum/MAX;
  33   }
  34   $number[0]+=$mente;
  35   return $number;
  36 }
  37 
  38 function display ($e) {
  39   $decimals=$_POST[digits];
  40   $first_digit=floor(array_shift($e));
  41   echo "<table>\n";
  42   echo "<tr><td>e = $first_digit,</td></tr>\n";
  43   $buffer="";
  44   $echoed=10;
  45   $units=0;
  46   echo "<tr>";
  47   foreach ($e as $block) {
  48     $buffer.=zerofill($block);
  49     while (strlen($buffer)>9 && $echoed<$decimals) {
  50       $echoed+=10;
  51       echo "<td>".substr($buffer,0,10)."</td>";
  52       $buffer=substr($buffer,10);
  53       if (++$units%5==0)
  54         echo "</tr>\n<tr>";
  55     }
  56   }
  57   $rest=$decimals-$echoed+10;
  58   echo "<td>".substr($buffer,0,$rest)."</td></tr>";
  59   echo "</table>\n";
  60 }
  61 
  62 // ---------------- Main ----------------
  63 
  64 echo "<pre>           1     1      1<br>";
  65 echo " e = 1 + --- + --- + --- ...<br>";
  66 echo "           1!    2!     3!</pre>\n";
  67 
  68 echo "
  69 <p>Her kan man beregne konstanten e, grundtal for den naturlige logaritme.
  70 På grund af tidsbegrænsninger på serveren er der sat en maksimum på 30'000
  71 decimaler, men metoden i sig selv er kun begrænset af computerens
  72 tilgængelige arbejdslager.</p>
  73 <p>Der er ikke noget sindsoprivende nyt i beregningerne, og på nogle
  74 hjemmesider kan man få programmer der er mange gange hurtigere, men
  75 <a href='?page=matematik/beregningsmetode'>metoden</a>
  76 er enkel og kan implementeres i stort set alle programmeringssprog.</p>
  77 
  78 <form action='#' method='post'>
  79 <p>Hvor mange decimaler? <input type='text' size='6' name='digits' value='$decimals'>
  80 <input type='submit' name='send' value='OK'></p>
  81 </form>
  82 ";
  83 
  84 $decimals=$_POST[digits];
  85 if (isset($_POST['send']) && $decimals<=MAXLIMIT) {
  86   $blocks=floor($decimals/LENGTH);
  87   while ($blocks*LENGTH<$decimals)
  88     ++$blocks;
  89   ++$blocks;
  90 
  91   $e=array_fill(0,$blocks,0);
  92   $e[0]=1;
  93   $rec_fact=$e;
  94   $old_e=array(0);
  95 
  96 // ---------------- Compute ----------------
  97 
  98   $n=0;
  99   $compare=0;
 100   $start = microtime(1);
 101   while ($compare<=$blocks) {
 102     ++$n;
 103     $old_e=$e;
 104     $rec_fact=long_divide($rec_fact,$n);
 105     $e=long_add($e,$rec_fact);
 106     if ($e[$compare]==$old_e[$compare]) ++$compare;
 107   }
 108   echo " Beregningstid i sekunder: "
 109    .number_format(microtime(1)-$start,6,',',"'")."<br>"
 110    ." Sidste fakultetstal: $n";
 111   display($e);
 112 }
 113 ?>