GNURZ Dokumentation

GNURZ: Arithmetik zum Umgang mit (G)roßen (N)atürlichen (U)nd (R)ationalen (Z)ahlen

GNURZ stellt alle zum Umgang mit beliebig großen natürlichen und rationalen Zahlen notwendigen Funktionen und Grundoperationen bereit.

Der größte native FreePascal-Datentyp ist qword. Mit qword können bis zu 19-stellige Zahlen dargestellt werden. Aufgrund dieser Beschränktheit wurden für große natürliche und rationale Zahlen zwei neue Datentypen notwendig:

Datentyp für große natürliche Zahlen (GNZ):

GNZTyp = array of dword;

Eine Ziffern-Zeichenfolge in Form eines Strings lässt sich durch die Funktion StrToGNZTyp in den GNZTyp umwandeln. Umgekehrt gibt GNZTypToStr die Zahl als Ziffernfolge zurück. Für Zahlen vom Typ DWord gibt es die Funktionen WordToGNZTyp und GNZTypToWord. Die konkrete Anwendung der Funktionen kann im Demo-Projekt nachvollzogen werden: http://forge.lazarusforum.de/projects/list_files/gnurz

Datentyp für große rationale Zahlen (GRZ):

GRaZTyp = record
    nenner, zaehler: GNZTyp;
    Negativ: boolean;

Wie aus dieser Deklaration hervorgeht, werden rationale Zahlen in Form von Brüchen behandelt, bei denen jeweils Nenner und Zähler große natürliche Zahlen vom Typ GNZTyp sind. Die Zahl 3,14159 kann entsprechend durch 314159/100000 ausgedrückt werden. Dadurch werden beliebig genaue Rechnungen möglich, da wie im Beispiel 2/3=0,66666... keine Nachkommastellen abgeschnitten werden müssen und es somit zu keinen Rundungsfehlern kommt.

Die zur Zeit verfügbaren Funktionen und Operationen in Verbindung mit großen natürlichen und rationalen Zahlen sind folgende:

Operationen: Natuerliche Zahlen

      function GNZadd(a,b:GNZTyp):GNZTyp;                
              //Gibt die Summe a + b zurueck. Rechnet mit Grossen Natuerlichen Zahlen (GNZ); Zbasis=Zahlenbasis (Dezimalsystem:Zbasis=10)

      function GNZsub(Minuent,Subtrahend:GNZTyp):GNZTyp; 
              // Rechnet Minuend-Subtrahend. Aus Minuent<Subtrahend folgt Errormodus:=1

      function GNZmul(a,b:GNZTyp):GNZTyp;                
              //Gibt das Produkt a*b zurueck. Rechnet mit grossen natuerlichen Zahlen.

      function GNZmulword(a:dword;b:GNZTyp):GNZTyp;     
              // Wie GNZmul, nur ist a vom Typ dword

      function GNZakleinerb(a,b:GNZTyp):boolean;         
              // Prueft, ob a kleiner ist als b

      function GNZagleichb(a,b:GNZTyp):boolean;          
              // Prueft, ob sich a und b gleichen.

      function GNZdiv(Divident, Divisor:GNZTyp):GNZTyp;  
              //dividiert Divident durch Divisor und gibt das Ergebnis zurueck

      function GNZmod(Divident, Divisor:GNZTyp):GNZTyp;  
              //Gibt Divident mod Divisor zurueck

      function GNZggt(a,b:GNZTyp):GNZTyp;                
              //Groesster gemeinsamer Teiler fuer grosse natuerliche Zahlen (GNZ)

      function GNZkgv(a,b:GNZTyp):GNZTyp;                
              //Kleinstes gemeinsames Vielfaches fuer GNZ

      function GNZistgerade(zahl:GNZTyp):boolean; inline; 
              //Prueft, ob zahl mod 2 = 0

      function GNZPotenz(Basis,Exponent:GNZTyp):GNZTyp;  
              //Gibt Zahl^Exponent zurueck.

      function GNZPotenzMod(Basis,Exponent,Modulo:GNZTyp):GNZTyp; 
              //Rechnet Basis^Exponent mod Modulus.

      function GNZFakultaet(nFak:dword):GNZTyp;          
              // Gibt n! zurueck - experimentell

      function GNZIstPrim(zahl:GNZTyp):boolean;          
              //Wahr, wenn zahl Primzahl - experimentell

      function GNZMillerRabin(zahl:GNZTyp; it:word):boolean; 
              //Miller-Rabin Primzahltext. Wenn die Zahl den Test besteht, ist sie mit einer Wahrscheinlichkeit von (1/4)^it prim.

      function GNZMRPrimdanach(zahl:GNZTyp; it:word):GNZTyp;  
              //Bestimmt die nach zahl nächste Primzahl mit Hilfe des Miller-Rabin-Algorithmus

      function GNZZufall(Obergrenze:GNZTyp):GNZTyp;  
              // Gibt eine Zufallszahl wieder, die kleiner ist als Obergrenze.

      function GNZeins:GNZTyp;                 
              // Gibt 1 zurueck

      function GNZnull:GNZTyp;                     
              // Gibt 0 zurueck

Operationen: Rationale Zahlen

      function GRaZKuerzen(Bruch:GRaZTyp):GRaZTyp;       
              //Kuerzt den Bruch

      function GRaZadd(a,b:GRazTyp):GRaZTyp;             
              //Rechnet a+b und kuerzt die Summe anschliessend

      function GRazsub(Minuent,Subtrahend:GRaZTyp):GRaZTyp; 
              //Wenn Minuent<Subtrahend wird Errormodus:=1 gesetzt

      function GRaZmul(a,b:GRaZTyp):GRaZTyp;             
              //Multipliziert die Brueche miteinander

      function GRaZdiv(Divident,Divisor:GRaZTyp):GRaZTyp;   
              //Dividiert durch Multiplikation mit dem Kehrwert

      function GRaZakleinerbBetrag(a,b:GRaZTyp):boolean;
              //Gibt true zurueck, wenn |a| < |b|

      function GRaZakleinerb(a,b:GRaZTyp):boolean;       
              //Gibt true zurueck, wenn a < b

      function GRaZagleichbBetrag(a,b:GRaZTyp):boolean; 
              //Gibt true zurueck, wenn |a| = |b|

      function GRaZagleichb(a,b:GRaZTyp):boolean;        
              //Gibt true zurueck, wenn a = b   

Funktionen zur Typenkonvertierung und sonstige Funktionen:

      function GetErrormodus:dword;                  
              //Gibt 0 zuruecht, wenn kein Fehler aufgetreten ist.

      procedure ResetErrormodus;                     
              //Setzt Errormodus auf 0 zurueck

      function GetKarazubagrenze:dword;              
              //Gibt die Grenze zurueck, aber der der Karazuba-Algo. der Multiplikation verwendet wird

      procedure SetKazarzbagrenze(Grenze:dword);     
              //Setzt die Karazuba-Grenze neu.

      function GetGlobZahlenbasis:dword;             
              //Gibt die Zahlenbasis zurueck, mit der GNURZ intern(!) rechnet.

      procedure SetGlobZahlenbasis(basis:dword);     
              //Setzt die Zahlenbasis von GNURZ

      function StrToGNZTyp(Eingabe:string):GNZTyp;   
              //Wandelt eine natuerliche Zahl in string-Forum um in den Typ GNZTyp von Basis 10. Eingabe darf nur Zahlen enthalten.

      function GNZTypToStr(Eingabe:GNZTyp):string;   
              //"Umkehrfunktion" zu StrToGNZTypDez;

      function WordToGNZTyp(WZahl:dword):GNZTyp;     
              //Wandelt ein dWord in eine Zahl vom GNZTyp um

      function GNZTypToWord(ZahlGNZ:GNZTyp):dword;   
              //Wandelt GNZTyp in dWord um