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

99-problems.pod

P01-scottp.raku

P01 - Find the last box of a list.

P01-topo.raku

P01 - Find the last element of a list.

P02-scottp.raku

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

P02-topo.raku

P02 - Find the last two elements of a list.

P03-scottp.raku

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

P03-topo.raku

P03 - Find the kth element of a list.

P04-scottp.raku

P04 - Find the number of elements of a list

P04-topo.raku

P04 - Find the number of elements in a list.

P05-scottp.raku

P05 - Reverse a list

P05-topo.raku

P05 - Reverse a list.

P06-ajs.raku

P06 - Find out whether a list is a palindrome.

P06-scottp.raku

P06 - Find out whether a list is a palindrome.

P06-sdondley.raku

P06 - Find out whether a list is a palindrome.

P06-topo.raku

P06 - Find out whether a list is a palindrome.

P07-eric256.raku

P07 - Flatten a nested array structure.

P07-topo.raku

P07 - Flatten a nested array structure.

P07-viklund.raku

P07 - Flatten a nested array structure.

P08-eric256.raku

P08 - Eliminate consecutive duplicates of list elements.

P08-topo.raku

P08 - Eliminate consecutive duplicates of list elements.

P08-viklund.raku

P08 - Eliminate consecutive duplicates of list elements.

P09-rje.raku

P09 - Pack consecutive duplicates of list elements into sublists.

P09-scottp.raku

P09 - Pack consecutive duplicates of list elements into sublists.

P09-topo.raku

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

P09-unobe.raku

P09 - Pack consecutive duplicates of list elements into sublists.

P10-scottp.raku

P10 - Run-length encoding of a list.

P10-topo.raku

P10 - Run-length encoding of a list.

P10-unobe.raku

P10 - Run-length encoding of a list.

P11-topo.raku

P11 - Modified run-length encoding.

P11-unobe.raku

P11 - Modified run-length encoding.

P12-rhebus.raku

P12 - Decode a run-length encoded list.

P12-topo.raku

P12 - Decode modified run-length encoding.

P12-unobe.raku

P12 - Decode a run-length encoded list.

P13-rhebus.raku

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

P13-topo.raku

P13 - Direct run-length encoding.

P13-viklund.raku

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

P14-scottp.raku

P14 - Duplicate the elements of a list.

P14-topo.raku

P14 - Duplicate the elements in a list.

P14-viklund.raku

P14 - Duplicate the elements of a list.

P15-rhebus.raku

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

P15-topo.raku

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

P15-unobe.raku

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

P16-edpratomo.raku

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

P16-topo.raku

P16 - Drop every nth element from a list.

P17-sdondley.raku

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

P17-topo.raku

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

P17-unobe.raku

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

P18-topo.raku

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

P19-topo.raku

P19 - Rotate a list n places to the left.

P20-rhebus.raku

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

P20-topo.raku

P20 - Remove the kth element of a list.

P21-scottp.raku

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

P21-topo.raku

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

P22-scottp.raku

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

P22-topo.raku

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

P23-topo.raku

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

P24-topo.raku

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

P25-topo.raku

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

P26-topo.raku

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

P31-rhebus.raku

P31 - Determine whether a given integer number is prime.

P32-rhebus.raku

P32 - Determine the greatest common divisor of two positive integer

P33-rhebus.raku

P33 - Determine whether two positive integer numbers are coprime.

P35-rhebus.raku

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

P36-ovid.raku

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

P36-rhebus.raku

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

P37-rhebus.raku

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

P39-rhebus.raku

P39 - A list of prime numbers.

P40-rhebus.raku

P40 - Goldbach's conjecture.

P41-rhebus.raku

P41 - A list of Goldbach compositions.

P91-edpratomo.raku

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.

Built with Podlite — the markup and publishing tools behind this site.