Você está na página 1de 18

Races de una ecuacin

El mtodo de las aproximaciones sucesivas

El mtodo mitad

Races de un polinomio. Mtodo de Graeffe

En estas pginas estudiaremos los procedimientos numricos para hallar las races de
una ecuacin trascendente, y para hallar las races de un polinomio. El clculo de las
races de un polinomio puede efectuarse con los mismos procedimientos que para una
ecuacin en general, sin embargo, aprovechando las propiedades de dichas races se
elaboran mtodos especficos para este tipo de ecuaciones. Entre estos ltimos, hemos
de destacar el mtodo de Graeffe muy apropiado para ser codificado y usado en los
ordenadores.

En las primeras pginas, describiremos dos procedimientos para obtener las races de
una ecuacin trascendente: el mtodo de las aproximaciones sucesivas y el
procedimiento del punto medio. Existen otros procedimientos como el grfico, de las
partes proporcionales, el mtodo de las tangentes o mtodo de Newton. Cada
procedimiento tiene, sin duda, sus ventajas e inconvenientes, e incluso se pueden
combinar varios procedimientos a la vez.

El procedimiento grfico consiste en representar la funcin en un intervalo dado y


observar cuantas veces cruza el eje X en dicho intervalo. Si el eje X est
convenientemente etiquetado y la resolucin es suficiente, este procedimiento nos da
una primera aproximacin a las races de la ecuacin.

Mtodo de las aproximaciones sucesivas

Mtodo mitad

Races simples

Races mltiples

El pozo de potencial

Los procedimientos iterativos son muy importantes en el clculo numrico, y consisten


en repetir la misma rutina una y otra vez hasta que se cumpla una determinada
condicin de terminacin del proceso de iteracin. Estos procedimientos son muy
fciles de codificar y se prestan especialmente para ser usados en los ordenadores.
Para hallar las races de una funcin trascendente, crearemos una clase base abstracta
con una funcin miembro que describe el procedimiento numrico, y una clase derivada
que definir la funcin cuyas races deseamos calcular en un intervalo dado. Para
calcular las races, crearemos un objeto de la clase derivada y llamaremos desde ste al
procedimiento numrico, pasndole el principio y final de dicho intervalo.

El mtodo de Graeffe

En muchos campos de las matemticas, es necesario hallar las races de un polinomio,


por ejemplo, al hallar la integral de una funcin racional, en la transformada de Laplace,
etc. Existen frmulas exactas si el polinomio tiene un grado igual o inferior a cuatro.
Excepto para los polinomios de primer y segundo grado, las frmulas son complicadas,
por lo que se emplean procesos de aproximacin numrica. Entre los numerosos
mtodos que existen el ms conocido es quiz el mtodo de Newton. Sin embargo,
describiremos un mtodo debido a Graeffe realmente ingenioso, que nos proporciona
gran exactitud en las races de un polinomio.

Para calcular las races de un polinomio, crearemos una clase especfica, cuyas
funciones miembro realizan distintas tareas, entre otras las siguientes:

Calcular las races reales simples

Calcular las races reales dobles

Calcular las races complejas en estos dos casos:

cuando el polinomio tiene una raz compleja y su correspondiente


conjugada

cuando el polinomio tiene dos races complejas y sus correspondientes


conjugadas.

Mtodo de las aproximaciones sucesivas

Races de una ecuacin

Descripcin

La condicin de terminacin

La clase que describe el procedimiento


El criterio de convergencia

Ejemplos

Cdigo fuente

Descripcin
El mtodo de las aproximaciones sucesivas es uno de los procedimientos ms
importantes y ms sencillos de codificar. Supongamos la ecuacin

donde f(x) es una funcin continua que se desea determinar sus races reales. Se
sustituye f(x) por la ecuacin equivalente

Se estima el valor aproximado de la raz x0, y se sustituye en el segundo miembro de la


ecuacin para obtener x1.

Poniendo x1 como argumento de x), obtendremos un nuevo nmero x2, y as


sucesivamente. Este proceso se puede sintetizar en la frmula.

(1)

Si esta secuencia es convergente es decir, tiende hacia un lmite, la solucin es


El mtodo de iteracin se explica geomtricamente mediante el grfico de la figura. Se
dibuja la curva y=(x), y la recta y=x, bisectriz del primer cuadrante. La abscisa del
punto de interseccin es la raz buscada.

Un ejemplo tpico es la de encontrar la raz de la ecuacin

Para encontrar la raz, se comienza en el punto cualquiera de abscisa x0 dentro del


intervalo (0, /2), y se traza la lnea vertical hasta que interseca la curva, luego, desde
este punto, se traza una lnea horizontal hasta que se alcanza la recta bisectriz, este
punto tendr por abscisa x1. Se traza de nuevo, una lnea vertical hasta encontrar a la
curva, y otra lnea horizontal hasta encontrar la lnea recta, el punto de interseccin tiene
de abscisa x2 , y as sucesivamente. Como podemos apreciar en la figura, la sucesin x1,
x2, x3... tiende hacia la raz de la ecuacin buscada.

Tal como nos sugiere la representacin grfica de la funcin en la figura, la raz buscada
est en el intervalo 0 a . Tomamos una aproximacin inicial a la raz x0, en dicho
intervalo y aplicamos la frmula (1), su codificacin no presenta grandes dificultades.

double x=0.5;
while(true){
x=Math.cos(x);
}

La condicin de finalizacin
Primero, introducimos el valor inicial x, la primera aproximacin, calculamos el valor
del coseno de x, el valor devuelto (segunda aproximacin), lo guardamos de nuevo en la
variable x, y repetimos el proceso indefinidamente. El cdigo aunque correcto, necesita
terminarse en algn momento, cumpliendo una determinada condicin. Cuando el valor
absoluto del cociente entre la diferencia de dos trminos consecutivos de la sucesin y
uno de los trminos, sea menor que cierta cantidad

Este criterio, no es completamente riguroso, pero es un buen punto de partida para el


estudio de este mtodo. Volvemos a escribir el cdigo incluyendo la condicin de
terminacin y dentro de una funcin denominada raiz, a la que se le pasa el valor inicial
y que devuelve la raz buscada

final double ERROR=0.001;


double raiz(double x0){
double x1;
while(true){
x1=Math.cos(x0);
if(Math.abs((x1-x0)/x1)<ERROR) break;
x0=x1;
}
return x0;
}
En primer lugar, fijamos el valor de la constante o ERROR. Introducimos la primera
aproximacin a la raz, y la guardamos en la variable x0, calculamos su coseno y
obtenemos la segunda aproximacin, la guardamos en la variable x1. Verificamos si se
cumple la condicin de terminacin. En el caso de que no se cumpla, x0 toma el valor de
x1 y se repite el proceso. En el momento en que se cumpla la condicin de terminacin,
se sale del bucle y la funcin devuelve la raz buscada. Como podemos observar las
variables x0 y x1 guardan dos trminos consecutivos de la sucesin que tiende hacia la
raz de la funcin.

La clase que describe el procedimiento


Queremos que el procedimiento numrico sea independiente de la funcin f(x) cuya raz
deseamos averiguar. Para ello, creamos una clase base abstracta denominada Ecuacion
con una funcin miembro raiz que defina el procedimiento numrico, y que deje sin
definir la funcin f(x), declarndola abstracta, dejando a las clases derivadas de
Ecuacion la definicin de la funcin f(x) particular.

public abstract class Ecuacion {


protected static final double ERROR=0.001;

public double raiz(double x0){


double x1;
while(true){
x1=f(x0);
if(Math.abs(x1-x0)<ERROR) break;
x0=x1;
}
return x0;
}

abstract public double f(double x);


}
Las clases derivadas denominadas Funcion1 y Funcion2 definen la funcin f(x)

public class Funcion1 extends Ecuacion{


public double f(double x){
return Math.cos(x);
}
}
public class Funcion2 extends Ecuacion{
public double f(double x){
return Math.pow(x+1, 1.0/3);
}
}
Creamos objetos de las clases derivadas y llamamos desde ellos a la funcin raiz que
describe el procedimiento numrico

Funcion1 f1=new Funcion1();


System.out.println("solucion1 "+f1.raiz(0.5));
System.out.println("solucion1 "+f1.raiz(0.9));
Funcion2 f2=new Funcion2();
System.out.println("solucion1 "+f2.raiz(0.5));
En las dos primeras llamadas a la funcin raiz comprobamos que la solucin buscada no
depende del valor inicial de partida x0, que en el primer caso es 0.5 y en el segundo caso
es 0.9.

El criterio de convergencia
No todas las ecuaciones pueden resolverse por este mtodo, solamente si el valor
absoluto de la derivada de la funcin (x) en la vecindad de la raz es menor que la
unidad (la pendiente de la recta bisectriz del primer cuadrante es uno). En la figura,
podemos ver como es imposible encontrar la solucin marcada por un puntito negro en
la interseccin entre la curva y la recta bisectriz del primer cuadrante, ya que la sucesin
xi diverge.
Por ejemplo, la ecuacin

tiene una raz en el intervalo (1, 2) ya que f(1)=-1<0 y f(2)=5>0. Esta ecuacin puede
escribirse de la forma

En este caso,

y por tanto,

en consecuencia, no se cumplen las condiciones de convergencia del proceso de


iteracin. Si escribimos la ecuacin en la forma

como podr verificar fcilmente el lector, cumple las condiciones de convergencia,


obtenindose rpidamente un valor aproximado de la raz buscada.

Ejemplos
Resolver por el mtodo de aproximaciones sucesivas las siguientes ecuaciones. Primero
hay que ponerlas de la forma x=f(x).
Cdigo fuente

Ecuacion.java, Funcion1.java, Funcion2.java, EcuacionApp1.java

El mtodo mitad (raz simple)

Races de una ecuacin

Descripcin

Las condiciones de terminacin del proceso

Raz simple

Cdigo fuente

Descripcin
El mtodo mitad es uno de los mtodos ms sencillos de comprender y es muy
conveniente para dar rpidamente con la raz de la ecuacin dada, sin embargo, el
nmero de clculos aumenta sustancialmente a medida que se desea mayor exactitud.

El procedimiento mitad se basa en el teorema de Bolzano que dice que si tenemos una
funcin y=f(x), de variable real y continua en el intervalo (a, b), y el signo de la funcin
en el extremo a es distinto al signo de la funcin en el extremo b del intervalo, existe al
menos un valor c dentro de dicho intervalo (a, b) tal que f(c)=0, c es por tanto, la raz
buscada, vase la figura.
Supongamos una ecuacin

Para hallar la raz de la funcin en el intervalo (a, b), se divide el intervalo en la mitad.

(3)

Pueden ocurrir uno de estos tres casos:

Si f(m)=0 entonces m es la raz buscada

Si f(a) y f(m) tienen signos contrarios, como en la figura, la raz


buscada est en el intervalo (a, m).

Si no se cumple la condicin anterior, f(b) y f(m) tendran signos


contrarios y la raz estara en el intervalo (m, b).

El nuevo intervalo reducido se divide por la mitad y se procede de igual forma.


Finalmente, en una cierta etapa del proceso tendremos bien la raz exacta de la funcin
f(x), o una secuencia de intervalos cada vez ms reducidos (a1, b1), (a2, b2), .... (ai, bi)...
tal que

Como los puntos extremos de la izquierda a1, a2, ... an, ...forman una sucesin creciente
y acotada, y los de la derecha b1, b2, ... bn, ... una sucesin acotada decreciente, existe un
lmite comn que es la raz buscada.
Las condiciones de terminacin del proceso

1. El ordenador trabaja con nmeros de precisin limitada, por lo que


tendremos que poner un criterio que establezca cuando la funcin
f(x) se considera nula. Diremos que f(x) es nula cuando el valor
absoluto de f(x) sea menor que una cantidad pequea pero no nula 1.

2. No podemos programar un proceso indefinido, es preciso, que la


rutina repetitiva acabe en un momento dado. El criterio empleado es
el siguiente

Siendo 2 cierta cantidad prefijada. La raz se encuentra en el intervalo (an, bn) y m es el


punto medio de dicho intervalo.

3. El tercer criterio de terminacin establece, que el proceso de


bsqueda de la raz se interrumpir despus de un nmero prefijado
de iteraciones, notificndose al usuario que no se ha encontrado la
raz de la funcin con las condiciones fijadas en los puntos 1 y 2.

Para poder codificar este procedimiento hemos de seguir los pasos siguientes

1. Partimos de un intervalo (a, b) en el que la funcin f(x) cambia de


signo

2. Se calcula m, abscisa mitad del intervalo mediante m=(a+b)/2

3. Se verifican las condiciones de terminacin

4. Si f(a) y f(m) tienen signos contrarios, como se ve en la figura, la raz


est en el intervalo (a, m), entonces b toma el valor de m.

5. Si la condicin anterior no es cierta, la raz se encuentra en el


intervalo (m, b), por lo que a tomar el valor de m.

6. Se repite el proceso hasta que se cumple una u otra condicin de


terminacin

do{
m=(a+b)/2;
ym=f(m);
if(Math.abs(ym)<CERO) break;
if(Math.abs((a-b)/m)<ERROR) break;

if((f(a)*ym)<0) b=m;
else a=m;
iter++;
}while(iter<MAXITER);

Raz simple
Como en caso del procedimiento de aproximacione sucesivas, crearemos una clase base
abstracta denominada Ecuacion con una funcin miembro denominada puntoMedio que
describa el procedimiento numrico.

public abstract class Ecuacion {


protected static final double CERO=1e-10;
protected static final double ERROR=0.001;
protected final int MAXITER=200;

public double puntoMedio(double a, double b) throws RaizExcepcion{


double m, ym;
int iter=0;
do{
m=(a+b)/2;
ym=f(m);
if(Math.abs(ym)<CERO) break;
if(Math.abs((a-b)/m)<ERROR) break;

if((f(a)*ym)<0) b=m;
else a=m;
iter++;
}while(iter<MAXITER);
if(iter==MAXITER){
throw new RaizExcepcion("No se ha encontrado la raz");
}
return m;
}

abstract public double f(double x);


}

class RaizExcepcion extends Exception {


public RaizExcepcion(String s) {
super(s);
}
}
Cuando se cumple el tercer criterio de terminacin, es decir, se supera el nmero de
iteraciones MAXITER prefijada de antemano, se lanza (throw) una excepcin que indica
que la raz buscada no se ha encontrado. Para lanzar la excepcin, se ha de crear un
objeto de la clase derivada RaizExcepcion de la clase base Exception.

Como la clase Ecuacion es abstracta, la clase derivada de sta Funcion1 define la


funcin f(x) particular cuyas raz deseamos conocer en un determinado intervalo. Sea
por ejemplo, la funcin estudiada en la seccin anterior

Como hemos visto esta funcin tiene una raz en el intervalo (0, /2). La funcin
cambia de signo en dicho intervalo, f(0)=-1, y f(/2)=/2.
public class Funcion1 extends Ecuacion{
public double f(double x){
return(x-Math.cos(x));
}
}
Para hallar la raz de esta ecuacin creamos un objeto de la clase derivada Funcion1, y
llamamos desde ste a la funcin que describe el procedimiento numrico puntoMedio.
Ya que la funcin puntoMedio puede lanzar una excepcin, la llamada a dicha funcin
se debe de efectuar en un bloque try ... catch. De este modo, se notifica al usuario que
el procedimiento numrico ha sido incapaz de hallar la raz de dicha ecuacin, mediante
el mensaje "No se ha encontrado la raz" que se extrae del objeto ex de la clase
RaizExcepcion mediante la funcin getMessage.

Ecuacion e=new Funcion1();


try{
System.out.println("solucin1 "+e.puntoMedio(0.5, 0.9));
}catch(RaizExcepcion ex){
System.out.println(ex.getMessage());
}

Cdigo fuente

Ecuacion.java, Funcion1.java, EcuacionApp2.java

Races de un polinomio

Races de una ecuacin

El mtodo de Graeffe

Clculo de los coeficientes en las sucesivas iteracciones

En muchos campos de las matemticas es necesario hallar las races de un polinomio,


por ejemplo, para calcular la integral de una funcin racional, en la transformada de
Laplace, etc. Solamente existen frmulas si el polinomio tiene un grado igual o inferior
a cuatro. Excepto para los polinomios de primer y segundo grado, las frmulas son
complicadas, por lo que se emplean procesos de aproximacin numrica. Entre los
numerosos mtodos que existen, el ms conocido es quiz el mtodo de Newton. Sin
embargo, describiremos un mtodo, realmente ingenioso, que nos proporciona gran
exactitud en las races de un polinomio.

El mtodo de Graeffe
Sea el polinomio
(1)

Hacemos el polinomio ms simple dividiendo todos los coeficientes por el primer


trmino de modo que a0 es siempre 1. Supongamos que sus races reales y distintas son

Al elevar al cuadrado el polinomio y agrupar los trminos se obtiene un polinomio de


grado 2n

(2)

Cuyas races sern

Hemos construido as una nueva ecuacin cuyas races son numricamente iguales a los
cuadrados de las races de la ecuacin original. Repitiendo el proceso, se pueden
obtener ecuaciones cuyas races sean numricamente iguales a las potencias cuarta,
octava, decimosexta, etc. de las races de la ecuacin original. El efecto de este proceso
de elevar al cuadrado es el de producir ecuaciones cuyas races estn cada vez ms
separadas. Por ejemplo, si dos races de la ecuacin original estn entre s como 5 : 4
sus potencias 128 estn en la razn 5128 : 4128, o sea, 2.54 1012: 1, lo que es muy deseable
ya que las ecuaciones cuyas races estn muy separadas se pueden resolver rpidamente
con exactitud considerable. Supngase ahora, que reiterando el proceso de elevacin al
cuadrado se llega a un polinomio

(3)

donde m es el nmero de veces que se repite el proceso de elevacin al cuadrado. As, si


se repite siete veces el proceso de elevacin al cuadrado, 2m =27 =128 sera el exponente
al que estaran elevados las sucesivas potencias xn, xn-1, xn-2, ... del polinomio. Sus races
sern las del polinomio original elevadas al exponente 2m.

Por las relaciones conocidas entre races y coeficientes del polinomio, se tiene que
En la suposicin de que

y de que 2m es grande por ejemplo 128 o 256, se cumplir que

donde el smbolo >>> indica mucho mayor que. Las relaciones entre coeficientes y
races quedarn simplificadas con gran aproximacin a las expresiones.

As, el mdulo de r1 se puede hallar extrayendo la raz 2m-sima de 1 . De la segunda


ecuacin se obtiene r2, y as sucesivamente. La frmula para obtener el mdulo de la
raz ri es

En la prctica, hallamos el logaritmo de ri, y luego, calculamos el antilogaritmo del


resultado obtenido, de este modo se obtiene el valor absoluto de la raz ri.
(4)

Para determinar el signo, se halla el valor del polinomio original para los valores ri, y
-ri, uno de los dos har que dicho valor sea prximo a cero, y por tanto, ser la raz
buscada.

Clculo de los coeficientes en las sucesivas iteracciones


Un polinomio cuyas races son reales y distintas es el caso ms simple que se nos puede
presentar. Sea por ejemplo el polinomio ,cuyas races como se puede
comprobar fcilmente por simple sustitucin son 3, 2, y -1. En la tabla se observa los
coeficientes i resultantes del proceso de elevacin del polinomio a las potencias 2, 4, 8,
16, 32, 64, 128, 256 y 512 respectivamente.

El primer coeficiente 0 es uno

El segundo 1 se obtiene a partir de los coeficientes de la fila anterior

mediante la expresin

El tercer coeficiente 2 mediante la expresin

El cuarto coeficiente 3 mediante la expresin

m (2m) 0 1 2 3

0 (1) 1.0 -4.0 1.0 6.0

1 (2) 1.0 14.0 49.0 36.0

2 (4) 1.0 98.0 1393.0 1296.0

3 (8) 1.0 6818.0 1.6864 106 1.6796 106

4 (16) 1.0 4.3112 107 2.8212 1012 2.8211 1012

5 (32) 1.0 1.8553 1015 7.9587 1024 7.9587 1024

6 (64) 1.0 3.4337 1030 6.334 1049 6.334 1049

7 (128) 1.0 1.179 1061 4.012 1099 4.012 1099


8 (256) 1.0 1.3901 10122 1.6096 10199 1.6096 10199

9 (512) 1.0 1.9323 10244 2.5908 10398 2.5908 10398

Podemos observar en la tabla que cada coeficiente en la iteracin 9, es


aproximadamente el cuadrado del coeficiente en la iteracin precedente, habindose
eliminado el efecto de los dobles productos

A partir de este ejemplo, tenemos que codificar el procedimiento de Graeffe cualquiera


que sea el grado n del polinomio y el nmero m de veces que se repite el proceso de
elevacin al cuadrado, lo que requiere los siguientes pasos:

1. Crear en memoria un array bidimensional de MAX_ITER filas y n+1


columnas (n es el grado del polinomio), para guardar los coeficientes
del polinomio, tras la aplicacin sucesiva del procedimiento de
elevacin al cuadrado, tal como se ve en la tabla.

2. Obtener los coeficientes de la siguiente fila a partir de la fila anterior,


mediante las expresiones (2)

3. Obtener las races del polinomio, primero, su valor absoluto mediante


la frmula (4) y luego su signo, y guardarlas en un array
unidimensional de dimensin n.

4. Mostrar las races del polinomio.

Reservamos memoria para un array bidimensional a, y guardamos en la primera fila los


coeficientes del polinomio, de mayor a menor grado.

a= new double[MAX_ITER][n+1];
//la primera fila de la tabla guarda los coeficientes del polinomio
for(int j=0; j<n+1; j++){
a[0][j]=coef[j];
}
for(int m=1; m<MAX_ITER; m++){
for(int j=0; j<n+1; j++){
a[m][j]=0.0;
}
}
Donde MAX_ITER es el nmero mximo de iteracciones, o de veces que se repite el
proceso de elevacin al cuadrado.

En una funcin miembro denominada tabla, codificaremos el procedimiento de


elevacin al cuadrado de un polinomio de grado n. Partiendo del polinomio original (1),
obtenemos el polinomio resultante del procedimiento de elevar al cuadrado (3) segn el
esquema (2). En la expresin (2) observamos que el coeficiente de grado i del nuevo
polinomio i se obtiene efectuando las siguientes operaciones entre los coeficientes del
polinomio original: se calcula el cuadrado de ai y se halla el doble producto de los
elementos equidistantes ak y al, siendo los ndices k=i-s y l=i+s, con s=1, 2, 3... hasta
que se llegue al final del polinomio. Por ejemplo, los elementos equidistantes a a3 en un
polinomio de 6 grado son (a2, a4), (a1, a5) y (a0, a6). Por tanto, el nuevo coeficiente i
del polinomio elevado al cuadrado se calcular mediante la frmula

Sorprendentemente, el lenguaje Java, no produce error por "overflow", es decir, cuando


se supera el lmite mximo o mnimo para un tipo de dato bsico: int, long, o double.
Por ejemplo, podemos guardar nmeros enteros en una variable tipo int siempre que
est en el intervalo -2147483648 a 2147483647. Las clases que envuelven a los tipos
primitivos de datos, Integer, Double, etc. nos proporcionan funciones miembro que nos
notifican cuando se sobrepasen los lmites especificados para un tipo de dato dado.

En el cdigo de la funcin tabla, cuando se supera el valor mximo que puede guardar
un dato de tipo double, se interrumpe el proceso de elevacin al cuadrado, y se sale
fuera del bucle. La funcin esttica isInfinite de la clase Double se encarga de
verificarlo devolviendo true si hemos superado dicho lmite permitido.

exterior:
do{
for(int i=0; i<n+1; i++){
a[m][i]=a[m-1][i]*a[m-1][i];
if(Double.isInfinite(a[m][i])){
break exterior;
}
}
//....
m++;
}while(m<MAX_ITER);
Es necesario emplear un break con una etiqueta para salir al bucle exterior do...while, e
interumpir el proceso de elevacin al cuadrado. Si solamente empleamos break salimos
del bucle interior for y se continuara en el bucle do...while el proceso de clculo.

Nos queda ahora, la determinacin el signo de cada uno de los dobles productos. Si el
ndice s es impar, entonces el signo es negativo, y si es par el signo es positivo. En vez
de elevar -1 a la potencia s, empleamos el operador mdulo % en conjuncin con la
macro if ... else, que se leer: si s es impar (el resto de dividir s entre 2 es cero),
entonces el valor de la variable entera signo es +1 en caso contrario es -1.

signo=(s%2==0)? +1: -1;


Los coeficientes del polinomio original se guarda en el array a[0][i], (i=0 ... n). Cuando
se eleva al cuadrado los coeficientes del nuevo polinomio se guardan en el array a[1]
[i], (i=0 ... n), y as sucesivamente. Los coeficientes a[m][i], (i=0 ... n) corresponden al
polinomio que se ha elevado a la potencia 2m. Dicha potencia se calcula mediante un
bucle for.

pot2=1;
for(int i=1; i<=m; i++){
pot2*=2;
}
El cdigo de la funcin tabla, que calcula los coeficientes polinomio resultante del
proceso de elevar el polinomio original sucesivamente al cuadrado m veces, es el
siguiente

private void tabla(){


int k,l, signo;
//divide el polinomio por el primer coeficiente, las races no cambian
for(int i=1; i<n+1; i++){
a[0][i]/=a[0][0];
}
a[0][0]=1.0;
m=1;
exterior: //etiqueta
do{
//cuadrados
for(int i=0; i<n+1; i++){
a[m][i]=a[m-1][i]*a[m-1][i];
if(Double.isInfinite(a[m][i])){
break exterior;
}
}
//dobles productos
for(int i=1; i<n; i++){
for(int s=1; s<n/2+1; s++){
k=i-s; l=i+s;
if((k<0)||(l>n)) break; //trminos simtricos
signo=(s%2==0)? +1: -1;
a[m][i]+=signo*2*a[m-1][k]*a[m-1][l];
if(Double.isInfinite(a[m][i])){
break exterior;
}
}
}
m++;
}while(m<MAX_ITER);

m--;
//potencia de m de 2
pot2=1;
for(int i=1; i<=m; i++){
pot2*=2;
}
}