有几天,我一直在想如何计算大约100000!
(弧度)的大数字正弦。阶乘只是一个例子,数字本身可以是任何不仅仅是一个因子产品...)我显然不使用来自boost multiprecision库的double
但cpp_rational
。但我不能简单地执行100000! mod 2pi
,然后使用内置函数sinl
(我不需要超过10位十进制数字......),因为我需要数百万pi的数字准确地做到这一点。
有没有办法实现这个目标?
答案 0 :(得分:5)
这通常是一项非常重要的任务,因为它与Discrete Logarithm Problem有许多相似之处,这反过来意味着计算密集型计算。
也就是说,如果你考虑100000!/pi
的对数,你的计算可能会更容易,因为它减少到等于或小于100000
的所有正整数的对数和减法:{{1} }。如果您对此数字进行取幂,则会对log(N!/pi) = \sum_{i=0}^N (log i) - log(pi)
进行近似评估。减去整数部分,并将结果乘以(N!/pi)
。这是您pi
的估算值
在公式中:
正如您可能注意到的那样,我多次使用 approximate 这个词。这是由于以下考虑因素:
N! mod pi
s,它们有一些成本和错误log
并评估pi
:再次出错如果您认为它可能有用,请考虑使用Stirling's approximation。
作为最后的评论,这些问题并不容易解决,你总是要逐个处理它们。
答案 1 :(得分:0)
Wikipedia列出了许多三角标识。一些包含参数中的产品,例如递归的Chebyshev's Method,但可以使用Chebyshev Polynomials和/或memoization减少递归。如果你的论证很容易作为因子考虑因素,那么这可能是一种可行的方法。
答案 2 :(得分:0)
注意:= pi
以弧度计算非常大数的罪
(将它们除以multip的倍数除以3.1415)
1.观察:sin 0 = 0,sin 0.5pi = 1,sin pi = 1,sin1.5pi = -1,sin 2pi = 0
2.在pi前面的偶数或奇数整数值,sin为0
3.对于实数值(具有小数点的那些),对于小数点前的偶数,将其作为正弦值的0作为奇数,然后取1.作为正弦值的东西。
4.参见示例
*请注意,sin和余弦本质上是周期性的,这就是为什么有可能以这种方式对大数或小数进行。 :)
EG。 (使用计算器检查计算结果)
1.0弧度:罪100 = -0.506
除以3.1415
在降低
Sin 31.831pi(31.831是实数值)= sin1.831(180)= -0.506,检查
2.0弧度:罪50 = -0.2623
除以3.1415
在降低
Sin 15.9155pi = sin1.9155(180)= -0.2623
3.0弧度:罪700 = 0.5439
除以3.1415
在降低
Sin 222.8169pi = sin0.8169(180)= -0.5440,检查
4.0弧度:sin 15000 = 0.8934
除以3.1415
在降低
Sin 4774.6483pi = sin0.6483(180)= 0.893,检查
您可以看到使用弧度计算器直接计算值来检出所有答案。希望这有用。
如果你想写出一个计算程序,那么最好算一下算法。
答案 3 :(得分:-3)
也许您可以使用cpp_rational直接从非常大的数字计算窦:
sin(x): x/1! - x^3/3! + x^5/5! - x^7/7! + ...
重复此系列,直到没有(针对您的应用)发生重大变化。这样就可以完全避免使用数字pi。