Advertisement
Guest User

Stefan Diewald

a guest
Apr 9th, 2008
399
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 2.64 KB | None | 0 0
  1. <?php
  2.  
  3. /*
  4.  *  Berechnung von Fakultät und Binomialkoeffizienten
  5.  *
  6.  *      Autor: Stefan Diewald (php@diewie.net)
  7.  *      Datum: 09. April 2008
  8.  */
  9.  
  10. $fak = 150;
  11.  
  12. echo '<strong>'.$fak.'!</strong><br />';
  13. echo fakultaet($fak);
  14. echo '<br />';
  15. echo '<strong>'.$fak.'! mit BC-Math</strong><br />';
  16. echo bc_fakultaet($fak);
  17. echo '<br /><br />';
  18.  
  19. echo '<strong>(2.5 über 2)</strong><br />';
  20. echo binKoeff(2.5,2);
  21. echo '<br />';
  22. echo '<strong>(49 über 6)</strong><br />';
  23. echo binKoeff(49,6);
  24. echo '<br /><br />';
  25.  
  26. echo '<strong>(100 über 49)</strong><br />';
  27. echo binKoeff(100,49);
  28. echo '<br />';
  29. echo '<strong>(100 über 49) mit BC-Math</strong><br />';
  30. echo bc_binKoeff(100,49);
  31.  
  32. /*
  33.  *  int binKoeff(int $n, int $k) - Berechnet den Binomialkoeffizient (n über k)
  34.  */
  35. function binKoeff($n, $k) {
  36.     if ($n < $k) return -1; // nicht definiert
  37.     if ($k == 0) return 1;  // ist immer 1, Rechnung ersparen
  38.     if ($k < 0) return 0;   // ist so definiert
  39.     if ($n == $k) return 1; // ist auch immer 1, Rechnung ersparen
  40.    
  41.     $low = $n-$k+1; // in Fakultät-Schreibweise kann man im Zähler (n-k)! kürzen, daher geht Multiplikation nur bie n-k+1
  42.     for ($zaehler = $low; $n > $low; $zaehler *= $n--); // n*(n-1)*...*(n-k+1)
  43.     return $zaehler / fakultaet($k); // n*(n-1)*...*(n-k+1) / k!
  44. }
  45.  
  46. /*
  47.  *  string binKoeff(int/string $n, int/string $k) - Berechnet den Binomialkoeffizient (n über k) mit Hilfe von BC-Math
  48.  */
  49. function bc_binKoeff($n, $k) {
  50.     if ($n < $k) return '-1';   // nicht definiert
  51.     if ($k == 0) return '1';    // ist immer 1, Rechnung ersparen
  52.     if ($k < 0) return '0';     // ist so definiert
  53.     if ($n == $k) return '1';   // ist auch immer 1, Rechnung ersparen
  54.    
  55.     $low = bcadd(bcsub($n,$k),1); // in Fakultät-Schreibweise kann man im Zähler (n-k)! kürzen, daher geht Multiplikation nur bie n-k+1
  56.     // n*(n-1)*...*(n-k+1)
  57.     for ($zaehler = $low; bccomp($n,$low) == 1;) {
  58.         $zaehler = bcmul($zaehler,$n);
  59.         $n = bcsub($n,'1');
  60.     }
  61.     return bcdiv($zaehler,bc_fakultaet($k)); // n*(n-1)*...*(n-k+1) / k!
  62. }
  63.  
  64. /*
  65.  *  int fakultaet(int $int) - Berechnet die Fakultät int!
  66.  */
  67. function fakultaet($int) {
  68.     if ($int < 0) return -1;    // nicht definiert
  69.     if ($int < 2) return 1;     // 0! = 1! = 1
  70.     for ($fak = 2; $int-1 > 1; $fak *= $int--); //  n*(n-1)*...*2
  71.     return $fak;
  72. };
  73.  
  74. /*
  75.  *  string bc_fakultaet(int/string $int) - Berechnet die Fakultät int! mit Hilfe von BC-Math
  76.  */
  77. function bc_fakultaet($int) {
  78.     if ($int < 0) return '-1';  // nicht definiert
  79.     if ($int < 2) return '1';   // 0! = 1! = 1
  80.     //  n*(n-1)*...*2
  81.     for ($fak = '2'; bccomp(bcsub($int,'1'),'1') == 1;) {
  82.         $fak = bcmul($fak,$int);
  83.         $int = bcsub($int,'1');
  84.     }
  85.     return $fak;
  86. }
  87.  
  88. ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement