diff options
| author | Luca Ferrari <fluca1978@gmail.com> | 2022-04-04 10:53:44 +0200 |
|---|---|---|
| committer | Luca Ferrari <fluca1978@gmail.com> | 2022-04-04 10:53:44 +0200 |
| commit | afb541c10466df9d9ca45c17f3056fd11a016e47 (patch) | |
| tree | da1e5f5fa220ed3812277e168785368278bd3a9f | |
| parent | 8409efbb8a1f588f4bb1d0e4134cdc03b6c6d7f8 (diff) | |
| download | perlweeklychallenge-club-afb541c10466df9d9ca45c17f3056fd11a016e47.tar.gz perlweeklychallenge-club-afb541c10466df9d9ca45c17f3056fd11a016e47.tar.bz2 perlweeklychallenge-club-afb541c10466df9d9ca45c17f3056fd11a016e47.zip | |
Task 2 plperl
| -rw-r--r-- | challenge-159/luca-ferrari/postgresql/ch-2.plperl | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/challenge-159/luca-ferrari/postgresql/ch-2.plperl b/challenge-159/luca-ferrari/postgresql/ch-2.plperl new file mode 100644 index 0000000000..8dce608e5a --- /dev/null +++ b/challenge-159/luca-ferrari/postgresql/ch-2.plperl @@ -0,0 +1,57 @@ +CREATE SCHEMA IF NOT EXISTS pwc159; + +/** +testdb=> select pwc159.mobius( 5 ); + mobius +-------- + -1 +(1 row) + +*/ +CREATE OR REPLACE FUNCTION +pwc159.mobius( int ) +RETURNS int +AS $CODE$ + + my ( $n ) = @_; + + # a routine to compute the prime + # factors of the given number + my $prime_factors = sub { + my ( $number ) = @_; + my %factors; + + my $factor = 2; + while ( $number > 1 && $factor <= $number ) { + if ( $number % $factor == 0 ) { + $factors{ $factor }++; + $number /= $factor; + } + else { + $factor++; + } + } + + return %factors; + }; + + + my %prime_factors = $prime_factors->( $n ); + + # to get the unique prime factors I have to "count" + # them only once per key + my @unique_prime_factors; + my $occurrencies_prime_factors = 0; + for ( keys %prime_factors ) { + push @unique_prime_factors, $_; + $occurrencies_prime_factors += $prime_factors{ $_ }; + } + + + return 0 if @unique_prime_factors != $occurrencies_prime_factors; + return 1 if @unique_prime_factors % 2 == 0; + return -1; + + +$CODE$ +LANGUAGE plperl; |
