98 lines
2.2 KiB
Text
98 lines
2.2 KiB
Text
#COMPILE EXE
|
|
#DIM ALL
|
|
#COMPILER PBCC 6
|
|
|
|
FUNCTION chowla(BYVAL n AS LONG) AS LONG
|
|
REGISTER i AS LONG, j AS LONG
|
|
LOCAL r AS LONG
|
|
i = 2
|
|
DO WHILE i * i <= n
|
|
j = n \ i
|
|
IF n MOD i = 0 THEN
|
|
r += i
|
|
IF i <> j THEN
|
|
r += j
|
|
END IF
|
|
END IF
|
|
INCR i
|
|
LOOP
|
|
FUNCTION = r
|
|
END FUNCTION
|
|
|
|
FUNCTION chowla1(BYVAL n AS QUAD) AS QUAD
|
|
LOCAL i, j, r AS QUAD
|
|
i = 2
|
|
DO WHILE i * i <= n
|
|
j = n \ i
|
|
IF n MOD i = 0 THEN
|
|
r += i
|
|
IF i <> j THEN
|
|
r += j
|
|
END IF
|
|
END IF
|
|
INCR i
|
|
LOOP
|
|
FUNCTION = r
|
|
END FUNCTION
|
|
|
|
SUB sieve(BYVAL limit AS LONG, BYREF c() AS INTEGER)
|
|
LOCAL i, j AS LONG
|
|
REDIM c(limit - 1)
|
|
i = 3
|
|
DO WHILE i * 3 < limit
|
|
IF NOT c(i) THEN
|
|
IF chowla(i) = 0 THEN
|
|
j = 3 * i
|
|
DO WHILE j < limit
|
|
c(j) = -1
|
|
j += 2 * i
|
|
LOOP
|
|
END IF
|
|
END IF
|
|
i += 2
|
|
LOOP
|
|
END SUB
|
|
|
|
FUNCTION PBMAIN () AS LONG
|
|
LOCAL i, count, limit, power AS LONG
|
|
LOCAL c() AS INTEGER
|
|
LOCAL s AS STRING
|
|
LOCAL s30 AS STRING * 30
|
|
LOCAL p, k, kk, r, ql AS QUAD
|
|
FOR i = 1 TO 37
|
|
s = "chowla(" & TRIM$(STR$(i)) & ") = " & TRIM$(STR$(chowla(i)))
|
|
CON.PRINT s
|
|
NEXT i
|
|
count = 1
|
|
limit = 10000000
|
|
power = 100
|
|
CALL sieve(limit, c())
|
|
FOR i = 3 TO limit - 1 STEP 2
|
|
IF ISFALSE c(i) THEN count += 1
|
|
IF i = power - 1 THEN
|
|
RSET s30 = FORMAT$(power, "#,##0")
|
|
s = "Count of primes up to " & s30 & " =" & STR$(count)
|
|
CON.PRINT s
|
|
power *= 10
|
|
END IF
|
|
NEXT i
|
|
|
|
ql = 2 ^ 61
|
|
k = 2: kk = 3
|
|
RESET count
|
|
DO
|
|
p = k * kk : IF p > ql THEN EXIT DO
|
|
IF chowla1(p) = p - 1 THEN
|
|
RSET s30 = FORMAT$(p, "#,##0")
|
|
s = s30 & " is a number that is perfect"
|
|
CON.PRINT s
|
|
count += 1
|
|
END IF
|
|
k = kk + 1 : kk += k
|
|
LOOP
|
|
s = "There are" & STR$(count) & " perfect numbers <= " & FORMAT$(ql, "#,##0")
|
|
CON.PRINT s
|
|
|
|
CON.PRINT "press any key to exit program"
|
|
CON.WAITKEY$
|
|
END FUNCTION
|