P34 - Calculate Euler's totient function phi(m).

AUTHOR

Philip Potter

Find out what the value of phi(m) is if m is a prime number. Euler's totient function plays an important role in one of the most widely used public key cryptography methods (RSA). In this exercise you should use the most primitive method to calculate this function (there are smarter ways that we shall discuss later).

Specification

P34 (**) Calculate Euler's totient function phi(m).
          Euler's so-called totient function phi(m) is defined as the number of
          positive integers r (1 <= r < m) that are coprime to m.

Example

# m = 10: r = 1,3,7,9; thus phi(m) = 4. Note the special case: phi(1) = 1.
    > say totient_phi 10
    4
use v6;



# from P32-rhebus.pl
sub gcds (Int $a, Int $b) {
    return ($a, $b, *%* ... 0)[*-2];
}

# from P33-rhebus.pl
our sub infix:<coprime> (Int $a, Int $b) { (gcds($a,$b) == 1).Numeric }


# Example 1: iteration
multi totient_phi_i (1      --> Int) { 1 }
multi totient_phi_i (Int $n --> Int) {
    my $total = 0;
    for 1..^$n -> $k { $total++ if $n coprime $k }
    return $total;
}

say "phi($_): ", totient_phi_i $_ for (1..20);

# Example 2: Ā«coprimeĀ« hyper operator
multi totient_phi (1      --> Int) { 1 }
multi totient_phi (Int $n --> Int) {
    return 1 if $n ~~ 1;
    return [+] ($n Ā«coprimeĀ« list(1..^$n));
}

say "phi($_): ",totient_phi $_ for (1..20);

# vim: expandtab shiftwidth=4 ft=perl6

See Also

P01-scottp.pl

P01 - Find the last box of a list.

P01-topo.pl

P01 - Find the last element of a list.

P02-scottp.pl

P02 - Find the last but one box of a list.

P02-topo.pl

P02 - Find the last two elements of a list.

P03-scottp.pl

P03 - Find the K'th element of a list.

P03-topo.pl

P03 - Find the kth element of a list.

P04-scottp.pl

P04 - Find the number of elements of a list

P04-topo.pl

P04 - Find the number of elements in a list.

P05-scottp.pl

P05 - Reverse a list

P05-topo.pl

P05 - Reverse a list.

P06-ajs.pl

P06 - Find out whether a list is a palindrome.

P06-scottp.pl

P06 - Find out whether a list is a palindrome.

P06-topo.pl

P06 - Find out whether a list is a palindrome.

P07-eric256.pl

P07 - Flatten a nested array structure.

P07-topo.pl

P07 - Flatten a nested array structure.

P07-viklund.pl

P07 - Flatten a nested array structure.

P08-eric256.pl

P08 - Eliminate consecutive duplicates of list elements.

P08-topo.pl

P08 - Eliminate consecutive duplicates of list elements.

P08-viklund.pl

P08 - Eliminate consecutive duplicates of list elements.

P09-rje.pl

P09 - Pack consecutive duplicates of list elements into sublists.

P09-scottp.pl

P09 - Pack consecutive duplicates of list elements into sublists.

P09-topo.pl

P09 - Pack consecutive duplicate elements of a list into sublists.

P09-unobe.pl

P09 - Pack consecutive duplicates of list elements into sublists.

P10-scottp.pl

P10 - Run-length encoding of a list.

P10-topo.pl

P10 - Run-length encoding of a list.

P10-unobe.pl

P10 - Run-length encoding of a list.

P11-topo.pl

P11 - Modified run-length encoding.

P11-unobe.pl

P11 - Modified run-length encoding.

P12-rhebus.pl

P12 - Decode a run-length encoded list.

P12-topo.pl

P12 - Decode modified run-length encoding.

P12-unobe.pl

P12 - Decode a run-length encoded list.

P13-rhebus.pl

P13 - Run-length encoding of a list (direct solution).

P13-topo.pl

P13 - Direct run-length encoding.

P13-viklund.pl

P13 - Run-length encoding of a list (direct solution).

P14-scottp.pl

P14 - Duplicate the elements of a list.

P14-topo.pl

P14 - Duplicate the elements in a list.

P14-viklund.pl

P14 - Duplicate the elements of a list.

P15-rhebus.pl

P15 - Replicate the elements of a list a given number of times.

P15-topo.pl

P15 - Replicate the elements of a list a given number of times.

P15-unobe.pl

P15 - Replicate the elements of a list a given number of times.

P16-edpratomo.pl

P16 (**) Drop every N'th element from a list.

P16-topo.pl

P16 - Drop every nth element from a list.

P17-topo.pl

P17 - Split a list into two parts; the length of the first part is given.

P17-unobe.pl

P17 - Split a list into two parts; the length of the first part is given.

P18-topo.pl

P18 - Extract a slice from a list. Indices start at 1.

P19-topo.pl

P19 - Rotate a list n places to the left.

P20-rhebus.pl

P20 - Remove the K'th element from a list.

P20-topo.pl

P20 - Remove the kth element of a list.

P21-scottp.pl

P21 - Insert an element at a given position into an array.

P21-topo.pl

P21 - Insert an element at a given position into a list.

P22-scottp.pl

P22 - Create a list containing all integers within a given range.

P22-topo.pl

P22 - Create a list containing all integers within a given range.

P23-topo.pl

P23 - Extract a given number of randomly selected elements from a list.

P24-topo.pl

P24 - Draw N different random numbers from the set 1..M.

P25-topo.pl

P25 - Generate a random permutation of the elements of a list.

P26-topo.pl

P26 - Generate the combinations of k distinct objects chosen from the n elements of a list.

P31-rhebus.pl

P31 - Determine whether a given integer number is prime.

P32-rhebus.pl

P32 - Determine the greatest common divisor of two positive integer

P33-rhebus.pl

P33 - Determine whether two positive integer numbers are coprime.

P35-rhebus.pl

P35 - Determine the prime factors of a given positive integer.

P36-ovid.pl

P36 - Determine the prime factors of a given positive integer (2).

P36-rhebus.pl

P36 - Determine the prime factors of a given positive integer (2).

P37-rhebus.pl

P37 - Calculate Euler's totient function phi(m) (improved).

P39-rhebus.pl

P39 - A list of prime numbers.

P40-rhebus.pl

P40 - Goldbach's conjecture.

P41-rhebus.pl

P41 - A list of Goldbach compositions.

P91-edpratomo.pl

P91 - Knight's tour.

README.md

The Camelia image is copyright 2009 by Larry Wall. "Raku" is trademark of the Yet Another Society. All rights reserved.