aboutsummaryrefslogtreecommitdiff
path: root/lib/math
diff options
context:
space:
mode:
Diffstat (limited to 'lib/math')
-rw-r--r--lib/math/Calc.ex28
-rw-r--r--lib/math/rational.ex11
2 files changed, 30 insertions, 9 deletions
diff --git a/lib/math/Calc.ex b/lib/math/Calc.ex
new file mode 100644
index 0000000..7dc5fcc
--- /dev/null
+++ b/lib/math/Calc.ex
@@ -0,0 +1,28 @@
+defmodule ElixirMathParser.Math.Calc do
+ alias ElixirMathParser.Math.Rational
+ def factorial(n), do: factorial_rec(n, 1)
+ defp factorial_rec(n, acc) when n > 0, do: factorial_rec(n - 1, acc * n)
+ defp factorial_rec(0, acc), do: acc
+
+ def pow(value, exponent), do: pow_rec(value, exponent, Rational.new(1))
+
+ defp pow_rec(value, exponent, acc) when is_integer(exponent) do
+ case exponent do
+ 0 ->
+ acc
+
+ _ when exponent < 0 ->
+ pow_rec(Rational.new(1, value), -exponent, acc)
+
+ _ when Kernel.rem(exponent, 2) == 0 ->
+ pow_rec(Rational.mult(value, value), Kernel.div(exponent, 2), acc)
+
+ _ ->
+ pow_rec(
+ Rational.mult(value, value),
+ Kernel.div(exponent - 1, 2),
+ Rational.mult(acc, value)
+ )
+ end
+ end
+end
diff --git a/lib/math/rational.ex b/lib/math/rational.ex
index 3aba567..018f69b 100644
--- a/lib/math/rational.ex
+++ b/lib/math/rational.ex
@@ -405,11 +405,8 @@ defmodule ElixirMathParser.Math.Rational do
"""
def to_string(rational)
- def to_string(%Rational{numerator: numerator, denominator: denominator}) do
- "#{numerator}" <>
- if denominator != 1 do
- "/#{denominator}"
- end
+ def to_string(%Rational{numerator: num, denominator: den}) do
+ "#{num}" <> if den != 1, do: "/#{den}", else: ""
end
defimpl String.Chars, for: Rational do
@@ -440,11 +437,7 @@ defmodule ElixirMathParser.Math.Rational do
{denominator, numerator}
end
- # if denominator == 1 do
- # Kernel.div(numerator, gcdiv)
- # else
%Rational{numerator: Kernel.div(numerator, gcdiv), denominator: denominator}
- # end
end
# Calculates the Greatest Common denominator of two numbers.