''' Created on Dec 14, 2011 @author: pablocelayes ''' def rational_to_contfrac(x,y): ''' Converts a rational x/y fraction into a list of partial quotients [a0, ..., an] ''' a = x//y pquotients = [a] while a * y != x: x,y = y,x-a*y a = x//y pquotients.append(a) return pquotients #TODO: efficient method that calculates convergents on-the-go, without doing partial quotients first def convergents_from_contfrac(frac): ''' computes the list of convergents using the list of partial quotients ''' convs = []; for i in range(len(frac)): convs.append(contfrac_to_rational(frac[0:i])) return convs def contfrac_to_rational (frac): '''Converts a finite continued fraction [a0, ..., an] to an x/y rational. ''' if len(frac) == 0: return (0,1) num = frac[-1] denom = 1 for _ in range(-2,-len(frac)-1,-1): num, denom = frac[_]*num+denom, num return (num,denom) def test1(): ''' Verify that the basic continued-fraction manipulation stuff works. ''' testnums = [(1, 1), (1, 2), (5, 15), (27, 73), (73, 27)] for r in testnums: (num, denom) = r print('rational number:') print(r) contfrac = rational_to_contfrac (num, denom) print('continued fraction:') print(contfrac) print('convergents:') print(convergents_from_contfrac(contfrac)) print('***********************************') if __name__ == "__main__": test1()