def fundamental_solution(N): context = Context(prec=1000) val = Decimal(context.sqrt(N)) rep = [floor(val)] val = Decimal( context.divide(1, (context.subtract(val, Decimal(floor(val)))))) rep.append(floor(val)) ctr = 1 h_base = [0, 1] k_base = [1, 0] h_1 = rep[0] * h_base[-1] + h_base[-2] k_1 = rep[0] * k_base[-1] + k_base[-2] if check_sol(h_1, k_1, N): return h_1, k_1 h_2 = rep[1] * h_1 + h_base[-1] k_2 = rep[1] * k_1 + k_base[-1] if check_sol(h_2, k_2, N): return h_2, k_2 H = [h_1, h_2] K = [k_1, k_2] h = h_2 k = k_2 ind = 3 frac = Fraction(int(h), int(k)) while not (check_sol(frac.numerator, frac.denominator, N)): val = Decimal( context.divide(1, (context.subtract(val, Decimal(floor(val)))))) rep.append(floor(val)) #val = rep[ind-1] h = long(long(floor(val)) * H[-1] + H[-2]) k = long(long(floor(val)) * K[-1] + K[-2]) frac = Fraction(long(h), long(k)) H.append(frac.numerator) K.append(frac.denominator) ind += 1 return h, k
def cont_frac(N): context = Context(prec=1000) val = Decimal(context.sqrt(N)) rep = [floor(val)] ctr = 1 while ctr <= 1000: val = Decimal( context.divide(1, (context.subtract(val, Decimal(floor(val)))))) rep.append(floor(val)) ctr += 1 return rep
def cont_frac(N): context = Context(prec=1000) val = Decimal(context.sqrt(N)) init_val = floor(val) rep = [init_val] ctr = 1 while floor(val) != 2 * init_val: val = Decimal( context.divide(1, (context.subtract(val, Decimal(floor(val)))))) rep.append(floor(val)) ctr += 1 return rep