kostenloser Webspace werbefrei: lima-city


Unendlich große Zahlen

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    a*****h

    Manchmal braucht man als Mathematiker genauigkeit,
    das heißt man muss auch riesige Zahlen exakt Berechnen.

    Nunja, da ist nur ein Problem:
    CPUs können nur eine bestimmte Menge an Daten verarbeiten.

    Dafür hab ich jedoch eine Lösung programmiert:
    <?php
    
      $func_calcStep = 13;
      //$func_calcStep = 18; //On x64 CPU's
    
      function multiplikation($func_one, $func_two) {
        global $func_calcStep;
        $func_step = $func_calcStep;
        $func_calcStep = floor($func_calcStep / 2);
        
        //STRREV
        $func_one = strrev($func_one);
        
        //SPLIT
        $func_one = str_split($func_one, $func_calcStep);
        
        //LENGTH
        $func_len = count($func_one);
        
        //RESULT
        $func_end = array();
        
        //MAINLOOP
        for($func_i = 0; $func_i < $func_len; $func_i++) {
          $func_A = strrev($func_one[$func_i]);
          
          $func_end[$func_i] = $func_A * $func_two;
        }
        
        transform($func_end);
        
        $func_calcStep = $func_step;
        
        return strrev(join("", $func_end));
      }
    
      function transform(&$func_array) {
        global $func_calcStep;
        
        $func_len = count($func_array);
        
        for($func_i = 0; $func_i < $func_len; $func_i++) {
          $func_number = $func_array[$func_i];
          
          if($func_number > pow(10, $func_calcStep)) {
    $func_toM = substr($func_number, 0, -$func_calcStep);
    $func_array[$func_i] = substr($func_number, -$func_calcStep);
    
    if(!isset($func_array[$func_i + 1])) $func_array[$func_i + 1] = 0;
    $func_array[$func_i + 1] += $func_toM;
          }
          
          $func_array[$func_i] = strrev($func_array[$func_i]);
        }
      }
    
    ?>


    also wie man sieht - Multiplikation ist für Multiplikation da.
    Rein theoretisch kann man unendlich große Zahlen Multiplizieren.

    Auf einer Intel Core 2 Duo @ 2GHz hab ich damit eine 44.000 Ziffern große Zahl mit einer 4 Zifferigen in einer Sekunde multipliziert.

    Das ganze ist simpel aufgebaut, da die Zahlen in Strings angegeben werden; also wie "98240923"
    Eigendlich wird nichts anderes getan als die Zahl in mehrere Stückchen zu zerteilen.

    Aus 81389702834 wird zum Beispiel 81|389|702|834
    Dann werden die einzelnen Stückchen multipliziert.

    Der Nachteil ist nun, dass ich zu faul war rationale Zahlen zu integrieren.
    Aber dafür habe ich noch Addition für euch :)

    <?php
    
      function addition($func_one, $func_two) {
        global $func_calcStep;
        
        //STRREV
        $func_one = strrev($func_one);
        $func_two = strrev($func_two);
        
        //SPLIT
        $func_one = str_split($func_one, $func_calcStep);
        $func_two = str_split($func_two, $func_calcStep);
        
        //LENGTH
        $func_len = (count($func_one) > count($func_two)) ? count($func_one) : count($func_two);
        
        //RESULT
        $func_end = array();
        
        //MAINLOOP
        for($func_i = 0; $func_i < $func_len; $func_i++) {
          $func_A = (isset($func_one[$func_i])) ? strrev($func_one[$func_i]) : 0;
          $func_B = (isset($func_two[$func_i])) ? strrev($func_two[$func_i]) : 0;
          
          $func_end[$func_i] = $func_A + $func_B;
        }
        
        transform($func_end);
        
        return strrev(join("", $func_end));
      }
    
    ?>


    nunja - an Division arbeite ich noch.
    Ich hab bisjetzt schon mal eine Beta Version:

    <?php
    
      function divide($func_one, $func_two) {
        $func_index      = 0;
        $func_number     = 0;
        
        while(isBigger($func_one, $func_number) == 2) {
          $func_index++;
          $func_number = addition($func_number, $func_two);
        }
        
        return $func_index;
      }
    
    ?>


    Tja, als Entschuldigung das ich so faul bin - hier noch eine coole und manchmal ganz nützliche Funktion:

    <?php
    
      function isBigger($func_one, $func_two) {
        global $func_calcStep;
        
        $func_false = 0;
        $func_true  = 2;
        
        $func_one = strrev($func_one);
        $func_two = strrev($func_two);
        
        $func_one = str_split($func_one, $func_calcStep);
        $func_two = str_split($func_two, $func_calcStep);
        
        $func_len = (count($func_one) > count($func_two)) ? count($func_one) : count($func_two);
        if(count($func_one) > count($func_two)) return $func_true;
        if(count($func_one) < count($func_two)) return $func_false;
        
        for($func_i = $func_len; $func_i > 0; $func_i--) {
          $func_A = strrev($func_one[$func_i - 1]);
          $func_B = strrev($func_two[$func_i - 1]);
          
          if($func_A > $func_B) return $func_true;
          if($func_A < $func_B) return $func_false;
        }
        
        return 1;
      }
    
    ?>


    Ohje... Ich war schonwieder Faul:
    Ihr seht das "$func_true"?
    Nunja...
    Es hat einen Sinn! Bei Negativen Zahlen ist das nunmal andersrum:
    -82798 ist kleiner als
    -82797

    Aber ich werd das bald noch verbessern.
    Sagt mir was ihr darüber haltet :)

    Euer,
    AlexRath
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. s******s

    Hallo allrath,

    dies habe ich in meinem "Pinseltool" (http://steffens.lima-city.de/pinseltool.php) ebenfalls gelöst; es rechnet unendlich große Potenzen und Divisionen aus. Dies ist nützlich, wenn man einen Mathematiklehrer hat, welcher als Strafarbeit Schüler irrsinnig große Zahlen (von Hand) ausrechnen lässt - mit Zwischenschritten, versteht sich. Also habe ich bei meinem Script das Ganze gelöst, indem ich den Rechenweg nachvollziehe, welchen man zum schriftlichen Multiplizieren bzw. Dividieren benutzt.


    Gruß
    steffens

    Beitrag zuletzt geändert: 8.7.2009 15:24:55 von steffens
  4. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!