Quote:
|
THIS IS CODE FOR PRIME NO GENERATION IN ORACLE:
|
I thoght the code was too naive.
We know some more knowledge about prime numbers.
For example:
1) All prime numbers except two are odd numbers.
2) Prime numbers less than 10 are 2, 3, 5, 7 except 1.
3) To check wheather a number x is a prime number, it is enough to see MOD(x, y) <> 0 for all prime numbers y less than or equal to SQRT(x).
By considering those facts, number of iterations can be greatly reduced.
Here are some examples.
Example 1 ( Considering 2) and 3) ):
Code:
------------------------------ Commands Entered ------------------------------
WITH
prime_numbers(x, prime) AS(
VALUES (1, 'Y')
/**/
UNION ALL
/**/
SELECT x + 1
, CASE
WHEN EXISTS
(SELECT *
FROM (VALUES 2,3,5,7) Y(y)
WHERE y <= SQRT(x + 1)
AND MOD(x + 1, y) = 0
) THEN
'N'
ELSE 'Y'
END
FROM prime_numbers
WHERE x < 100
)
SELECT x
FROM prime_numbers
WHERE prime = 'Y'
;
Example 2 ( Considering 1), 2), and 3) ):
Code:
------------------------------ Commands Entered ------------------------------
WITH
pn_10(n) AS (
VALUES 2,3,5,7
)
,pn_100(n, prime) AS (
VALUES (9, 'N')
UNION ALL
SELECT n + 2
, CASE
WHEN EXISTS
(SELECT *
FROM pn_10 P(p)
WHERE p <= SQRT(n + 2)
AND MOD(n + 2, p) = 0
) THEN
'N'
ELSE 'Y'
END
FROM pn_100
WHERE n < 97
)
SELECT n AS "prime numbers less than 100"
FROM (VALUES 1
UNION ALL
SELECT n FROM pn_10
UNION ALL
SELECT n FROM pn_100
WHERE prime = 'Y'
) PN(n)
ORDER BY
n
;
Example 3(Extended Example 2 to prime numbers less than 10000:
Code:
------------------------------ Commands Entered ------------------------------
WITH
pn_10(n) AS (
VALUES 2,3,5,7
)
,pn_100(n, prime) AS (
VALUES (9, 'N')
UNION ALL
SELECT n + 2
, CASE
WHEN EXISTS
(SELECT *
FROM pn_10 P(p)
WHERE p <= SQRT(n + 2)
AND MOD(n + 2, p) = 0
) THEN
'N'
ELSE 'Y'
END
FROM pn_100
WHERE n < 97
)
,pn_10_100(n) AS (
SELECT n FROM pn_10
UNION ALL
SELECT n FROM pn_100
WHERE prime = 'Y'
)
,pn_10000(n, prime) AS (
VALUES (99, 'N')
UNION ALL
SELECT n + 2
, CASE
WHEN EXISTS
(SELECT *
FROM pn_10_100 P(p)
WHERE p <= SQRT(n + 2)
AND MOD(n + 2, p) = 0
) THEN
'N'
ELSE 'Y'
END
FROM pn_10000
WHERE n < 9997
)
-- SELECT n AS "prime numbers less than 10000"
SELECT COUNT(*) AS "prime numbers less than 10000"
FROM (VALUES 1
UNION ALL
SELECT n FROM pn_10_100
UNION ALL
SELECT n FROM pn_10000
WHERE prime = 'Y'
) PN(n)
ORDER BY
"prime numbers less than 10000"
;
------------------------------------------------------------------------------
prime numbers less than 10000
-----------------------------
1230
1 record(s) selected.