Message Boards Message Boards

0
|
4504 Views
|
11 Replies
|
4 Total Likes
View groups...
Share
Share this post:

Conditionally printing inside If[ ] produces NULLs?

Posted 3 years ago

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}
POSTED BY: David Kirkby
11 Replies
Posted 3 years ago

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

Check out: https://reference.wolfram.com/language/howto/WorkWithPureFunctions.html

POSTED BY: Mike Besso
Posted 3 years ago

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.

POSTED BY: David Kirkby
Posted 3 years ago

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

Select[Range[550, 1200], IntegerQ[(2^# - 2)/#] && Not[PrimeQ[#]] &]
POSTED BY: Mike Besso
Posted 3 years ago
Range[550, 1200] // Select[IntegerQ[(2^# - 2)/#] && Not[PrimeQ[#]] &]
(* {561, 645, 1105} *)
POSTED BY: Rohit Namjoshi
Posted 3 years ago

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.

POSTED BY: David Kirkby
Posted 3 years ago

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.

POSTED BY: Rohit Namjoshi

Mathematica allows a shorter syntax:

Cases[Range[550, 1200],
 n_ /; IntegerQ[(2^n - 2)/n] && CompositeQ[n]]
POSTED BY: Gianluca Gorni
Posted 3 years ago

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

POSTED BY: David Kirkby
Posted 3 years ago

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]
POSTED BY: Rohit Namjoshi
Posted 3 years ago

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.

POSTED BY: Mike Besso
Posted 3 years ago

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

POSTED BY: David Kirkby
Reply to this discussion
Community posts can be styled and formatted using the Markdown syntax.
Reply Preview
Attachments
Remove
or Discard

Group Abstract Group Abstract