def obter_alpha(intervalo, grau, coeficientes, limite=20, erro_passado=10 ** -16):

    a = intervalo[0]
    b = intervalo[1]
    erro = erro_passado * 10.0
    contador = 0
    xm = 0.0

    fa = horner.obter_resto(grau, coeficientes, a)
    fb = horner.obter_resto(grau, coeficientes, b)
    aux = fa

    if (fa * fb) < 0:

        while contador < limite:
            contador += 1

            tmp = fa * (b - a)
            aux = fb - fa

            xm = (a) - (tmp / aux)
            fm = horner.obter_resto(grau, coeficientes, xm)

            if fm == 0:
                return xm, 0.0

            if (fm * fa) < 0.0:
                b = xm
                fb = fm
                if fm * aux > 0:
                    fa = fa / 2.0
            else:
                a = xm
                fa = fm
                if fm * aux > 0:
                    fb = fb / 2.0

            aux = fm
            erro = math.fabs(b - a)

            if erro < erro_passado:
                return xm, erro

            print "Iteracao ", contador, " alpha = ", xm

        return xm, erro

    else:

        if intervalo[0] > 0:
            intervalo[0] -= 0.5
        else:
            intervalo[0] += 0.5

        return obter_alpha(intervalo, grau, coeficientes, limite, erro_passado)
import horner
import divisao
import multiplicidade
import localizacao_raizes
import newton_polinomial
import newton_kinkeid_pol

grau = 4
coeficientes = [2.0, 0.0, 0.0, 3.0, -2.0]
coeficientes_multi = [1.0, -1.0, -5.0, 1.0, 8.0, 0.0]
coeficientes_loc = [2.0, 0.0, 0.0, 0.0, -8.0, 3.0]
coeficientes_newton = [2.0, 0.0, 0.0, 3.0, -5.0]
x = 2.0

print 'Testando solver uma polinomial simples usando horner'
print horner.obter_resto(grau, coeficientes, x); print ''

print 'Testando solver uma polinomial simples e obter derivadas usando divisao'
print divisao.obter_resto(grau, coeficientes, x); print ''

print 'Testando obter multiplicidade de uma raiz'
print multiplicidade.verifica_multiplicidade(5, coeficientes_multi, -1.0); print ''

print 'Testando obter localizacao das raizes'
print localizacao_raizes.obter_localizacao_raizes(5, coeficientes_loc); print ''

print 'Testando obter localizacao refinada das raizes bom Beta = 0'
print localizacao_raizes.obter_localizacao_ref_raizes(5, coeficientes_loc); print ''

print 'Testando obter pn(x) = 0 com newton geral polinomial'
print newton_polinomial.obter_alpha(4, coeficientes_newton)