定義
斯特林公式(Stirling's approximation)是一條用來取n的階乘的近似值的數學公式。一般來說,當n很大的時候,n階乘的計算量十分大,所以斯特林公式十分好用,而且,即使在n很小的時候,斯特林公式的取值已經十分準確。
斯特林公式在理論和套用上都具有重要的價值,對於機率論的發展也有著重大的意義。在數學分析中,大多都是利用Г函式、級數和含參變數的積分等知識進行證明或推導,很為繁瑣冗長。近年來,一些國內外學者利用機率論中的指數分布、泊松分布、χ²分布證之。
形式
![斯特林公式](/img/9/df1/wZwpmL2UTO3UDNyQzN2UzM1UTM1QDN5MjM5ADMwAjMwUzL0czLxYzLt92YucmbvRWdo5Cd0FmLzE2LvoDc0RHa.jpg)
或更精確的
![斯特林公式](/img/d/76a/wZwpmL2UTO2IzM5ADN3UzM1UTM1QDN5MjM5ADMwAjMwUzLwQzL1UzLt92YucmbvRWdo5Cd0FmLxE2LvoDc0RHa.jpg)
或
![斯特林公式](/img/0/7dc/wZwpmL0YzNzgTN3MzM3UzM1UTM1QDN5MjM5ADMwAjMwUzLzMzLzAzLt92YucmbvRWdo5Cd0FmLzE2LvoDc0RHa.jpg)
證明
![斯特林公式](/img/8/c34/wZwpmLwYjM1YzN0czN2UzM1UTM1QDN5MjM5ADMwAjMwUzL3czLxIzLt92YucmbvRWdo5Cd0FmLzE2LvoDc0RHa.jpg)
令
![斯特林公式](/img/0/331/wZwpmL3ADMzAjN5QjN2UzM1UTM1QDN5MjM5ADMwAjMwUzL0YzLyMzLt92YucmbvRWdo5Cd0FmLwE2LvoDc0RHa.jpg)
則
![斯特林公式](/img/2/9aa/wZwpmL3IDO1gDN0UjN2UzM1UTM1QDN5MjM5ADMwAjMwUzL1YzLyUzLt92YucmbvRWdo5Cd0FmL0E2LvoDc0RHa.jpg)
![斯特林公式](/img/a/b4d/wZwpmLzQTO4UTO3ADN3UzM1UTM1QDN5MjM5ADMwAjMwUzLwQzL1AzLt92YucmbvRWdo5Cd0FmL0E2LvoDc0RHa.jpg)
![斯特林公式](/img/4/3a4/wZwpmL4QDN2YzM4MjN2UzM1UTM1QDN5MjM5ADMwAjMwUzLzYzL4YzLt92YucmbvRWdo5Cd0FmL0E2LvoDc0RHa.jpg)
![斯特林公式](/img/5/c0e/wZwpmL4gzNzADM1ADN3UzM1UTM1QDN5MjM5ADMwAjMwUzLwQzLxYzLt92YucmbvRWdo5Cd0FmLzE2LvoDc0RHa.jpg)
![斯特林公式](/img/6/e5d/wZwpmL3QDO2gjM0YTO2UzM1UTM1QDN5MjM5ADMwAjMwUzL2kzL2czLt92YucmbvRWdo5Cd0FmLwE2LvoDc0RHa.jpg)
所以 即 ,即單調遞減,又由積分放縮法有
![斯特林公式](/img/a/c39/wZwpmL4ITN0QjN5ADO2UzM1UTM1QDN5MjM5ADMwAjMwUzLwgzLygzLt92YucmbvRWdo5Cd0FmLzE2LvoDc0RHa.jpg)
![斯特林公式](/img/8/85a/wZwpmLzcTO4ATN2ADN3UzM1UTM1QDN5MjM5ADMwAjMwUzLwQzLwYzLt92YucmbvRWdo5Cd0FmLyE2LvoDc0RHa.jpg)
即 ,即
![斯特林公式](/img/f/578/wZwpmLycDNwEjNykzN5ADN0UTMyITNykTO0EDMwAjMwUzL5czL1MzLt92YucmbvRWdo5Cd0FmL0E2LvoDc0RHa.jpg)
由單調有界定理 的極限存在 ,
![斯特林公式](/img/7/924/wZwpmLyUjM0gzMzIDM3UzM1UTM1QDN5MjM5ADMwAjMwUzLyAzLwgzLt92YucmbvRWdo5Cd0FmLzE2LvoDc0RHa.jpg)
設
![斯特林公式](/img/c/4bd/wZwpmLzEjN5cTNyMDM3UzM1UTM1QDN5MjM5ADMwAjMwUzLzAzLwAzLt92YucmbvRWdo5Cd0FmLxE2LvoDc0RHa.jpg)
![斯特林公式](/img/4/923/wZwpmLwQDM5MjN5YzN2UzM1UTM1QDN5MjM5ADMwAjMwUzL2czLyYzLt92YucmbvRWdo5Cd0FmLzE2LvoDc0RHa.jpg)
利用Wallis公式,
![斯特林公式](/img/9/995/wZwpmL3EzMwADNxkTN2UzM1UTM1QDN5MjM5ADMwAjMwUzL5UzLyczLt92YucmbvRWdo5Cd0FmLwE2LvoDc0RHa.jpg)
![斯特林公式](/img/8/736/wZwpmLzYTMyETN0QDO2UzM1UTM1QDN5MjM5ADMwAjMwUzL0gzLxEzLt92YucmbvRWdo5Cd0FmLyE2LvoDc0RHa.jpg)
所以
![斯特林公式](/img/f/54e/wZwpmL4QDM5EDN2IDN3UzM1UTM1QDN5MjM5ADMwAjMwUzLyQzL4EzLt92YucmbvRWdo5Cd0FmLxE2LvoDc0RHa.jpg)
![斯特林公式](/img/5/418/wZwpmL3cTN0YjM5QDO2UzM1UTM1QDN5MjM5ADMwAjMwUzL0gzL1UzLt92YucmbvRWdo5Cd0FmL0E2LvoDc0RHa.jpg)
即
程式
斯特林數判斷階乘位數
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
const double e = 2.71828182845;
const double pi = 3.1415926;
int main(void) {
int t, i, f, v;
double a, s;
const double log10_e = log10(e);
const double log10_2_pi = log10(2.0*pi)/2.0;
while (scanf("%d", &t) != EOF && t) {
for (i = 0; i < t; ++i) {
scanf("%d\n", &v);
if (1 == v) {printf("1\n"); continue;}
a = v;
s = log10_2_pi + (a+0.5)*log10(a) - a * log10_e;
f = ceil(s);
printf("%d\n", f); } }
return 0; }