aboutsummaryrefslogtreecommitdiff
path: root/challenge-159/luca-ferrari/postgresql/ch-2.plperl
blob: 8dce608e5a3bc67c60253abca402ed63664dbd66 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
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;