Semiprime: Difference between revisions

→‎{{header|REXX}}: added version 2. -- ~~~~
(→‎{{header|Perl 6}}: show test numbers and line up test cases)
(→‎{{header|REXX}}: added version 2. -- ~~~~)
Line 108:
 
=={{header|REXX}}==
===version 1===
<lang rexx>/* REXX ---------------------------------------------------------------
* 20.02.2014 Walter Pachl relying on prime decomposition
Line 162 ⟶ 163:
12 is NOT semiprime 2 2 3
1679 is semiprime 23 73</pre>
 
===version 2===
<lang rexx>/*REXX program determines if any number is semiprime (or not). */
parse arg n . /*obtain number from the C.L. */
if length(n)>digits() then numeric digits length(n) /*enough digits ? */
if isSemiPrime(n) then say n ' is semiprime.'
else say n " isn't semiprime."
exit /*stick a fork in it, we're done.*/
/*──────────────────────────────────ISPRIME subroutine──────────────────*/
isprime: procedure; parse arg x; if x<2 then return 0
if wordpos(x,'2 3 5 7')\==0 then return 1;
do i=2 for 2; if x//i==0 then return 0; end /*i*/
do j=5 by 6 until j*j>x; if x//j==0 then return 0
if x//(j+2)==0 then return 0
end /*j*/
return 1
/*──────────────────────────────────ISSEMIPRIME subroutine──────────────*/
issemiprime: procedure; arg x; if \datatype(x,'W') | x<4 then return 0
x=x/1
do i=2 to 3; if x//i==0 then if isprime(x%i) then return 1
else return 0
end /*i*/
do j=5 by 6; if j*j>x then return 0
do k=j by 2 for 2; if x//k==0 then if isprime(x%k) then return 1
else return 0
end /*k*/
end /*j*/</lang>
 
=={{header|Ruby}}==