Function IsPrime(d As Double, Optional bFirstFactor As Boolean = False) As Variant
' Returns if d is
' ----------- ----------------------------------------------
' #VALUE! < 2
' "Too big!" > 1E+15
' #VALUE! <> Int(d)
' FALSE composite and bFirstFactor = False or omitted
' 1st factor composite and bFirstFactor = True
' TRUE prime
Dim dDiv As Double
Dim dRt As Long
If d < 2# Then
IsPrime = CVErr(xlErrValue)
Exit Function
ElseIf d = 2# Or d = 5# Then
IsPrime = True
Exit Function
ElseIf d > 1000000000000000# Then
IsPrime = "Too big!"
Exit Function
ElseIf Int(d) <> d Then
IsPrime = CVErr(xlErrValue)
Exit Function
End If
' can't use Mod with numbers bigger than Longs, so ...
Select Case Right(Format(d, "0"), 1)
Case "0", "2", "4", "6", "8"
IsPrime = IIf(bFirstFactor, 2, False)
Case "5"
IsPrime = IIf(bFirstFactor, 5, False)
Case Else
For dRt = 3 To Int(Sqr(d)) Step 2
dDiv = d / dRt
If Int(dDiv) = dDiv Then
IsPrime = IIf(bFirstFactor, dRt, False)
Exit Function
End If
Next dRt
IsPrime = True
End Select
End Function