*! getprime v1.0.1
*! 17 April 2014
*! Alfonso Sanchez-Penalver
*! Version history at the bottom
capture program drop getprime
program define getprime, rclass
version 10.1
syntax anything(name=num) [, Above PRint SCAlar(string)]
** Checks and Balances
* First check that the argument is an integer
capture confirm integer number `num'
if _rc {
di as error "number has to be an integer"
error 198
}
* Now check that isprime has the right version
cap isprimeversion
if _rc | "`r(version)'" < "01.00.00" {
di as err "Error: {cmd:getprime} works with {cmd:isprime} version " ///
"1.0.0 or later."
di `"To install or update it, type or click on {stata "ssc install isprime, replace"}. Then restart Stata."'
exit 601
}
** Finding the prime number
tempname p
scalar `p' = 2
* We set the step (increment) and the maximum (minimum) value for the loop.
* I choose 1000 as the range for the lookup, but it would very seldomly be
* above 10. Since the loop has the "continue, break" clause for when it
* finds the prime number, this guarantees that it would never get that far.
if "`above'" != "above" {
local step = -1
local end = `num' - 1000
}
else {
local step = 1
local end = `num' + 1000
}
forval i = `num'(`step')`end' {
isprime `i'
if `r(prime)' == 1 {
scalar `p' = `i'
continue, break
}
}
** Displaying the results
if "`print'" == "print" {
if "`above'" == "above" ///
di as text "The prime number closer to, but greater than, " as ///
result `num' as text " is " as result `p' as text "."
else ///
di as text "The prime number closer to, but less than, " as ///
result `num' as text " is " as result `p' as text "."
}
** Setting the scalar
if "`scalar'" != "" ///
scalar `scalar' = `p'
** Returning values
return scalar pnum = `p'
return scalar rnum = `num'
end
* 1.0.1 Allows abbreviation of above to a, added print and scalar options, and
* checks version of isprime.
* 1.0.0 Allowed getting prime number above and below, used the whole word above
* for option