Seit einigen Tagen frage ich mich, wie es möglich wäre, den Sinus großer Zahlen mit einer Größenordnung um 100000!
(Bogenmaß) zu berechnen. Die Fakultät ist nur ein Beispiel, die Zahl selbst kann beliebig sein und nicht nur ein faktorielles Produkt ...) Ich benutze offensichtlich nicht double
, sondern cpp_rational
aus der Boost-Multipräzisions-Bibliothek. Aber ich kann nicht einfach 100000! mod 2pi
machen und dann die eingebaute Funktion sinl
verwenden (ich brauche nicht mehr als 10 Dezimalziffern ..), da ich mehrere Millionen Stellen von pi benötige, um das genau zu machen.
Gibt es einen Weg, dies zu erreichen?
Dies ist im Allgemeinen eine nicht triviale Aufgabe, da sie viele Ähnlichkeiten mit dem Problem des diskreten Logarithmus aufweist, was bedeutet, dass es ist wiederum eine rechenintensive Berechnung.
Das heißt, Ihre Berechnung könnte einfacher sein, wenn Sie den Logarithmus von 100000!/pi
betrachten, da er sich auf die Summe der Logs aller positiven ganzen Zahlen gleich oder kleiner als 100000
reduziert und eine Subtraktion: log(N!/pi) = \sum_{i=0}^N (log i) - log(pi)
. Wenn Sie diese Zahl potenzieren, erhalten Sie eine ungefähre Auswertung von (N!/pi)
. Subtrahieren Sie den ganzzahligen Teil und multiplizieren Sie das Ergebnis mit pi
. Dies ist die Schätzung Ihrer N! mod pi
.
In der Formel:
Wie Sie vielleicht bemerken, habe ich oft das Wort approximate verwendet. Dies liegt an den folgenden Überlegungen:
log
s berechnen, die einige Kosten und Fehler enthalten pi
und bewerten Sie die sin
: again errors Wenn Sie denken, dass es nützlich sein könnte, sollten Sie die Stirling-Annäherung in Erwägung ziehen.
Als letzte Bemerkung gibt es keine einfache Lösung für diese Art von Problemen, Sie müssen sich immer mit ihnen befassen.
Wikipedia listet viele trigonometrische Identitäten auf. Einige enthalten Produkte im Argument, wie Chebyshev-Methode , die rekursiv ist, aber die Rekursion könnte mit Chebyshev Polynomials und / oder Memoization. Wenn Ihr Argument so einfach zu bewerten ist wie ein Faktor, dann könnte dies eine praktikable Methode sein.
Hinweis: = pi
Um die Sünde einer sehr großen Zahl im Bogenmaß zu berechnen
(Ändere sie zu Vielfachen von , indem du durch 3.1415 dividierst)
1. Beachte das: sin 0 = 0, sin 0.5pi = 1, sin pi = 1, sin1.5pi = -1, sin 2pi = 0
2. Gerade oder ungerade ganzzahlige Werte vor Pi, die Sünde ist 0
3. Für reelle Werte (solche mit Dezimalpunkten), für gerade Zahlen vor dem Dezimalkomma, nehmen Sie sie als 0. Etwas wie der Wert des Sinus, für ungerade, dann nehmen Sie die 1. etwas als Wert des Sinus.
4. Siehe Beispiele
* Beachten Sie, dass Sin und Cosinus periodisch sind, deshalb ist es möglich, dies für große oder kleine Zahlen zu tun. :)
z. (Verwenden Sie Ihre Rechner, um die Berechnungen zu überprüfen)
1.0 Im Bogenmaß: sin 100 = -0.506
Teilen durch 3.1415
Machen Sie in Grad
Sin 31.831pi (31.831 ist ein reeller Wert) = sin1.831 (180) = -0.506, check
2,0 Im Bogenmaß: sin 50 = -0,2623
Teilen durch 3.1415
Machen Sie in Grad
Sin 15.9155pi = sin1.9155 (180) = -0.2623
3,0 Im Bogenmaß: sin 700 = 0,5439
Teilen durch 3.1415
Machen Sie in Grad
Sin 222,8169pi = sin0,8169 (180) = -0,5440, überprüfen
4.0 Im Bogenmaß: sin 15000 = 0.8934
Teilen durch 3.1415
Machen Sie in Grad
Sin 4774.6483pi = sin0.6483 (180) = 0.893, überprüfen Sie
Sie können sehen, dass alle Antworten mit der direkten Berechnung der Werte mit dem Rechner im Radiomodus ausgecheckt wurden. Hoffe, das ist hilfreich.
Wenn Sie ein Rechenprogramm schreiben wollen, dann sollten Sie den Algorithmus herausfinden.