Frage von MorsGER, 21

Logarithmus (Exponent berechnen) mit GPU-basiertem Programm?

Hallo, liebe Programmierer und/oder Mathe-Begeisterte.

Ich bin derzeit an einem etwas größeren Projekt, bei dem ich im jetzigen Arbeitsschritt vielmals mit dem Logarithmus rechnen muss. Ich benötige eine recht einfache Darstellung einer gegeben Zahl.

Theorie (Fragestellung weiter unten)

Das mache ich indem ich den Logarithmus der gegebenen Zahl durch den Logarithmus des Basiswert teile (welchen ich in einer Schleife von 2 bis unendlich durchlaufen lasse) um somit den Exponent zu berechnen.

Kurz gefasst also bei einer gegebenen Zahl von 343 (in Wirklichkeit größere Zahlen):

log(343)/log(2) ... log(343)/log(3) ......... log(343)/log(7). Bei diesen Berechnungen komme ich nacheinander auf Kommazahlen, bis ich bei der 7 bin; Dessen Ergebnis ist 3. Hier bin ich am Ziel meiner Berechnung und habe den Exponent herausgefunden. 7^3 = 343

Frage

Mein Programm, welches ich zu diesem Zwecke geschrieben habe, schafft 120000 Berechnungen pro Sekunde. Da das Projekt sehr umfangreich ist bin ich mit diesen Zeiten nicht zufrieden. Darum suche ich ein Programm welches, zum Beispiel durch GPU-Unterstützung, diesen Wert um ein vielfaches überschreitet.

Kann mir jemand ein geeignetes Programm nennen, stand selbst mal vor einem ähnlichen Problem, oder kann sonst hilfreiche Hinweise geben? Vielen Dank im Voraus!

Antwort
von PeterKremsner, 16

Das kommt mir insgesamt als sehr instabil vor.

Aufgrund von Fehlern in der Nummerischen Mathematik kann dir bei der Division log(343)/log(7) ebenfalls eine Zahl mit Komma herauskommen, die Frage ist was macht dein Algorithmus in diesem Fall?

Wozu willst du genau die Basis der Zahl berechnen vielleicht geht es einfacher...

Kommentar von MorsGER ,

Danke erstmal für die Antwort. Das Programm läuft so lange, bis es eine möglichst kurze Kommazahl hat. In einem solchen Fall würde es also weitersuchen.

Ich möchte eine kurze Rechnung (7^3) für einen gegebenen Wert (343) finden. Ein einfacherer Weg wäre natürlich wünschenswert. Ich bin für Vorschläge offen! :)

Kommentar von MorsGER ,

Aber auch danke für die Anregung mein Vorhaben zu hinterfragen. Ich habe nun eine Möglichkeit gefunden die 27000-fache Geschwindigkeit zu erreichen.

Kommentar von PeterKremsner ,

Das ist schon mal gut :)

Bevor du dich an so Sachen machst wie Berechnungen in der GPU solltest du zunächst mal versuchen alles mögliche zu optimieren.

Dazu gehört auch an Fälle zu denken in denen dein Algorithmus nicht konvergiert, sprich gibt es Fälle in denen dein Programm endlos suchen würde.

Also zB wenn es durch Rechenungenauigkeit das richtige Ergebnis gar nicht erkennt, oder vielleicht lässt sich die Zahl ja gar nicht als x^y darstellen etc.

Ich würde auch sagen, dass du hier einen Toleranzbereich definierst, sprich wenn deine Rechnung log7(343) 3.001 ergibt kannst du sagen genauer muss es nicht sein, also nehm ich die Zahl als genau 3 an.

Vielleicht kann man aber auch deinen Algorithmus vereinfachen.

Muss denn unbedingt eine Darstellung der Form 7^3 erfolgen?

Geht denn nicht auch 343 = 10^2.535?

Welche Kriterien muss die Darstellung erfüllen bzw muss denn deine Darstellung überhaupt in der Form x^y erfolgen?

Antwort
von Schachpapa, 3

Du suchst also eine ganzzahlige Lösung für a^b = n mit möglichst großem a?

Ich würde im ersten Anlauf in einer Schleife b ab 2 hochzählen, bis die "b te Wurzel" kleiner als 2 ist. Da kann man bestimmt eine nette Näherungsformel finden, da dich die Nachkommastellen der Wurzel ja eigentlich nicht interessieren. Findest du ein (fast) ganzzahliges Ergebnis, machst du die Gegenprobe. Wenn du 20 stellige Zahlen hast, brauchst du höchstens 60 Versuche.

Wenn n ungerade ist, nicht durch 3 teilbar und nicht auf 5 endet, kannst du bei "kleiner als 7" aufhören.

Oder du machst eine Primfaktorenzerlegung, dann müssen alle Faktoren den gleichen Exponenten haben.

Keine passende Antwort gefunden?

Fragen Sie die Community

Weitere Fragen mit Antworten