Emirp primes: Difference between revisions
Content added Content deleted
(Added Common Lisp) |
|||
Line 588: | Line 588: | ||
10,000: 948349 |
10,000: 948349 |
||
</pre> |
</pre> |
||
=={{header|Common Lisp}}== |
|||
It uses a primitive prime function found in http://www.rosettacode.org/wiki/Primality_by_trial_division, not optimized at all. |
|||
<lang Lisp>(defun primep (n) |
|||
"Is N prime?" |
|||
(and (> n 1) |
|||
(or (= n 2) (oddp n)) |
|||
(loop for i from 3 to (isqrt n) by 2 |
|||
never (zerop (rem n i))))) |
|||
(defun reverse-digits (n) |
|||
(labels ((next (n v) |
|||
(if (zerop n) v |
|||
(multiple-value-bind (q r) |
|||
(truncate n 10) |
|||
(next q (+ (* v 10) r)))))) |
|||
(next n 0))) |
|||
(defun emirp (&key (count nil) (start 10) (end nil) (print-all nil)) |
|||
(do* ((n start (1+ n)) |
|||
(c count) ) |
|||
((or (and count (<= c 0)) (and end (>= n end)))) |
|||
(when (and (primep n) (not (= n (reverse-digits n))) (primep (reverse-digits n))) |
|||
(when print-all (format t "~a " n)) |
|||
(when count (decf c)) ))) |
|||
(progn |
|||
(format t "First 20 emirps: ") (emirp :count 20 :print-all t) |
|||
(format t "~%Emirps between 7700 and 8000: ") (emirp :start 7700 :end 8000 :print-all t) |
|||
(format t "~%The 10,000'th emirp: ") (emirp :count 10000 :print-all nil) ) |
|||
</lang> |
|||
{{out}} |
|||
<pre>First 20 emirps: 13 17 31 37 71 73 79 97 107 113 149 157 167 179 199 311 337 347 359 389 |
|||
Emirps between 7700 and 8000: 7717 7757 7817 7841 7867 7879 7901 7927 7949 7951 7963 |
|||
The 10,000'th emirp: 948349</pre> |
|||
=={{header|D}}== |
=={{header|D}}== |