40 lines
1.2 KiB
Text
40 lines
1.2 KiB
Text
#DEFINE CTAB CHR(9)
|
|
#DEFINE COMMA ","
|
|
#DEFINE CRLF CHR(13) + CHR(10)
|
|
LOCAL i As Integer, n As Integer, n1 As Integer, rho As Double, c As String
|
|
n = 1000
|
|
LOCAL ARRAY a[n,2], res[1]
|
|
CLOSE DATABASES ALL
|
|
CREATE CURSOR fibo(dig C(1))
|
|
INDEX ON dig TAG dig COLLATE "Machine"
|
|
SET ORDER TO 0
|
|
*!* Populate the cursor with the leading digit of the first 1000 Fibonacci numbers
|
|
a[1,1] = "1"
|
|
a[1,2] = 1
|
|
a[2,1] = "1"
|
|
a[2,2] = 1
|
|
FOR i = 3 TO n
|
|
a[i,2] = a[i-2,2] + a[i-1,2]
|
|
a[i,1] = LEFT(TRANSFORM(a[i,2]), 1)
|
|
ENDFOR
|
|
APPEND FROM ARRAY a FIELDS dig
|
|
CREATE CURSOR results (digit I, count I, prob B(6), expected B(6))
|
|
INSERT INTO results ;
|
|
SELECT dig, COUNT(1), COUNT(1)/n, Pr(VAL(dig)) FROM fibo GROUP BY dig ORDER BY dig
|
|
n1 = RECCOUNT()
|
|
*!* Correlation coefficient
|
|
SELECT (n1*SUM(prob*expected) - SUM(prob)*SUM(expected))/;
|
|
(SQRT(n1*SUM(prob*prob) - SUM(prob)*SUM(prob))*SQRT(n1*SUM(expected*expected) - SUM(expected)*SUM(expected))) ;
|
|
FROM results INTO ARRAY res
|
|
rho = CAST(res[1] As B(6))
|
|
SET SAFETY OFF
|
|
COPY TO benford.txt TYPE CSV
|
|
c = FILETOSTR("benford.txt")
|
|
*!* Replace commas with tabs
|
|
c = STRTRAN(c, COMMA, CTAB) + CRLF + "Correlation Coefficient: " + TRANSFORM(rho)
|
|
STRTOFILE(c, "benford.txt", 0)
|
|
SET SAFETY ON
|
|
|
|
FUNCTION Pr(d As Integer) As Double
|
|
RETURN LOG10(1 + 1/d)
|
|
ENDFUNC
|