Factors of an integer: Difference between revisions
Content added Content deleted
mNo edit summary |
(→{{header|Elixir}}: add recursive version) |
||
Line 1,014: | Line 1,014: | ||
(for i <- 1..div(n,2), rem(n,i)==0, do: i) ++ [n] |
(for i <- 1..div(n,2), rem(n,i)==0, do: i) ++ [n] |
||
end |
end |
||
# Recursive (faster version); |
|||
def divisor(n), do: divisor(n, 1, []) |> Enum.sort |
|||
defp divisor(n, i, factors) when n < i*i , do: factors |
|||
defp divisor(n, i, factors) when n == i*i , do: [i | factors] |
|||
defp divisor(n, i, factors) when rem(n,i)==0, do: divisor(n, i+1, [i, div(n,i) | factors]) |
|||
defp divisor(n, i, factors) , do: divisor(n, i+1, factors) |
|||
end |
end |
||
Enum.each([45, 53, 64], fn n -> |
Enum.each([45, 53, 60, 64], fn n -> |
||
IO.puts "#{n}: #{inspect RC.factor(n)}" |
IO.puts "#{n}: #{inspect RC.factor(n)}" |
||
end) |
end) |
||
IO.puts "\nRange: #{inspect range = 1..10000}" |
|||
funs = [ factor: &RC.factor/1, |
|||
divisor: &RC.divisor/1 ] |
|||
Enum.each(funs, fn {name, fun} -> |
|||
{time, value} = :timer.tc(fn -> Enum.count(range, &length(fun.(&1))==2) end) |
|||
IO.puts "#{name}\t prime count : #{value},\t#{time/1000000} sec" |
|||
end) |
|||
</lang> |
|||
{{out}} |
{{out}} |
||
Line 1,024: | Line 1,041: | ||
45: [1, 3, 5, 9, 15, 45] |
45: [1, 3, 5, 9, 15, 45] |
||
53: [1, 53] |
53: [1, 53] |
||
60: [1, 2, 3, 4, 5, 6, 10, 12, 15, 20, 30, 60] |
|||
64: [1, 2, 4, 8, 16, 32, 64] |
64: [1, 2, 4, 8, 16, 32, 64] |
||
Range: 1..10000 |
|||
factor prime count : 1229, 7.316 sec |
|||
divisor prime count : 1229, 0.265 sec |
|||
</pre> |
</pre> |
||