Partition function P: Difference between revisions

Content added Content deleted
m (→‎version 3: standardized capitalization.)
Line 248: Line 248:
Took 131ms</pre>
Took 131ms</pre>


=={{header|Elixir}}==
Loosely based on the Erlang version.
<lang Elixir>
use Bitwise, skip_operators: true

defmodule Partition do
def init(), do:
:ets.new :pN, [:set, :named_table, :private]

def gpentagonals(), do: Stream.unfold {1, 0}, &next/1
defp next({m, n}) do
a = case rem m, 2 do
0 -> div m, 2
1 -> m
end
{n, {m + 1, n + a}}
end
def p(0), do: 1
def p(n) do
case :ets.lookup :pN, n do
[{^n, val}] -> val
[] ->
{val, _} = gpentagonals()
|> Stream.drop(1)
|> Stream.take_while(fn m -> m <= n end)
|> Stream.map(fn g -> p(n - g) end)
|> Enum.reduce({0, 0},
fn n, {a, sgn} -> {
a + (if sgn < 2, do: n, else: -n),
band(sgn + 1, 3)
}
end)
:ets.insert :pN, {n, val}
val
end
end
end

Partition.init
IO.puts Partition.p 6666
</lang>
{{Out}}
<pre>
193655306161707661080005073394486091998480950338405932486880600467114423441282418165863
</pre>
=={{header|Erlang}}==
=={{header|Erlang}}==
<lang Erlang>
<lang Erlang>
Line 295: Line 341:
sys 0m0.080s
sys 0m0.080s
</pre>
</pre>

=={{header|F_Sharp|F#}}==
=={{header|F_Sharp|F#}}==
An implementation of the formula in the task description. P(123456) is included for comparison with the largest value in the related task.
An implementation of the formula in the task description. P(123456) is included for comparison with the largest value in the related task.