Search code examples
pythonalgorithmgreedy

Greedy algorithm odd behavior


I've implemented the Greedy algorithm to solve Egyptian fractions, however I'm getting some unexpected results. Here's my code

from math import ceil
from fractions import Fraction

def go(frac):
    ret = []
    while frac > 0:
        if frac.numerator == 1:
            ret.append(frac)
            break
        x = Fraction(1, ceil(frac.denominator / frac.numerator))
        frac -= x
        ret.append(x)
    return ret

input1 = int(raw_input('numerator: '))
input2 = int(raw_input('denominator: '))

print go(Fraction(input1, input2))

I constantly am getting the error "TypeError: both arguments should be Rational instances"

I've been logging and it crashes upon the first iteration of the while loop.

EDIT: the error in detail is:

File "egypt.py", line 19, in <module>
print go(Fraction(input1, input2))
File "egypt.py", line 10, in go
x = Fraction(1,ceil(frac.denominator / frac.numerator))
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/fractions.py", line 158, in __new__
raise TypeError("both arguments should be "
TypeError: both arguments should be Rational instances

Why is this? Thank you.


Solution

  • Try changing this:

    x = Fraction(1, ceil(frac.denominator / frac.numerator))
    

    to this:

    x = Fraction(1,int(ceil(frac.denominator / float(frac.numerator))))