For reference, here is the v7 code behind NextPrime, which is hard to read before stripping all the private context names.
NextPrime[1]; (* preload the definition *)
Unprotect[NextPrime];
ClearAttributes[NextPrime, ReadProtected];
$Context = "NumberTheory`NextPrimeDump`";
FullDefinition[NextPrime]
Yields:
Attributes[NextPrime] = {Listable}
NextPrime[-3] := -2
NextPrime[-2] := 2
NextPrime[-1] := 2
NextPrime[0] := 2
NextPrime[1] := 2
NextPrime[n_Integer] := Block[{res}, res = integerNextPrime[n]; res /; IntegerQ[res]]
NextPrime[r_] /; NumericQ[r] && ! IntegerQ[r] :=
Block[{res, n},
n = Quiet[Block[{$MaxExtraPrecision =
Max[$MaxExtraPrecision, 1 + Ceiling[Log[10., Abs[N[r]]]]]}, Floor[r]]]; (res =
NextPrime[n]; res /; IntegerQ[res]) /; IntegerQ[n]]
NextPrime[n_, k_Integer] /; NumericQ[n] && Positive[k] :=
Block[{res}, res = Nest[NextPrime, n, k]; res /; IntegerQ[res]]
NextPrime[n_, k_Integer] /; NumericQ[n] && Negative[k] :=
Block[{res}, res = Nest[PreviousPrime, n, -k]; res /; IntegerQ[res]]
NextPrime[n_?PrimeQ, 0] := n
NextPrime[n_, 0] := NextPrime[n]
NextPrime[n___] := (ArgumentCountQ[NextPrime, Length[{n}], 1, 2]; Null /; False)
integerNextPrime[n_Integer] :=
Block[{res}, res = n + 1 + Mod[n, 2]; While[! PrimeQ[res], res += 2];
res /; IntegerQ[res]]
integerNextPrime[___] := $Failed
PreviousPrime[n_] := Block[{res}, res = -NextPrime[-n]; res /; IntegerQ[res]]
PreviousPrime[___] := $Failed
NextPrimeIS actually implemented in Mathematica. TryTrace[NextPrime[6]]. The core of it is quite similar to what I posted – Rojo Jan 18 at 4:48