Determine the smallest positive integer n ≥ 2 for which the respective arithmetic, geometric, and harmonic means of T(n) and S(n) are all integers, where T(n) is the
totient function and S(n) is the
sum of divisors function.
DefDbl A-Z
Dim crlf$
Dim fct(20, 1), sumfact, f, dvsr
Private Sub Form_Load()
ChDir "C:\Program Files (x86)\DevStudio\VB\projects\flooble"
Text1.Text = ""
crlf$ = Chr(13) + Chr(10)
Form1.Visible = True
DoEvents
For n = 2 To 999
f = factor(n)
sumfact = 0
dvsr = 1
addIn 1
p = phi(n)
If (sumfact + p) Mod 2 = 0 Then
sq = sumfact * p
sr = Int(Sqr(sq) + 0.5)
If sr * sr = sq Then
hm = 1 / (1 / sumfact + 1 / p)
hmround = Int(hm + 0.5)
If Abs(hm - hmround) < 0.00001 Then
Text1.Text = Text1.Text & Str(n) & Str(sumfact) & Str(p) & Str(hm) & crlf
End If
End If
End If
DoEvents
Next
Text1.Text = Text1.Text & "done"
End Sub
Function gcd(a, b)
x = a: y = b
Do
z = x Mod y
x = y: y = z
Loop Until z = 0
gcd = x
End Function
Function phi(n)
tot = 0
For i = 1 To n
If gcd(i, n) = 1 Then tot = tot + 1
Next
phi = tot
End Function
Function factor(num)
diffCt = 0: good = 1
n = Abs(num): If n > 0 Then limit = Sqr(n) Else limit = 0
If limit <> Int(limit) Then limit = Int(limit + 1)
dv = 2: GoSub DivideIt
dv = 3: GoSub DivideIt
dv = 5: GoSub DivideIt
dv = 7
Do Until dv > limit
GoSub DivideIt: dv = dv + 4 '11
GoSub DivideIt: dv = dv + 2 '13
GoSub DivideIt: dv = dv + 4 '17
GoSub DivideIt: dv = dv + 2 '19
GoSub DivideIt: dv = dv + 4 '23
GoSub DivideIt: dv = dv + 6 '29
GoSub DivideIt: dv = dv + 2 '31
GoSub DivideIt: dv = dv + 6 '37
If INKEY$ = Chr$(27) Then s$ = Chr$(27): Exit Function
Loop
If n > 1 Then diffCt = diffCt + 1: fct(diffCt, 0) = n: fct(diffCt, 1) = 1
factor = diffCt
Exit Function
DivideIt:
cnt = 0
Do
q = Int(n / dv)
If q * dv = n And n > 0 Then
n = q: cnt = cnt + 1: If n > 0 Then limit = Sqr(n) Else limit = 0
If limit <> Int(limit) Then limit = Int(limit + 1)
Else
Exit Do
End If
Loop
If cnt > 0 Then
diffCt = diffCt + 1
fct(diffCt, 0) = dv
fct(diffCt, 1) = cnt
End If
Return
End Function
Sub addIn(wh)
For i = 0 To fct(wh, 1)
pwr = Int(fct(wh, 0) ^ i + 0.5)
dvsr = dvsr * pwr
If wh = f Then
sumfact = sumfact + dvsr
Else
addIn wh + 1
End If
dvsr = dvsr / pwr
Next i
End Sub
finds
n S(n) T(n) harm mean
248 480 120 96
264 720 80 72
418 720 180 144
477 702 312 216
so the answer is 248.
|
Posted by Charlie
on 2014-07-07 13:27:19 |