88 lines
1.9 KiB
Text
88 lines
1.9 KiB
Text
Function GCD(n As Uinteger, d As Uinteger) As Uinteger
|
|
Return Iif(d = 0, n, GCD(d, n Mod d))
|
|
End Function
|
|
|
|
Function Totient(n As Integer) As Integer
|
|
Dim As Integer m, tot = 0
|
|
For m = 1 To n
|
|
If GCD(m, n) = 1 Then tot += 1
|
|
Next m
|
|
Return tot
|
|
End Function
|
|
|
|
Function isPowerful(m As Integer) As Boolean
|
|
Dim As Integer n = m, f = 2, q, l = Sqr(m)
|
|
|
|
If m <= 1 Then Return false
|
|
Do
|
|
q = n/f
|
|
If (n Mod f) = 0 Then
|
|
If (m Mod(f*f)) Then Return false
|
|
n = q
|
|
If f > n Then Exit Do
|
|
Else
|
|
f += 1
|
|
If f > l Then
|
|
If (m Mod (n*n)) Then Return false
|
|
Exit Do
|
|
End If
|
|
End If
|
|
Loop
|
|
Return true
|
|
End Function
|
|
|
|
Function isAchilles(n As Integer) As Boolean
|
|
If Not isPowerful(n) Then Return false
|
|
Dim As Integer m = 2, a = m*m
|
|
Do
|
|
Do
|
|
If a = n Then Return false
|
|
If a > n Then Exit Do
|
|
a *= m
|
|
Loop
|
|
m += 1
|
|
a = m*m
|
|
Loop Until a > n
|
|
Return true
|
|
End Function
|
|
|
|
Dim As Integer num, n, i
|
|
Dim As Single inicio
|
|
Dim As Double t0 = Timer
|
|
|
|
Print "First 50 Achilles numbers:"
|
|
num = 0
|
|
n = 1
|
|
Do
|
|
If isAchilles(n) Then
|
|
Print Using "#####"; n;
|
|
num += 1
|
|
If num >= 50 Then Exit Do
|
|
If (num Mod 10) Then Print Space(3); Else Print
|
|
End If
|
|
n += 1
|
|
Loop
|
|
|
|
Print !"\n\nFirst 20 strong Achilles numbers:"
|
|
num = 0
|
|
n = 1
|
|
Do
|
|
If isAchilles(n) And isAchilles(Totient(n)) Then
|
|
Print Using "#####"; n;
|
|
num += 1
|
|
If num >= 20 Then Exit Do
|
|
If (num Mod 10) Then Print Space(3); Else Print
|
|
End If
|
|
n += 1
|
|
Loop
|
|
|
|
Print !"\n\nNumber of Achilles numbers with:"
|
|
For i = 2 To 6
|
|
inicio = Fix(10.0 ^ (i-1))
|
|
num = 0
|
|
For n = inicio To inicio*10-1
|
|
If isAchilles(n) Then num += 1
|
|
Next n
|
|
Print i; " digits:"; num
|
|
Next i
|
|
Sleep
|