aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuca Ferrari <fluca1978@gmail.com>2021-12-20 16:13:46 +0100
committerLuca Ferrari <fluca1978@gmail.com>2021-12-20 16:13:46 +0100
commitcb6b797384f6e8891dc8f4c71685fcb7a1a4e8a6 (patch)
tree31f54c63e72f3647908f172e05e34d7147602a42
parent15594821cbb4b8929a5d13f40a8abd53408cfcbb (diff)
downloadperlweeklychallenge-club-cb6b797384f6e8891dc8f4c71685fcb7a1a4e8a6.tar.gz
perlweeklychallenge-club-cb6b797384f6e8891dc8f4c71685fcb7a1a4e8a6.tar.bz2
perlweeklychallenge-club-cb6b797384f6e8891dc8f4c71685fcb7a1a4e8a6.zip
Task 1 PostgreSQL done
-rw-r--r--challenge-144/luca-ferrari/postgresql/ch-1.sql71
1 files changed, 71 insertions, 0 deletions
diff --git a/challenge-144/luca-ferrari/postgresql/ch-1.sql b/challenge-144/luca-ferrari/postgresql/ch-1.sql
new file mode 100644
index 0000000000..c8d7264e7c
--- /dev/null
+++ b/challenge-144/luca-ferrari/postgresql/ch-1.sql
@@ -0,0 +1,71 @@
+/*
+ * Check if the current number is prime
+ */
+CREATE OR REPLACE FUNCTION f_is_prime( n int )
+RETURNS bool
+AS $CODE$
+DECLARE
+ divisor int;
+BEGIN
+ FOR divisor IN 2 .. ( n - 1 ) LOOP
+ IF mod( n, divisor ) = 0 THEN
+ RETURN false;
+ END IF;
+ END LOOP;
+
+ RETURN TRUE;
+END
+$CODE$
+LANGUAGE plpgsql;
+
+CREATE OR REPLACE FUNCTION f_semiprime_factors( n int )
+RETURNS SETOF int
+AS $CODE$
+DECLARE
+ current_number int;
+BEGIN
+ FOR current_number IN 1 .. n LOOP
+ IF f_is_prime( current_number ) AND mod( n, current_number ) = 0 AND f_is_prime( ( n / current_number ) ) THEN
+ RETURN NEXT current_number;
+ END IF;
+ END LOOP;
+
+ RETURN;
+END
+$CODE$
+LANGUAGE plpgsql;
+
+
+
+CREATE OR REPLACE FUNCTION f_is_semiprime( n int )
+RETURNS bool
+AS $CODE$
+ SELECT CASE count( * )
+ WHEN 0 THEN false
+ ELSE true
+ END
+ FROM f_semiprime_factors( n ) s;
+$CODE$
+LANGUAGE sql;
+
+
+
+CREATE OR REPLACE FUNCTION f_find_semiprimes( lim int default 100 )
+RETURNS SETOF int
+AS $CODE$
+DECLARE
+ n int;
+BEGIN
+ n := 1;
+
+ WHILE n < lim LOOP
+ IF f_is_semiprime( n ) THEN
+ RETURN NEXT n;
+ END IF;
+ n := n + 1;
+ END LOOP;
+
+ RETURN;
+END
+$CODE$
+LANGUAGE plpgsql;