Polynomial long division: Difference between revisions

Added Elixir
m (→‎{{header|Perl 6}}: for want of a Q the quote was lost)
(Added Elixir)
Line 686:
((2 . 1) (1 . -9) (0 . -27)) ; x^2 - 9x - 27
((0 . -123)) ; -123</lang>
 
=={{header|D}}==
<lang d>import std.stdio, std.range, std.algorithm, std.typecons, std.conv;
Line 856 ⟶ 857:
Quotient: (λx. x² - 9.0x - 27.0)
Remainder: (λx. -123.0)
 
=={{header|Elixir}}==
{{trans|Ruby}}
<lang elixir>defmodule Polynomial do
def division(_, []), do: raise ArgumentError, "denominator is zero"
def division(_, [0]), do: raise ArgumentError, "denominator is zero"
def division(f, g) when length(f) < length(g), do: {[0], f}
def division(f, g) do
{q, r} = division(g, [], f)
if q==[], do: q = [0]
if r==[], do: r = [0]
{q, r}
end
defp division(g, q, r) when length(r) < length(g), do: {q, r}
defp division(g, q, r) do
p = hd(r) / hd(g)
r2 = Enum.zip(r, g)
|> Enum.with_index
|> Enum.reduce(r, fn {{pn,pg},i},acc ->
List.replace_at(acc, i, pn - p * pg)
end)
division(g, q++[p], tl(r2))
end
end
 
[ { [1, -12, 0, -42], [1, -3] },
{ [1, -12, 0, -42], [1, 1, -3] },
{ [1, 3, 2], [1, 1] },
{ [1, -4, 6, 5, 3], [1, 2, 1] } ]
|> Enum.each(fn {f,g} ->
{q, r} = Polynomial.division(f, g)
IO.puts "#{inspect f} / #{inspect g} => #{inspect q} remainder #{inspect r}"
end)</lang>
 
{{out}}
<pre>
[1, -12, 0, -42] / [1, -3] => [1.0, -9.0, -27.0] remainder [-123.0]
[1, -12, 0, -42] / [1, 1, -3] => [1.0, -13.0] remainder [16.0, -81.0]
[1, 3, 2] / [1, 1] => [1.0, 2.0] remainder [0.0]
[1, -4, 6, 5, 3] / [1, 2, 1] => [1.0, -6.0, 17.0] remainder [-23.0, -14.0]
</pre>
 
=={{header|Fortran}}==
Line 959 ⟶ 1,002:
 
end program PolyDivTest</lang>
 
=={{header|Go}}==
By the convention and pseudocode given in the task:
Anonymous user