如何计算大数的正弦

bor*_*ero 8 c++ math boost trigonometry

一连几天,我一直在想,怎么会是可能的周围幅度计算庞大的数字的正弦100000!(弧度).阶乘只是一个例子,数字本身可以是任何不仅仅是一个因子产品...)我显然不使用doublecpp_rational来自boost multiprecision库.但我不能简单地做100000! mod 2pi,然后使用内置函数sinl(我不需要超过10位十进制数字..)因为我需要数百万的pi数字来准确地做到这一点.

有没有办法实现这个目标?

fed*_*ino 5

这通常是一项非常重要的任务,因为它与离散对数问题有许多相似之处,这反过来又意味着计算密集型计算.
也就是说,如果你考虑对数,你的计算可能会更容易100000!/pi,因为它减少到等于或小于所有正整数的对数的总和100000,以及减法:log(N!/pi) = \sum_{i=0}^N (log i) - log(pi).如果你对这个数字进行取幂,你会得到一个近似的评估(N!/pi).减去整数部分,并将结果乘以pi.这是你的估计N! mod pi.
在公式中:

正如您可能注意到的那样,我多次使用" 近似"这个词.这是由于以下考虑因素:

  • 你必须计算很多logs,它们有一些成本和错误
  • 您可能希望根据问题大小更改日志的基础; 这又会影响结果的准确性和精确度
  • 你必须取代:小错误可能导致大错误
  • 减去大数:可能导致大量取消
  • 乘以pi并评估sin:再次出错

如果您认为它可能有益,请考虑使用斯特林的近似值.

作为最后的评论,这些问题没有一个简单的解决方案,你总是必须逐个处理它们.