一个数的质因子个数的粗略近似

\(n\) 的质因子个数为 \(k\)\(n=p_1^{\alpha_1}p_2^{\alpha_2}\dots p_k^{\alpha_k}\)

则当每个质数都只有一次时能使 \(k\) 最大时 \(n\) 最小。

所以设 \(2\times 3\times 5\times 7\dots=n\)

即设 \(n\) 为前 \(k\) 个质数的前缀积。

而前 \(k\) 个质数的前缀积远大于 \(k!\)

只需求出 \(k!=n\) 的近似值。

斯特灵公式\(k!\approx \sqrt{2\pi k}\left(\dfrac{k}{e}\right)^k\)

而前面的 \(\sqrt {2\pi k}\) 乘上后得出的 \(k\) 值又远小于真实 \(k\)

所以只需令 \(\left(\dfrac{k}{e}\right)^k=n\)

先取对数得到: \(k\ln \dfrac{k}{e}=\ln n\)

两边除 \(e\) 得: \(\dfrac{k}{e}\ln{\dfrac{k}{e}}=\dfrac{\ln n}{e}\)

即: \(\ln\frac{k}{e}\times e^{\ln\frac{k}{e}}=\dfrac{\ln n}{e}\)

\(\text{Lambert W Function}\) 可得出 \(\ln\dfrac{k}{e}=\operatorname{W}(\dfrac{\ln n}{e})\)

所以有:\(k=\exp\left(1+\operatorname{W}(\dfrac{\ln n}{e})\right)\)

又由于 \(\operatorname W(n)=O(\ln n-\ln \ln n)\)

并且 \(\ln\dfrac{\ln n}{e}=\ln \ln n-1\)

所以 \(k=\exp(1+\ln \ln n-1+\ln (\ln \ln n-1))\)

化简得到 \(k=\dfrac{\ln n}{\ln \ln n-1}\)

所以一个数的质因子个数的一个极其粗略的近似为 \(O(\dfrac{\ln n}{\ln\ln n})\)

为了检验其精确程度,不妨打个代码试试:

#include<bits/stdc++.h>
using namespace std;
#define ld long double
const int N=5e7;
int n,m;int p[N],a[N],prm;bool b[N+10];
void init(){
	int i,j;
	for(i=2;i<=N;++i){
		if(!b[i])p[++prm]=i;
		for(j=1;j<=prm&&i*p[j]<=N;++j){
			b[i*p[j]]=1;
			if(i%p[j]==0)break;
		}
	}
}
main(){
	int i,j=1;init();
	scanf("%d",&n);
	for(i=1;i<=n;++i)scanf("%d",&a[i]);
	ld tmp=0,d,dd;
	for(i=1;i<=prm;++i){
		tmp+=log(p[i]);
		d=log(tmp);
		d=tmp/(d-1);
		if(i==a[j]){
			printf("%d	%.10Lf	%.10Lf	%.10Lf\n",i,d,i-d,d/i);
			++j;
		}
	}
}

比如输入

10 100 500 1000 5000 10000 50000 100000 500000 1000000 3000000

可以得到这样一张表:

虽然误差 ( 第 \(3\) 列 ) 增长较快,但也不失为一个不错的近似 ( 最后一列逐渐趋于 \(1\) )

\(s_n=\prod\limits_{i=1}^{n}p_i\) ,即前 \(n\) 个质数的积。

应该能证明 \(\lim\limits_{n\rightarrow \infty}\dfrac{n\times (\ln\ln s_n-1)}{\ln s_n}=1\)

posted @ 2021-09-24 22:17  Y_B_X  阅读(55)  评论(0编辑  收藏  举报