DATA Step, Macro, Functions and more

How to pick prime,even and odd numbers using datasteps and do loops?

Reply
Frequent Contributor
Posts: 81

How to pick prime,even and odd numbers using datasteps and do loops?

How to pick prime,even and odd numbers using datasteps and do loops? Atleast 0 to 50?

Super User
Posts: 9,563

Re: How to pick prime,even and odd numbers using datasteps and do loops?

Posted in reply to rajeshalwayswel

For odd/even use the mod() function.

For prime numbers I'd use an array and do something like

array primes{50} 1;
do i1 = 2 to 50;
  if primes{i1}
  then do;
    i2 = 2 * i1;
    do while (i2 lt 50);
      primes{i2} = 0;
      i2 + i1;
    end;
  end;
end;

After that, all elements where the index is a prime number contain a 1.

You can replace all 50's with a macro variable to make the code flexible.

---------------------------------------------------------------------------------------------
Maxims of Maximally Efficient SAS Programmers
How to convert datasets to data steps
How to post code
Frequent Contributor
Posts: 81

Re: How to pick prime,even and odd numbers using datasteps and do loops?

Posted in reply to KurtBremser
When I exceute the code we have missing values in the dataset..array primes{50} 1; when we using 1 in this place I'm getting error...Is any thing need to change in it..

PROC Star
Posts: 2,225

Re: How to pick prime,even and odd numbers using datasteps and do loops?

[ Edited ]
Posted in reply to rajeshalwayswel

A working version of the program from @KurtBremser.

 

       
data _null_;
  array PRIMES{1:50} (50*1);
  do I1 = 2 to 50;              
    if PRIMES{I1} then do;
      I2 = 2 * I1;              
      do while (I2 lt 50);
        PRIMES{I2} = 0;        putlog I1= I2= PRIMES[I2]=;
        I2 + I1;
      end;
    end;
  end;
run;

which is a slightly more efficient version of 


data _null_;
  array PRIMES{1:50} (50*1);
  do I1 = 2 to 50;              
    do I2 = I1 to 50/I1;              
      PRIMES{I1*I2} = 0;        putlog I1= I2= PRIMES[I1*I2]=;
    end;
  end;
run;

I added the intermediate values in the log for you to see the logic.

Note that Kurt's loops need to be tweaked at bit as they flag 50 as a prime.

 

 

 

 

Super User
Posts: 9,563

Re: How to pick prime,even and odd numbers using datasteps and do loops?

my initial code was written without access to SAS from @home, therefore the "something like". It was meant to show the basic algorithm for creating Eratosthenes's sieve.

A working version (syntactically and semantically, thanks to @ChrisNZ):

data primes (keep=primenumber);
array primes{50} 3 _temporary_ (50*1);
do i1 = 2 to 50;
  if primes{i1}
  then do;
    i2 = 2 * i1;
    do while (i2 le 50);
      primes{i2} = 0;
      i2 + i1;
    end;
  end;
end;
do primenumber = 1 to 50;
  if primes{primenumber} then output;
end;
run;
---------------------------------------------------------------------------------------------
Maxims of Maximally Efficient SAS Programmers
How to convert datasets to data steps
How to post code
Super User
Posts: 10,611

Re: How to pick prime,even and odd numbers using datasteps and do loops?

Posted in reply to rajeshalwayswel

Calling @Rick_SAS

 

Here is an example.

https://blogs.sas.com/content/iml/2010/09/17/a-prime-number-sieve.html

 

and use MOD() to get odd or even number.

 

Ask a Question
Discussion stats
  • 5 replies
  • 474 views
  • 0 likes
  • 4 in conversation