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

Author: Philip Potter

Specification

P35 (**) Determine the prime factors of a given positive integer.
  Construct a flat list containing the prime factors in ascending order.

Example

> say ~prime_factors 315
3 3 5 7

Source code: P35-rhebus.pl

use v6;

sub prime_factors (Int $n) {
    my $residue = $n;
    my @values = (2,3,*+2 ... * > $n);
    gather for @values -> $k {
        while $residue %% $k {
            # try 'take 0+$k' to work around a known rakudo issue (2010-09-05)
            take $k;
            $residue /= $k;
        }
        last if $residue == 1;
        # This if block is an optimisation which reduces number of iterations
        # for numbers with large prime factors (such as large primes)
        # It can be removed without affecting correctness.
        if $k > sqrt $residue {
            take $residue;
            last;
        }
    }
}

say ~prime_factors($_) for 2..20;
say ~prime_factors(315);
say ~prime_factors(1723);