P32 - Determine the greatest common divisor of two positive integer

AUTHOR

Philip Potter

Specification

P32 (**) Determine the greatest common divisor of two positive integer
       numbers.  Use Euclid's algorithm.

Example

> say gcd(36,63);
    9
use v6;



# Example 1: iterative
#   we specify type constraints on our input parameters
sub gcdi (Int $a is copy, Int $b is copy) {
    while $a % $b {
        ($a,$b) = ($b, $a % $b);
    }
    return $b;
}

gcdi(36,63).say;

# Example 2: recursive
#   This can take advantage of a tail-call optimization, if the compiler
#   supports it
#   $a %% $b is true iff $b divides $a evenly. It is equivalent to:
#   !($a % $b)
sub gcdr (Int $a, Int $b) {
    return $b if $a %% $b;
    return gcdr($b, $a % $b);
}

gcdr(36,63).say;
gcdr(63,36).say;

# Example 3: series operator
#   The series operator generates series lazily. It takes some start terms, a
#   generation rule, and possibly a limit, and produces a series.
#   To create the Fibonacci series, we write:
#       (1, 1, *+* ... *)
#   The generation rule is to sum the previous two terms: *+*.
#   A limit of * continues the series forever.
#
#   We exploit this to generate the series of intermediate values in Euclid's
#   algorithm: each step in the series is the mod of the last two terms. When
#   we reach 0, the term before that was the gcd.
sub gcds (Int $a, Int $b) {
    return ($a, $b, *%* ... 0)[*-2];
}

gcds(8,12).say;
gcds(36,63).say;
gcds(63,36).say;

# 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.

P33-rhebus.pl

P33 - Determine whether two positive integer numbers are coprime.

P34-rhebus.pl

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

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.