首页 > 其他分享 >近似计算阶乘的对数

近似计算阶乘的对数

时间:2024-02-01 23:12:48浏览次数:25  
标签:frac log ln np 近似计算 阶乘 对数

问题起因

阶乘 \(n!\) 的增长速度非常快。\(20!\) 不能存储在典型的 int 变量中,\(200!\) 就连双精度浮点变量也不能近似。处理阶乘的对数会是更方便的选择。

那么,该如何在不计算阶乘结果的前提下,计算阶乘的对数?

斯特林公式

斯特林公式(Stirling's approximation)是一条用来取 \(n!\) 的近似值的数学公式。斯特林公式能够将求解阶乘的复杂度降低到对数级。

\[n!\approx \sqrt{2\pi n}(\frac{n}{e})^n \]

其误差约为 \(\frac{1}{12n}\)。换句话说,\(n\) 越大误差越小。

借助斯特林公式,可以方便地计算阶乘的对数。

\[\ln n! \approx (n-\frac{1}{2})\ln n -n +\frac{1}{2}\ln 2\pi \]

提高精度

Gergő Nemes在2007年提出了一个近似公式:

\[\ln n!\approx \frac{1}{2}[\ln (2\pi)-\ln n]+n\left[\ln\left(n+\frac{1}{12n-\frac{1}{10n}}\right)-1\right] \]

当 \(n\) 大于 8 时,近似值可精确到小数点后 8 位。

Python 代码与一个奇特技巧

查阅 radarsimpy 的代码时,发现有一个取巧的小想法。

既然 \(n\) 越大时估算越准确,那么为何不计算 \(n+x\) 的结果,然后把 \(x\) 给去掉?

def log_factorial(n):
    n = n + 9.0  # 让 n 变大
    product = 1
    for i in range(1, 9):
        product *= n - i
    return (
        1 / 2 * (np.log(2 * np.pi) - np.log(n))
        + n * (np.log(n + 1 / (12 * n - (1 / 10 / n))) - 1)
        - np.log(product)  # 去掉多算的阶
    )

参考来源

标签:frac,log,ln,np,近似计算,阶乘,对数
From: https://www.cnblogs.com/chirp/p/18002333

相关文章

  • 双重按位非运算符 ~~ 对数字取整
    介绍按位非运算符(~)将操作数的位反转。它将操作数转化为32位的有符号整型。也就是可以对数字进行取整操作(保留整数部分,舍弃小数部分)。~-2//1~-2.222//1并且按位非运算时,任何数字 x(已被转化为32位有符号整型) 的运算结果都是 -(x+1)。那么双重按位非(~~)对数字的运......
  • js中对数组的unshift是什么操作,为什么使用unshift进行命名?
    在JavaScript中,unshift()是数组对象的一个原生方法,它用于向数组的开头添加一个或多个元素,并将原有的数组元素依次向后移动。这个方法会改变原始数组本身,同时返回新的数组长度。在英语中,“unshift”不是一个标准的单词,但我们可以将其拆解为“un-”和“shift”。其中:“un-”是......
  • 快乐学Python,如何对数据进行清洗?(缺失值处理和重复值删除)
    上一篇文章中,我们介绍了通过pandas读取数据到DataFrame中之后,对DataFrame中数据的操作方式,这篇文章我们继续来介绍:数据清洗。即:当读取的数据出现缺失或异常时,我们如何对缺失的数据进行预处理。1、缺失值是什么?当我们从数据文件(CSV、Excel等)或者其他数据源加载到DataFrame中时,往......
  • P5739 【深基7.例7】计算阶乘
    1.题目介绍【深基7.例7】计算阶乘题目描述求\(n!\),也就是\(1\times2\times3\dots\timesn\)。挑战:尝试不使用循环语句(for、while)完成这个任务。输入格式第一行输入一个正整数\(n\)。输出格式输出一个正整数,表示\(n!\)。样例#1样例输入#13样例输出#16提示......
  • 近似计算Survey阅读笔记
    近似计算Survey阅读笔记论文:AReview,Classification,andComparativeEvaluationofApproximateArithmeticCircuits|ACMJournalonEmergingTechnologiesinComputingSystems指标错误率:errorrate(ER)错误距离:errordistance(ED)归一化平均错误举例:normalizedmeane......
  • 洛谷题单指南-模拟和高精度-P1591 阶乘数码
    原题链接:https://www.luogu.com.cn/problem/P1591题意解读:此题核心就是通过高精度*低精度计算阶乘,然后统计数码个数即可,直接给出代码。100分代码:#include<bits/stdc++.h>usingnamespacestd;vector<int>mul(vector<int>&a,intb){vector<int>result;intt......
  • 达梦对数据表添加列和删除列优化测试
    背景需求近期项目中碰到一个问题,涉及到应用版本更新,每次更新,就需要对业务系统中上千个表进行增加列或删除列的操作,每个表数据量都比较大,对一个表增加一个列就需要几分钟,导致整个升级需要十几个小时,而同样的在oracle只需要半个小时完成,如果涉及到大版本更新,一次跟新就需要往表添加......
  • C# 对数值进行与,或,异或操作的学习理解
    //&符号是and,与,一个为0都是0,全部为1才是1//1&1=1,1&0=0,1与任何数都是任何数//0&1=0,0&0=0,0与任何数都是0varnum1=0b_1010_1010_1010;varnum2=0b_1111_0000;//保留num1二进制中4-7位Conso......
  • 题解:阶乘
    题目大意给定一个数\(n\),求两个数\(a\),\(b\),使\(\Large\frac{a!}{b!}\normalsize=n(a>b)\)。若有无数组解输出-1。多组数据。思路简析\[a!=a\times(a-1)\times(a-2)\times\cdots\times2\times1\]\[b!=b\times(b-1)\times(b-2)\times\cdots\times2\times1\]......
  • TCP 拥塞控制对数据延迟的影响
    哈喽大家好,我是咸鱼今天分享一篇文章,是关于TCP拥塞控制对数据延迟产生的影响的。作者在服务延迟变高之后进行抓包分析,结果发现时间花在了TCP本身的机制上面:客户端并不是将请求一股脑发送给服务端,而是只发送了一部分,等到接收到服务端的ACK,然后继续再发送,这就造成了额外的RTT......