En una publicación anterior pudimos observar tanto el algoritmo que se usa para obtener la raíz cuadrada si es que la hubiera así como la implementación , claro esta esto fue cuando N era numero Primo , en esta oportunidad lo haremos cuando N es numero Compuesto, cabe recalcar que para mayor comodidad de mi parte habrá partes en la implementación que solo mencionare las funciones usadas ya que como indique en la publicación anterior , la raíz cuadrada abarca muchas operaciones extra que ya hemos implementado anteriormente por lo que les dejare el link correspondiente a estas cuando se les haga mención, bueno comencemos.
Algoritmo
Básicamente el algoritmo para números compuestos consiste en factorizar a N en dos factores primos distintos e impares(p y q, donde p>q) y aplicarle el algoritmo de raíz cuadrada cuando N es primo por separado en la cual obtendremos las raíces (r,-r) y (s,-s) para luego continuar con lo que resta del algoritmo.
Implementación:
Clase Factorización:
public class Factorizacion { public ArrayList< integer > factorizar(int numero) { ArrayList< integer > factores = new ArrayList<>(); int i=3; while(numero!=1) { while(numero%2==0) { factores.add(2); numero=numero/2; } while(numero%i==0) { factores.add(i); numero=numero/i; } i++; } return factores; } }Clase Raíz Cuadrada Compuesta:
public class RaizCompuesta { int p,q,a,c,d,x,y,r,s,n; int raicesF[]=new int[4]; ArrayList< Integer > factores = new ArrayList< >(); int raizP1[]=new int[2],raizP2[]=new int[2]; Factorizacion obj= new Factorizacion(); boolean aux1,aux2;//Sirven para validar la existencia de las raices public int[] CalcularRaizCompuesta(int p1,int a1) { factores=obj.factorizar(p1); p=factores.get(1); q=factores.get(0); a=a1; n=p*q; System.out.println("p: "+p); System.out.println("q: "+q); //System.out.println("p: "+p); //System.out.println("q: "+q); Raiz objRaiz1 = new Raiz(); Raiz objRaiz2 = new Raiz(); aux1=objRaiz1.CalcularRaiz(p,a); aux2=objRaiz2.CalcularRaiz(q,a); if(aux1==false||aux2==false) { return null; } else { raizP1=objRaiz1.getRaiz(); raizP2=objRaiz2.getRaiz(); Euclides objEuclides= new Euclides(); long mcd[]=new long[3]; mcd= objEuclides.euclidesExtendido((long)p, (long)q); c=(int) mcd[1]; d=(int) mcd[2]; //System.out.println("c:"+c); //System.out.println("d:"+d); r=raizP1[0]; s=raizP2[0]; //System.out.println("r: "+r); //System.out.println("s: "+s); x=(r*d*q+s*c*p)%(n); y=(r*d*q-s*c*p)%(n); //System.out.println("X: "+x); //System.out.println("Y: "+y); raicesF[0]=x%n; raicesF[1]=-1*raicesF[0]; raicesF[2]=y%n; raicesF[3]=-1*raicesF[2]; for(int i=0;i< 4;i++) { if(raicesF[i]< 0) { raicesF[i]=raicesF[i]+n; } } return raicesF; } } }Fragmento del código de la Interfaz Principal:
public class Factorizacion { RaizCompuesta obj= new RaizCompuesta(); int raices[]=new int[4]; raices=obj.CalcularRaizCompuesta(Integer.parseInt(numero_p.getText()),Integer.parseInt(numero_a.getText())); if(raices==null) { JOptionPane.showMessageDialog(null, "NO EXISTEN RAICES"); } else { raiz_1.setText(""+raices[0]); raiz_2.setText(""+raices[1]); raiz_3.setText(""+raices[2]); raiz_4.setText(""+raices[3]); }Espero les sea de utilidad y hasta la siguiente Publicación.
0 comentarios: