예제 #1
0
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
예제 #2
0
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
예제 #3
0
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