Conditionally printing inside If[ ] produces NULLs?

I’m trying to write a bit of code to find pseudoprimes - numbers for which (2^n -2)/n are integers, but n is not prime. I know the first 3 pseudoprimes are 561, 645 and 1105. So I wrote this below, which produces an output on the screen similar to that shown, except I don’t see the “During evaluation of ..” My screen just shows the numbers in a vertical column. Anyway, the main problem is there’s all these Nulls, but I don’t know why.
I’m using Mathematica 7.0, so quite an old version

n[51]:= Table[
 If[IntegerQ[(2^n - 2)/n] == True && PrimeQ[n] == False, 
  Print[n]], {n, 550, 1200}]

During evaluation of In[51]:= 561

During evaluation of In[51]:= 645

During evaluation of In[51]:= 1105

Out[51]= {Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, \
Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, \
Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, \
Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, \
Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, \
Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, \
Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, \
Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, \
Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, \
Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, \
Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, \
Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, \
Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, \
Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, \
Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, \
Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, \
Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, \
Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, \
Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, \
Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, \
Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, \
Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, \
Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, \
Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, \
Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, \
Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, \
Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, \
Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, \
Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, \
Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, \
Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, \
Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, \
Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, \
Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, \
Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, \
Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, \
Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, \
Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, \
Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, \
Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, \
Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, \
Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, \
Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, \
Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, \
Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, \
Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, \
Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, \
Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, \
Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, \
Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, \
Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, \
Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, \
Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, \
Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, \
Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, \
Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, \
Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, \
Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, \
Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, Null, \
Null, Null, Null}

Try something like this:

Table[
 If[
  IntegerQ[(2^n - 2)/n] == True && PrimeQ[n] == False
  ,
  Print[n]; n
  ,
  Nothing
  ], {n, 550, 1200}]

Which prints and then returns:

{561, 645, 1105}

Remember, Print[] returns Null. Also, if you do not supply a third argument to If[], If[] will return nothing when the test expression is not True, so returning Nothing hides those Nulls.

Have a great weekend.

Mathematica allows a shorter syntax:

Cases[Range[550, 1200],
 n_ /; IntegerQ[(2^n - 2)/n] && CompositeQ[n]]

Unfortunately “Nothing” is not defined in my version of Mathematica, so the output contains a list of nothings.

Unfortunately, CompositeQ is not defined in my version of Mathematica, but I modified your code to be

n[58]:= Cases[Range[550, 1200], 
 n_ /; IntegerQ[(2^n - 2)/n] && PrimeQ[n] == False]

Out[58]= {561, 645, 1105}

I find that syntax much harder to read than what I had before though. I guess its just my lack of knowledge of the language

Range[550, 1200] // Select[IntegerQ[(2^# - 2)/#] && Not[PrimeQ[#]] &]
(* {561, 645, 1105} *)

Hi David,

Unlike many other languages, WL syntax maps to an underlying symbolic expression. It may be helpful to look at that expression to understand it better

(n_ /; IntegerQ[(2^n - 2)/n] && PrimeQ[n] == False) // FullForm
(n_ /; IntegerQ[(2^n - 2)/n] && PrimeQ[n] == False) // TreeForm

(IntegerQ[(2^# - 2)/#] && Not[PrimeQ[#]] &) // FullForm
(IntegerQ[(2^# - 2)/#] && Not[PrimeQ[#]] &) // TreeForm

Define functions (with good names) to encapsulate logic and simplify complex expressions

pseudoPrimeQ[n_] := IntegerQ[(2^n - 2)/n] && Not @ PrimeQ @ n

Cases[Range[550, 1200], n_ /; pseudoPrimeQ[n]]

Cases[Range[550, 1200], n_?pseudoPrimeQ]

Range[550, 1200] // Select[pseudoPrimeQ]

Thank you Rohit. Looking at the TreeForm and FreeForm is instructive.

Unfortuately

Range[550, 1200] // Select[IntegerQ[(2^# - 2)/#] && Not[PrimeQ[#]] &]

gives an error, about Select requiring 2 or 3 arguments, not 1.

It would seem that the operator version of Select[] is a newer feature. Try:

Select[Range[550, 1200], IntegerQ[(2^# - 2)/#] && Not[PrimeQ[#]] &]

David,

What version are you using? Operator form of Select (and many other functions) was added in V10. You can try the latest version for free (with some resource limitations) on the Wolfram Cloud.

Hi Mike,
I’m using version 7.0. That’s the latest that runs on Solaris, which is the OS I am using.

Select[Range[550, 1200], IntegerQ[(2^# - 2)/#] && Not[PrimeQ[#]] &]

works okay, and is just about readable! I’m not sure what the very last & does, but I will have to look at it.

The last & makes the expression (the second argument to Select) an anonymous pure function.

Check out: Work with Pure Functions—Wolfram Documentation