Chowla numbers: Difference between revisions
Content added Content deleted
(→=={{header|PowerBASIC}}==: PowerBASIC added) |
(→=={{header|Visual Basic}}==: added Visual Basic example) |
||
Line 1,095: | Line 1,095: | ||
33,550,336 is a perfect number. |
33,550,336 is a perfect number. |
||
</pre> |
</pre> |
||
=={{header|Visual Basic}}== |
|||
{{works with|Visual Basic|6}} |
|||
{{trans|Visual Basic .NET}} |
|||
<lang vb>Option Explicit |
|||
Private Declare Function AllocConsole Lib "kernel32.dll" () As Long |
|||
Private Declare Function FreeConsole Lib "kernel32.dll" () As Long |
|||
Dim mStdOut As Scripting.TextStream |
|||
Function chowla(ByVal n As Long) As Long |
|||
Dim j As Long, i As Long |
|||
i = 2 |
|||
Do While i * i <= n |
|||
j = n \ i |
|||
If n Mod i = 0 Then |
|||
chowla = chowla + i |
|||
If i <> j Then |
|||
chowla = chowla + j |
|||
End If |
|||
End If |
|||
i = i + 1 |
|||
Loop |
|||
End Function |
|||
Function sieve(ByVal limit As Long) As Boolean() |
|||
Dim c() As Boolean |
|||
Dim i As Long |
|||
Dim j As Long |
|||
i = 3 |
|||
ReDim c(limit - 1) |
|||
Do While i * 3 < limit |
|||
If Not c(i) Then |
|||
If (chowla(i) = 0) Then |
|||
j = 3 * i |
|||
Do While j < limit |
|||
c(j) = True |
|||
j = j + 2 * i |
|||
Loop |
|||
End If |
|||
End If |
|||
i = i + 2 |
|||
Loop |
|||
sieve = c() |
|||
End Function |
|||
Sub Display(ByVal s As String) |
|||
Debug.Print s |
|||
mStdOut.Write s & vbNewLine |
|||
End Sub |
|||
Sub Main() |
|||
Dim i As Long |
|||
Dim count As Long |
|||
Dim limit As Long |
|||
Dim power As Long |
|||
Dim c() As Boolean |
|||
Dim p As Long |
|||
Dim k As Long |
|||
Dim kk As Long |
|||
Dim s As String * 30 |
|||
Dim mFSO As Scripting.FileSystemObject |
|||
Dim mStdIn As Scripting.TextStream |
|||
AllocConsole |
|||
Set mFSO = New Scripting.FileSystemObject |
|||
Set mStdIn = mFSO.GetStandardStream(StdIn) |
|||
Set mStdOut = mFSO.GetStandardStream(StdOut) |
|||
For i = 1 To 37 |
|||
Display "chowla(" & i & ")=" & chowla(i) |
|||
Next i |
|||
count = 1 |
|||
limit = 10000000 |
|||
power = 100 |
|||
c = sieve(limit) |
|||
For i = 3 To limit - 1 Step 2 |
|||
If Not c(i) Then |
|||
count = count + 1 |
|||
End If |
|||
If i = power - 1 Then |
|||
RSet s = FormatNumber(power, 0, vbUseDefault, vbUseDefault, True) |
|||
Display "Count of primes up to " & s & " = " & FormatNumber(count, 0, vbUseDefault, vbUseDefault, True) |
|||
power = power * 10 |
|||
End If |
|||
Next i |
|||
count = 0: limit = 35000000 |
|||
k = 2: kk = 3 |
|||
Do |
|||
p = k * kk |
|||
If p > limit Then |
|||
Exit Do |
|||
End If |
|||
If chowla(p) = p - 1 Then |
|||
RSet s = FormatNumber(p, 0, vbUseDefault, vbUseDefault, True) |
|||
Display s & " is a number that is perfect" |
|||
count = count + 1 |
|||
End If |
|||
k = kk + 1 |
|||
kk = kk + k |
|||
Loop |
|||
Display "There are " & CStr(count) & " perfect numbers <= 35.000.000" |
|||
mStdOut.Write "press enter to quit program." |
|||
mStdIn.Read 1 |
|||
FreeConsole |
|||
End Sub</lang> |
|||
{{out}} |
|||
<pre>chowla(1)=0 |
|||
chowla(2)=0 |
|||
chowla(3)=0 |
|||
chowla(4)=2 |
|||
chowla(5)=0 |
|||
chowla(6)=5 |
|||
chowla(7)=0 |
|||
chowla(8)=6 |
|||
chowla(9)=3 |
|||
chowla(10)=7 |
|||
chowla(11)=0 |
|||
chowla(12)=15 |
|||
chowla(13)=0 |
|||
chowla(14)=9 |
|||
chowla(15)=8 |
|||
chowla(16)=14 |
|||
chowla(17)=0 |
|||
chowla(18)=20 |
|||
chowla(19)=0 |
|||
chowla(20)=21 |
|||
chowla(21)=10 |
|||
chowla(22)=13 |
|||
chowla(23)=0 |
|||
chowla(24)=35 |
|||
chowla(25)=5 |
|||
chowla(26)=15 |
|||
chowla(27)=12 |
|||
chowla(28)=27 |
|||
chowla(29)=0 |
|||
chowla(30)=41 |
|||
chowla(31)=0 |
|||
chowla(32)=30 |
|||
chowla(33)=14 |
|||
chowla(34)=19 |
|||
chowla(35)=12 |
|||
chowla(36)=54 |
|||
chowla(37)=0 |
|||
Count of primes up to 100 = 25 |
|||
Count of primes up to 1.000 = 168 |
|||
Count of primes up to 10.000 = 1.229 |
|||
Count of primes up to 100.000 = 9.592 |
|||
Count of primes up to 1.000.000 = 78.498 |
|||
Count of primes up to 10.000.000 = 664.579 |
|||
6 is a number that is perfect |
|||
28 is a number that is perfect |
|||
496 is a number that is perfect |
|||
8.128 is a number that is perfect |
|||
33.550.336 is a number that is perfect |
|||
There are 5 perfect numbers <= 35.000.000 |
|||
press enter to quit program.</pre> |
|||
=={{header|Visual Basic .NET}}== |
=={{header|Visual Basic .NET}}== |