AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

dividieren verdammt langer Zahlen

Ein Thema von Patrick · begonnen am 2. Sep 2004 · letzter Beitrag vom 3. Sep 2004
Antwort Antwort
Seite 2 von 2     12   
HW764
(Gast)

n/a Beiträge
 
#11

Re: dividieren verdammt langer Zahlen

  Alt 2. Sep 2004, 19:59
Warum willst du die Unit nicht nehmen?
  Mit Zitat antworten Zitat
Benutzerbild von atreju2oo0
atreju2oo0

Registriert seit: 5. Dez 2003
Ort: Berlin
289 Beiträge
 
Delphi 6 Enterprise
 
#12

Re: dividieren verdammt langer Zahlen

  Alt 2. Sep 2004, 20:46
Weil er es selber machen will was ja auch Ziel sein sollte...
Also nochmal:

In der 3ten Klasse lernt man den Algorithmus der schriftlichen Division kennen.
Mit diesem kann man BELIEBIG lange Zahlen dividieren.
Falls Du nicht wissen solltest wie der funktioniert einfach mal ins Mathebuch oder bei Google schauen.
Das ist auf jeden Fall der einfachste Weg und es gibt keine Sonderfälle ausser Periodizität,
die aber einfach zu überprüfen ist!
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von gmarts
gmarts

Registriert seit: 4. Apr 2004
Ort: Templin
290 Beiträge
 
Delphi 6 Enterprise
 
#13

Re: dividieren verdammt langer Zahlen

  Alt 2. Sep 2004, 21:39
Klick hier.

Hab zwar etwas Schelte bekommen für die ungünstige Variante mit Strings und für das Nichtbenutzen von Assembler, aber es funktioniert.

MfG
GM
procedure TForm1.Button1Click(Sender: TObject);
begin
button1.Click;
end;
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#14

Re: dividieren verdammt langer Zahlen

  Alt 3. Sep 2004, 04:04
Also, was ist 123 / 20 so Pi mal Daumen ??
Was ist 1 / 2 so Pi mal Daumen ??
Das nennt sich Approximation. D.h. du nimmst nur die ersten höchstwertigsten Ziffern beider Zahlen so daß beide im Zahlenbereich zB. von Double liegen. Im obigen Beispiel also die 1 aus 123 und die 2 aus 20. Nun dividierst du 1 / 2 und erhälst 0.5, das liegt Zifferntechnisch schon sehr am Ziel. Denn wir müssten nun das Resulat 0.5 an die Exponenten angleichen. Da jede Ziffer in einer Speicherstelle steht schieben wir also 0.5 um 2 ziffern nach linksund bekommen 50. Da aber die 20 ebenfalls eine zweistellige Zahl ist dürften wir die 0.5 eben nur um 1 Ziffern nach links schieben, es ergibt sich 5. Das liegt für so eine offenstischtliche Annährung = Approximation schon sehr nahe an 6.15. Man stellt sich also vor das man statt 123 / 20 eben 1 * 10^2 / 2 * 10^1 dividiert, man dividiert also 1 / 2 und korregiert mit 10^2/10^1 = 10^(2-1) = 10.

Mit dieser Technik arbeiten fast alle Divisonsroutinen für sehr große Zahlen, selbst die CPU's und deren Microcode arbeiten so. Wie man das Resultat schrittweise so approximiert das zum Schluß exakt 6.15 rauskommt ist eine andere Frage. Da gibt es sehr verschiedene Verfahren und die machen es erst so richtig interessant. Zb. die Newton Iteration, oder eben D.E.Knuths Division oder die Reziprokale Division, sprich Division durch Kehrwertbildung oder aber das absolut Gelbe vom Ei der "Fast Recursive Karatsuba Division" von Burnikel & Ziegler.

Ich empfehle dir unbedingt auf die Suche im WEB nach Donald E. Knuth's Standardwerk "The Art of Computer Programming" zu gehe. Das Kapitel 5 -> "Arithmetik" ist das einzigst gute Kapitel an diesem Buch, und es beschreibt alles was du brauchst. Zum Glück kannst du das als deutsche Übersetzung im Buchladen kaufen. Es haben sich also schon andere die Mühe gemacht das beste Kapitel des Buches zu übersetzen ISBN 3-540-66745-8

Willst du mehr, sprich ganz große Zahlen Dividieren, dann benötigst du als WICHTIGSTES eine schnelle Multiplikation. Hört sich komisch an ist aber wahr. Denn es ist theoretisch erwiesen das eine Division exakt minimal 2 mal solangsam sein wird wie eine Multiplikation. Die Quadierung ist theoretisch 1.5 mal schneller als die Multiplikation. Nun, im DEC habe ich für sehr große Zahlen eben obige "Fast Recursive Karatsuba Division" implementiert. Sie arbeitet mit Multiplikationen, einen Divide&Conquer Verfahren, und nutzt dazu die Fast Fourier Transformation in den Multiplikationen. Dieser Algorithmus ist der einzigste bekannte der an die Schwelle von "2 mal" langsammer rankommt. Alle anderen universellen Divisionsalgorithmen mit großen Zahlen sind bei weitem langsammer. Es gibt Ausnahmen, zB. die Reziprokale Division. 123 / 20 = 123 * (1/20). Das ist aber nur dann effizient wenn man viele Zahlen nacheinander durch 20 dividieren will, denn die Berechnung des Kehrwertes 1/20 dauert eben auch lange.

Dann gäbe es noch die Modularen Divisionen, sprich der "mod" oder "rem" Operator. Bei diesen Divisionen benötig man nicht den Quotienten sondern nur den Remainder=Rest. Da wäre der Montgomery Trick erwähnenswert.

Naja fehlen noch die Divisionen in anderen Zahlendomains, wie zB. in GF(2), Zn, F oder ECgf(p). Diese sind wiederum eine ganz andere Klasse von Algortihmen.

Es ist also noch ein langer weiter Weg für dich

Gruß Hagen

PS: das DEC solltest du dir denoch mal anschauen. Nicht zum abkupfern, da das was du suchst eh nicht als Source veröffentlicht wurde. Eher zur Überprüfung ob deine eigenen Routinen auch richtig rechnen. Ich kann dir aus eigener Erfahrung versichern das das Gold wert ist.
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#15

Re: dividieren verdammt langer Zahlen

  Alt 3. Sep 2004, 04:30
Und weil du so andeutest das du die 4 Grundrechenarten selber proggen willst, und mit großen Primzahlen arbeiten willst. Die fehlt dann nämlich eine ganz entscheidende Operation: die modulare Inversion, InvMod, X = Y^-1 mod Z. Diese Operation wirst du 100%tig bei großen Primzahlen, bzw. deren Berechnung benötigen, denn nur mit dieser Funktion ist es möglich zwei Zahlen in einem Modularen Ring zu dividieren. Im Grunde nichts anderes als eine Reziprokale Division aber in modularen Ringen. Nun, die Inversion wird durch den Erweiterten GCD berechnet. Auch dafür gibts spezielle Algos, zb. den von Euklid. den Binäre GCD oder den nach Lehmer/Sorenson die auch mit Initalapproximationen arbeiten.

Gruß hagen
  Mit Zitat antworten Zitat
Patrick

Registriert seit: 15. Sep 2003
184 Beiträge
 
Delphi 2010 Professional
 
#16

Re: dividieren verdammt langer Zahlen

  Alt 3. Sep 2004, 15:14
Ersteinmal Danke an alle, ich schaue mir das ganze nochmal genauer an und werde versuches es zu versehen und hoffentlich zu einer Lösung kommen...

Die Lösung aus der dritten Klasse kann ich nicht anwenden, sie ist unzureichend, sie funktioniert nur bei Teilern, die in einen Delphi Datentyp passen...

Noch bin ich guter Hoffnung
Genieße jede Minute deines Lebens, denn sie wird nicht wieder kommen.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:19 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz