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)</lang>
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>