정보/C

벤포드의 법칙(Benford's Law)

MinseobKim 2022. 1. 20. 01:31

벤포드의 법칙은 우리 주변에 존재하는 수들에 관한 법칙이다.
임의의 자연수와는 달리 단위가 존재하는 인간이 인위적으로 생산한 수들을 모아 보면
맨 앞자리 수가 1인 것이 다른 것 보다 많다.
벤포드의 법칙은 이러한 수들의 맨 앞자리 수의 확률 분포가 다음과 같다는 것이다.
$P(d)=log_{10}(1+\frac{1}{d})$ (단, $d \in \{1,\ 2,\dotsc \ ,\ 9\}$이다.)

P(d)를 백분율로 나타낸 그래프


이를 이해하려면 수학Ⅰ에 나오는 상용로그의 성질을 알고 있어야 한다.

1보다 큰 $A$에 대하여 $logA$의 가수(양의 소수부분)가 $a$일 때
$A$의 첫 번째 자리수는 $\lfloor 10^{a} \rfloor$ 이다.

<증명>
$A=\overline{a_1a_2a_3a_4a_5}$ (A가 5자리수라 가정해도 일반성을 잃지않는다.)
$logA=4+a$
$a_1×10^4⩽A<(a_1+1)×10^4$
$loga_1+4⩽logA<log(a_1+1)+4$
$loga_1+4⩽4+a<log(a_1+1)+4$
$loga_1⩽a<log(a_1+1)$
$a_1⩽10^a<a_1+1$
$∴a_1=⌊10^a⌋$

위 내용을 이해했다면 벤포드의 법칙으로 넘어가보자.

벤포드의 법칙은 인간이 만들어낸 많은 값들이 곱셈과 관련하여 나타나기 때문에 나타난다.
따라서 맨 앞자리수가 d이고 m+1 자릿수인 값이 $kt^x$의 꼴로 나타난다고 놓는다.(k, t는 상수)
$\displaystyle \begin{array}{{>{\displaystyle}l}}
d\times 10^{m} \leqslant kt^{x} < ( d+1) \times 10^{m}\\
m+logd\leqslant logk+xlogt< m+log( d+1)
\end{array}$
이때 부등호 사이의 값은 $logd$와 $log(d+1)$사이의 범위에 존재하는데
위 식에서 $xlogt$부분을 통하여 상용로그를 씌운 값이 x에 비례하므로 균일하게 분포하게 된다.
이를 통해 맨 앞 자릿수가 d인 인 값의 수는 $log(d+1)-logd$의 값에 비례한다는 것을 알 수 있다.

이 과정을 통하여 $P(d)=log_{10}(1+\frac{1}{d})$ 과 같은 확률 분포가 나타난다는 것을 이해할 수 있다.

벤포드의 법칙이 정말 성립하는지 C언어를 통하여 두 가지 방법으로 확인해보겠다.

 

 


1. 피보나치 수열에서 첫째 항부터 $10^8$번째 항까지의 모든 항의 맨 앞자리 수의 비율을 구하고 이를 벤포드 법칙과 비교한다.


피보나치 수의 일반항은 다음과 같다.
$f_{n} =\frac{1}{\sqrt{5}}\left\{\alpha ^{n} -\beta ^{n}\right\} (\alpha =\frac{1+\sqrt{5}}{2} ,\beta =\frac{1-\sqrt{5}}{2})$
$F_{n}=logf_{n}$으로 놓는다.
$F_{n} =log\left( \alpha ^{n} -\beta ^{n}\right) +log\left(\frac{1}{\sqrt{5}}\right) \simeq log\left( \alpha ^{n} -\beta ^{n}\right)-\frac{1}{2} log5$
$|\beta |< 1, \alpha>1$이므로 $n$이 충분히 크면 $\beta^n$ 항을 0으로 근사할 수 있다.
$F_{n} \simeq log\alpha ^{n} -\frac{1}{2} log5\simeq nlog\alpha-\frac{1}{2} log5$

위에서 설명한 모든 내용을 종합하여 만든 c언어 코드는 다음과 같다.

#include <stdio.h>
#include <math.h>
long long int a[11];
int main(){
	int i;
	long double n,x;
	
	for(i=1;i<=100000000;i++){
		n=0.20898764024997876*i-0.34948500216800943;//log(alpha)=0.20898764024997876,(log5)/2=0.34948500216800943
		x=n-floor(n);
		a[(int)floor(pow(10,x))]+=1;
	}
	
	for(i=1;i<=9;i++){
		printf("d=%d.. 맨 앞자리 수의 비율 : %.6f ||||  벤포드 법칙에 의한 확률 : %.6f\n",i,(double)a[i]/100000000,log10(1+1/(double)i));
	}
	return 0;
}

실행 결과 벤포드 법칙과 구한 앞자리 수의 비율이 거의 일치한다는 것을 알 수 있다.

2. $10^7$개의 소수의 모든 항의 맨 앞자리 수의 비율을 구하고 이를 벤포드 법칙과 비교한다.


그렇다면 소수의 경우 벤포드의 법칙이 성립할까?
앞의 벤포드의 법칙의 증명 과정에서 값이 $kt^x$과 같은 곱셈의 꼴로 근사되어야지만 성립할 수 있었다.
소수는 x에 대한 지수의 꼴이 아니기 때문에 벤포드의 법칙이 성립하지 않을 것으로 예상해볼 수 있다.

C 프로그램을 통해 확인해보자.

#include <stdio.h>
#include <math.h>

long long int a[9];
int main(){
	long long int i,j,n,ch,sum=0;
	double x;
	n=10000000; //계산할 소수의 개수
	
	for(i=1;sum<n;i++){
		ch=1;
		for(j=2;j*j<=i;j++){
			if(i%j==0){
				ch=0;
				break;
			}
		}
		if(ch==1&&i!=1){
			printf("%lld        -> %lld번째소수\n", i,++sum);
			x=log10(i)-floor(log10(i));
			a[(int)floor(pow(10,x))]+=1;	
		}
	}
	for(i=1;i<=9;i++){
		printf("d=%d.. 맨 앞자리 수의 비율 : %.6f ||||  벤포드 법칙에 의한 확률 : %.6f\n",i,(double)a[i]/n,log10(1+1/(double)i));
	}
	return 0;
}

 

예상한 결과와 같이 소수 배열에서의 맨 앞자리 수 비율과 벤포드 법칙에 의한 확률이 큰 차이를 보이는 모습이다.
따라서 소수 배열에서는 벤포드 법칙이 성립하지 않는다는 것을 알 수 있다.


참고한 자료
https://m.blog.naver.com/alwaysneoi/220268517603
https://juve.tistory.com/77

도움 주신분

KAIST 22 LCY

'정보 > C' 카테고리의 다른 글

[자작 게임] Journey to a star  (0) 2021.11.01
원자의 전자배치  (0) 2021.06.29