Current section
Files
Jump to
Current section
Files
lib/Fraction.ex
defmodule Fraction do
require Integer
@moduledoc"""
A module to perform various operations on Fractions.
"""
defstruct [:numerator, :denominator]
@doc"""
Gives a fration structure to the given value.
## Examples
iex> Fraction.new(15)
%Fraction{denominator: 1, numerator: 15}
iex> Fraction.new(-3)
%Fraction{denominator: 1, numerator: -3}
"""
def new(x), do: %Fraction{numerator: x, denominator: 1}
@doc"""
Gives a fration structure to a value.
## Examples
iex> Fraction.new(15, 7)
%Fraction{denominator: 7, numerator: 15}
iex> Fraction.new(-3, 4)
%Fraction{denominator: 4, numerator: -3}
"""
def new(x, y), do: %Fraction{numerator: x, denominator: y}
@doc"""
Converts a mixed fraction to an improper fraction
## Examples
iex> Fraction.to_improper(5, 1, 2)
%Fraction{denominator: 2, numerator: 11}
"""
def to_improper(x,y,z), do: %Fraction{numerator: x * z + y, denominator: z}
@doc"""
Converts an improper fraction to a mixed fraction
## Examples
iex> Fraction.to_mixed(11, 2)
{5, %Fraction{denominator: 2, numerator: 1}}
"""
def to_mixed(x,y) do
cond do
x > y -> {div(x,y), %Fraction{numerator: rem(x,y), denominator: y}}
x < y -> new(x,y)
end
end
@doc"""
Returns the sum of two Fractions
## Examples
iex> Fraction.add([2,3],[1,2])
%Fraction{denominator: 6, numerator: 7}
"""
def add([a, b], [c, d]) do
x = Fraction.new(a, b);
y = Fraction.new(c, d);
Fraction.new((x.numerator * y.denominator) + (y.numerator * x.denominator), x.denominator * y.denominator)
end
@doc"""
Returns the difference of two Fractions
## Examples
iex> Fraction.sub([2,3],[1,2])
%Fraction{denominator: 6, numerator: 1}
"""
def sub([a, b], [c, d]) do
x = Fraction.new(a, b);
y = Fraction.new(c, d);
Fraction.new((x.numerator * y.denominator) - (y.numerator * x.denominator), x.denominator * y.denominator)
end
@doc"""
Returns the product of two Fractions
## Examples
iex> Fraction.mul([1,2], [3,4])
%Fraction{denominator: 8, numerator: 3}
"""
def mul([a, b], [c, d]) do
x = Fraction.new(a, b);
y = Fraction.new(c, d);
Fraction.new((x.numerator * y.numerator) , (x.denominator * y.denominator))
end
@doc"""
Returns the quotient of two Fractions
## Examples
iex> Fraction.fdiv([1,2], [3,4])
%Fraction{denominator: 6, numerator: 4}
"""
def fdiv([a, b], [c, d]) do
x = Fraction.new(a, b);
y = Fraction.new(c, d);
Fraction.new((x.numerator * y.denominator) , (x.denominator * y.numerator))
end
@doc"""
Returns the reciprocal of a Fraction
## Examples
iex> Fraction.reciprocal([3,4])
%Fraction{denominator: 3, numerator: 4}
"""
def reciprocal([a, b]) do
Fraction.new(b, a);
end
@doc"""
Returns the GCD(greatest common divisor) of two Fractions
## Examples
iex> Fraction.fgcd([3,4], [1,2])
%Fraction{denominator: 4, numerator: 1}
"""
def fgcd([a, b], [c, d]) do
x = Fraction.new(a, b);
y = Fraction.new(c, d);
Fraction.new(Integer.gcd(x.numerator , y.numerator) , Kernel.div((x.denominator * y.denominator), Integer.gcd(x.denominator, y.denominator)))
end
@doc"""
Returns the LCM(least common multiple) of two Fractions
## Examples
iex> Fraction.flcm([3,4], [1,2])
%Fraction{denominator: 2, numerator: 3}
"""
def flcm([a, b], [c, d]) do
x = Fraction.new(a, b);
y = Fraction.new(c, d);
Fraction.new( Kernel.div((x.numerator * y.numerator), Integer.gcd(x.numerator, y.numerator)), Integer.gcd(x.denominator , y.denominator))
end
@doc"""
Returns the decimal value of a given fraction
## Examples
iex> Fraction.frac_to_dec([7, 2])
3.5
"""
def frac_to_dec([a, b]) do
Fraction.new(a, b);
a / b
end
end