Totient function

This is an incredibly inefficient way of finding prime numbers.

use Prime::Factor;

my \πœ‘ = 0, |(1..*).hyper.map: -> \t { t * [*] t.&prime-factors.squish.map: { 1 - 1/$_ } }

printf "πœ‘(%2d) = %3d %s\n", $_, πœ‘[$_], $_ - πœ‘[$_] - 1Β ?? ''Β !! 'Prime' for 1 .. 25;

(1e2, 1e3, 1e4, 1e5).map: -> $limit {
    say "\nCount of primes <= $limit: " ~ +(^$limit).grep: {$_ == πœ‘[$_] + 1}
}

Output:

πœ‘( 1) =   1
πœ‘( 2) =   1 Prime
πœ‘( 3) =   2 Prime
πœ‘( 4) =   2
πœ‘( 5) =   4 Prime
πœ‘( 6) =   2
πœ‘( 7) =   6 Prime
πœ‘( 8) =   4
πœ‘( 9) =   6
πœ‘(10) =   4
πœ‘(11) =  10 Prime
πœ‘(12) =   4
πœ‘(13) =  12 Prime
πœ‘(14) =   6
πœ‘(15) =   8
πœ‘(16) =   8
πœ‘(17) =  16 Prime
πœ‘(18) =   6
πœ‘(19) =  18 Prime
πœ‘(20) =   8
πœ‘(21) =  12
πœ‘(22) =  10
πœ‘(23) =  22 Prime
πœ‘(24) =   8
πœ‘(25) =  20

Count of primes <= 100: 25

Count of primes <= 1000: 168

Count of primes <= 10000: 1229

Count of primes <= 100000: 9592

Last updated

Was this helpful?