Ansatz für eine Klasse, die sehr große Gleitkommazahlen darstellen kann
-
unskilled schrieb:
Jester schrieb:
Es gibt schnellere Methoden die Multiplikation zu berechnen, zum Beispiel den Karazuba-Algorithmus. Das hier finde ich eine ganz schöne Beschreibung: http://www-i1.informatik.rwth-aachen.de/~algorithmus/algo16.php
[...]Ich finde O(n^1.58) ist schon *deutlich* netter als O(n^2).
Also zunächst einmal fehlt bei dieser Statistik leider die Häufigkeit von Addition und vor allem Subtraktion im Vergleich...
Subtraktion: Schulmethode = 0; Karazuba = viele ^^
Addition: von Gefühl her würd ich sagen: Schulmethode << KarazubaAlso wird aus dem
n^1,58 : n^2fast schon ein Gleichstand würde ich sagen, aber nat. kann ich das nicht genau mit 100%iger Sicherheit sagen, weil ich mir den Algo dazu hätte intensiver angucken sollen ^^
???
Wo wird hier was nicht gezählt? Die O(n^1.58) sind hier tatsächlich schon der gesamte Aufwand. Die Schulmethode benötigt n Additionen -> O(n^2). Eine Subtraktion ist genauso aufwendig wie eine Addition. Karazuba benötigt von Additionen und Subtraktionen insgesamt deutlich weniger als die Schulmethode.
Schau's Dir wirklich nochmal in Ruhe an und mach die Analyse dazu.
Zu guter Letzt habe ich auch noch gelesen, dass die Karazuba-Methode nur für 2^n - lange Zahlen gilt... Deshalb würde ich mal stark bezweifeln, dass es sich für eine 2^n - 1 stellige Zahl lohnen wird (diese Aussage ist nat. auf große n zu beziehen)... Wenn man nur die Multiplikationen sieht dann schon aber eine Subtraktion ist ja auch nicht ganz kostenlos ^^
ahja, 2^n geht und 2^n-1 geht nicht... für welches n? Richtig ist: Die Zahl braucht eine 2er-Potenz an Stellen. Das erreicht man aber einfach, indem man die fehlenden Stellen (implizit) mit Nullen auffüllt.
PS: Sicherlich müsste man sich den Algo genauer angucken um sagen zu können, dass er doof ist
Ja, würde ich an Deiner Stelle mal machen, oder hier zumindest keinen Quatsch erzählen. Ist ja nicht schlimm, wenn man das nicht versteht, aber dann sollte man hier nicht so tun als sei das ein ganz großer Mist.
-
Jester schrieb:
Wo wird hier was nicht gezählt? Die O(n^1.58) sind hier tatsächlich schon der gesamte Aufwand.
Wie soll das denn gehen? In dem man davor genau sagt, wie lange im Vergleich zu einer Multiplikation eine Subtraktion dauert? Oo Es ist nur der Aufwand an Multiplikationen... Richtig ist nat., dass:
O(Addition) < O(Subtraktion) < O(Multiplikation) < O(Division)
gilt - und die Subtraktionen deshalb lange nicht so schwer ins Gewicht fallen wie die Multiplikationen. Aber wenn du sie bei der Berechnung gleich weglassen willst... Das kannst du immer nur, wennHä?? schrieb:
Addition fällt da nicht ins Gewicht, so lang die Anzahl sich maximal um ein konstantes Vielfaches von der Anzahl der Multiplikationen unterscheidet.
Gilt nat. auch für Subtraktionen - nur eben, dass dieses Vielfache dann kleiner ist...
Jester schrieb:
Die Schulmethode benötigt n Additionen -> O(n^2).
Nein, n Multiplikationen
Jester schrieb:
Eine Subtraktion ist genauso aufwendig wie eine Addition.
Nein?
Jester schrieb:
Karazuba benötigt von Additionen und Subtraktionen insgesamt deutlich weniger als die Schulmethode.
Wie oft subtrahierst
duin der Schulmethode denn? OoJester schrieb:
ahja, 2^n geht und 2^n-1 geht nicht... für welches n? Richtig ist: Die Zahl braucht eine 2er-Potenz an Stellen. Das erreicht man aber einfach, indem man die fehlenden Stellen (implizit) mit Nullen auffüllt.
Ja - und damit einen Mehraufwand gegenüber der Schulmethode hat...
Jester schrieb:
Ja, würde ich an Deiner Stelle mal machen, oder hier zumindest keinen Quatsch erzählen. Ist ja nicht schlimm, wenn man das nicht versteht, aber dann sollte man hier nicht so tun als sei das ein ganz großer Mist.
lol... Wenn ich mir hier noch mal all das durchlese, was du geschrieben hast, dann frag ich mich, wer hier weniger Ahnung hat... Der, der Addition nicht von Multiplikation unterscheiden kann und sagt, dass eine Addition genau die selbe Rechenzeit braucht wie eine Subtraktion? Sry, aber das is mir zu doof...
Außerdem habe ich extra am Ende noch mal ausdrücklich geschrieben, dass ich damit nicht sagen will, dass die Methode von K. doof ist oder gar langsamer als die Schulmethode
unskilled schrieb:
aber langsamer sollte er nicht sein, es sei denn, bei der Subtraktion läuft iwas grundsätzlich falsch ^^
Ich wollte damit nur sagen, dass ich den Performance-Gewinn "im Hobby-Bereich" nicht als sooo unendlich viel ansehe... Das ist nat. was komplett anderes, wenn du gerade versuchst, eine neue größte Primzahl zu suchen oder so... Und wenn ich das machen wöllte würde ich davor trotzdem noch eine effektivere Methode suchen (http://de.wikipedia.org/wiki/Sch%C3%B6nhage-Strassen-Algorithmus) - womit ich jz nicht sagen wollte, dass ich ihn angeguckt hätte, aber wenn ich etwas total schnelles brauche und nichts fertiges nehmen will, dann muss ich halt au ma in den sauren Apfel beißen und mir so was so lang angucken, bis ichs verstehe...
bb
-
Addition und Subtraktion haben eine kostante Laufzeit, sprich O(1). Beide!
-
@unskilled, wenn man keine Ahnung hat...du kennst den Spruch sicher.
O(Addition)=O(Subtraktion), oder anders gesagt Subtraktionen brauchen nicht getrennt beachtet zu werden, denn a-b=a+(-b). Unäres Minus bedeutet, dass das Vorzeichen gedreht wird, also sicher in konstanter Zeit möglich und somit ist der Aufwand von beiden gleich.
Übrigens gibt es kein < oder > für Mengen, zumindest müsstest du vorher definieren was du damit meinst. Ich schätze mal das Enthaltensein, dafür gibts bereits Symbole, aber da Latex ja derzeit nicht geht kann ich sie dir nicht zeigen. Kannst aber selber Suchen nach "Teilmenge" und "Obermenge".Jester als ahnungslos zu beschimpfen ist an für sich ja schon eine Frecheit, aber darum gehts jetzt erstmal nicht.
Das Problem ist, dass du nicht einmal erkennst, dass bei der Schulmethode O(n²) Multiplikationen vorkommen und O(n) Additionen (genaugenommen n Additionen).
Aber das spielt alles keine Rolle, da die Anzahl der Additionen in O(n) liegt und für die Anzahl der Multiplikationen gilt ω(n), das heißt die Anzahl der Multiplikationen wächst bei beiden Methoden echt schneller als linear und damit zählt einzig und allein der Aufwand für die Multiplikationen in Abhängigkeit von der Anzahl der Stellen n (wobei n die Anzahl der Stellen der größeren der beiden Zahlen ist).
-
danke.

btw hat sogar wikipedia die Analyse, samt Additionen und Subtraktionen: http://de.wikipedia.org/wiki/Karatsuba-Algorithmus#Laufzeitanalyse
-
Joar - sry... Hatte ich dann auch gelesen - davor hatte ich immer nur von vergleichen á la laufzeit(add) < laufzeit(sub) gelesen... allerdings waren das nie algorithmen sondern immer eher relativ (sehr ^^) alten maschinen, für die das galt...
an die tatsache, dass die laufzeit bei beidem linear ist, hab ich im eifer des gefächts nicht gedacht...
sry

-
Wobei man sagen muß, dass der Schönhage-Strassen-Algorithmus, den Du verlinkt hast, schon nochmal deutlich effizienter ist. Der Nachteil gegenüber der Methode von Karazuba ist, dass er viel komplizierter ist. Die Korrektheit von Karazuba kann man mit Schulmathematik und ein bißchen nachdenken einsehen. Was aber die Fourier-Trafo im Schönhage-Strassen-Algorithmus zu suchen hat, ist ohne tieferes mathematisches Verständnis nicht so ohne weiteres einzusehen.
Wenn es also um pure Effizienz geht, dann den. Wenn es aber drum geht ein bißchen besser zu sein als die Schulmethode und gleichzeitig noch genau zu verstehen was da abgeht, dann scheint mir Karazuba die einfacher Wahl zu sein.
-
Btw. hier mal nen Bild dazu (geklaut von Zahlentheorie Prof):
http://math-www.uni-paderborn.de/~k-heinz/de/forschung/m.gif
-
Da ist ja einiges zusammengekommen, danke.
Auch für die Diskussion, die hat mir geholfen.
Dennoch denke ich, dass mein Geschwindigkeitsverlust nicht nur an diesem Algorithmus liegt, sondern an meinem Code generell, sprich Strings als Behälter der Ziffern oder andere Funktionen von mir.
Kann mir jmd nen Profiler nennen und vlt. nen tutorial im internet(ich find da nix passendes), da ich keine ahnung habe, wie ich solche anwende.
Danke schonmal
-
Kann mir jmd nen Profiler nennen und vlt. nen tutorial im internet(ich find da nix passendes), da ich keine ahnung habe, wie ich solche anwende.
ADM Code Analyst. Eine Einführung gibts irgendwo auf der Seite des Programmes.
EDIT:
Download:
http://developer.amd.com/cpu/CodeAnalyst/codeanalystwindows/Pages/default.aspxEinführung:
http://developer.amd.com/documentation/articles/pages/1212200690.aspx
-
Danke für die schnelle Antwort drakon

-
Don Quijote schrieb:
Danke für die schnelle Antwort drakon

Und weils Heute schönes Wetter war, gibts sogar noch editierte Links.

-
Ist der nur Für AMD Prozessoren oder kann man den auch bei Intel Prozessoren verwenden?
-
Don Quijote schrieb:
Ist der nur Für AMD Prozessoren oder kann man den auch bei Intel Prozessoren verwenden?
Geht auch für Intel.
-
Danke, falls ich probleme bekommen sollte, dann melde ich mich
.mfg
Don Quijote