Fatorar raízes

Estou criando um aplicativo andorid e estou com um problema:
Se eu tenho √80 eu preciso que ela seja fatorada para 4√5 utilizando MMC, alguém pode me ajudar?
EX:
80|2 \ 2²
40|2 /
20|2 \ 2²
10|2 /
5|5 > 5
1|

√2².2².5
2.2√5
4√5

Olá amigo, fiz um método bem básico. Ele realiza a fatoração, porém não realiza a fatoração de números sem que a divisão de um pelo outro não seja exata. Ex.: “²√2³”, ele poderia fatorar para “2 ²√2”, mas ele só irá fatorar números com divisões corretas. Ex.: “²√2²”, ou elevado na quatro, ou seis ou oito. Fiz no programa para que você possa alterar o grau da raiz podendo ser qualquer um, e não somente quadrada(²).
Para realizar a outra fatoração Ex.: “²√2³”, vai dar um pouco mais de trabalho, porém não é difícil, você apenas precisa seguir a lógica que criei. Teste o programa, pois testei algumas entradas e as mesmas funcionaram. Segue o código.

[code]import java.util.*;

public class Fatoracao {

public static void main (String [] args){
	
	Scanner scanner = new Scanner(System.in);
	System.out.println("Digite o número que gostaria de fatorar: ");
	int numero = scanner.nextInt();
	System.out.println("Digite o grau da raiz: ");
	int grau = scanner.nextInt();
	int divisores [] = achaDivisores(numero);//todos os divisores do número
	int numDiferentes = 1;//numero de divisores diferentes
	int diferentes[] = new int [divisores.length];// array contendo todos os divisores diferentes
	int grausDiferentes[] = new int [divisores.length];//array contendo os graus de cada divisor
	
	diferentes = achaDivisoresDiferentes(divisores);
	grausDiferentes = achaGrausDiferentes(divisores);
	numDiferentes = diferentes.length;
	
	
	for (int i = 0; i < divisores.length; i++) {
		System.out.println("Um dos divisores é: "+divisores[i]);
	}
	for (int i = 0; i < numDiferentes; i++) {
		System.out.println("Existe: " +grausDiferentes[i] + " números " + diferentes[i]);
	}
	
	int [] divisiveis = divideGraus(numDiferentes, grau, grausDiferentes);
	int num1=1;
	int num2=1;
	
	for (int i = 0; i < numDiferentes; i++){
		if(divisiveis[i]==1){
			num1=(int) (num1*Math.pow(diferentes[i], grausDiferentes[i]/grau));
		}
		else if (divisiveis[i]==0)
			num2=(int) (num2*Math.pow(diferentes[i], grausDiferentes[i]));
	}
	
	
	System.out.println("\n\nO resultado final é: "+ num1 +" raiz " +num2);
	
}

public static int[] divideGraus(int numDiferentes, int grau, int [] grausDiferentes){//acha os números que são divisiveis pelo grau fatorada
	int [] divisiveis = new int [numDiferentes];
	for (int i = 0; i < numDiferentes; i++) {
		if (grausDiferentes[i]%grau==0)
			divisiveis[i] = 1;
	}
	return divisiveis;
	
}

public static int [] achaGrausDiferentes(int [] divisores){//acha o grau de cada divisor
	int numDiferentes = 1;//numero de divisores diferentes
	int diferentes[] = new int [divisores.length];// array contendo todos os divisores diferentes
	int grausDiferentes[] = new int [divisores.length];//array contendo os graus de cada divisor
	
	for (int i = 0, k = 0; i < divisores.length; i++, k++){//verifica o número de vezes de cada divisor
		int corrente = diferentes[k] = divisores[i];
		grausDiferentes[k] = 1;
		for (int j = i+1; j < diferentes.length; j++) {
			if (corrente == divisores[j]){
				grausDiferentes[k]++;
			}
			else{
				i = j-1;
				j=diferentes.length;
				numDiferentes++;
			}
				
		}
		
		
	}
	int [] auxGrausDiferentes = new int [numDiferentes];
	for (int i = 0; i < numDiferentes; i++) {//copia apenas os divisores para o array 
		auxGrausDiferentes[i] = grausDiferentes[i];
	}
	
	return auxGrausDiferentes;
	
	
	
}

public static int [] achaDivisoresDiferentes(int [] divisores){//encontra número de divisores diferentes e guarda num array
	int numDiferentes = 1;//numero de divisores diferentes
	int diferentes[] = new int [divisores.length];// array contendo todos os divisores diferentes
	int grausDiferentes[] = new int [divisores.length];//array contendo os graus de cada divisor
	
	for (int i = 0, k = 0; i < divisores.length; i++, k++){//verifica o número de vezes de cada divisor
		int corrente = diferentes[k] = divisores[i];
		grausDiferentes[k] = 1;
		for (int j = i+1; j < diferentes.length; j++) {
			if (corrente == divisores[j]){
				grausDiferentes[k]++;
			}
			else{
				i = j-1;
				j=diferentes.length;
				numDiferentes++;
			}
				
		}
		
		
	}
	int [] auxDiferentes = new int [numDiferentes];
	for (int i = 0; i < numDiferentes; i++) {//copia apenas os divisores para o array 
		auxDiferentes[i] = diferentes[i];
	}
	
	return auxDiferentes;
	
}

public static int [] achaDivisores (int numero){//acha todos os divisores
	int divisores [] = new int [1024];//array contento todos os divisores
	int divisor = 2;
	int aux = numero;
	int numDivisores = 0;
	
	while (aux > 1){//verifica até a variavel chegar em 1, não podendo mais ser fatorada
		int resto = aux%divisor;
		if (resto == 0){//verifica se o resto é igual a 0, se for é divisivel
			divisores[numDivisores++]=divisor;
			aux/=divisor;
		}
		else{//se o resto não for igual a 0 incrementa o divisor
			divisor++;
		}
			
		
	}
	int auxDivisores [] = new int [numDivisores];//array contento todos os divisores com tamanho adequado
	for (int i = 0; i < auxDivisores.length; i++) {//copia apenas os divisores para o array 
		auxDivisores[i] = divisores[i];
	}
	return auxDivisores;
}

}
[/code]

[quote=ibaierle]Olá amigo, fiz um método bem básico. Ele realiza a fatoração, porém não realiza a fatoração de números sem que a divisão de um pelo outro não seja exata. Ex.: “²√2³”, ele poderia fatorar para “2 ²√2”, mas ele só irá fatorar números com divisões corretas. Ex.: “²√2²”, ou elevado na quatro, ou seis ou oito. Fiz no programa para que você possa alterar o grau da raiz podendo ser qualquer um, e não somente quadrada(²).
Para realizar a outra fatoração Ex.: “²√2³”, vai dar um pouco mais de trabalho, porém não é difícil, você apenas precisa seguir a lógica que criei. Teste o programa, pois testei algumas entradas e as mesmas funcionaram. Segue o código.

[code]import java.util.*;

public class Fatoracao {

public static void main (String [] args){
	
	Scanner scanner = new Scanner(System.in);
	System.out.println("Digite o número que gostaria de fatorar: ");
	int numero = scanner.nextInt();
	System.out.println("Digite o grau da raiz: ");
	int grau = scanner.nextInt();
	int divisores [] = achaDivisores(numero);//todos os divisores do número
	int numDiferentes = 1;//numero de divisores diferentes
	int diferentes[] = new int [divisores.length];// array contendo todos os divisores diferentes
	int grausDiferentes[] = new int [divisores.length];//array contendo os graus de cada divisor
	
	diferentes = achaDivisoresDiferentes(divisores);
	grausDiferentes = achaGrausDiferentes(divisores);
	numDiferentes = diferentes.length;
	
	
	for (int i = 0; i < divisores.length; i++) {
		System.out.println("Um dos divisores é: "+divisores[i]);
	}
	for (int i = 0; i < numDiferentes; i++) {
		System.out.println("Existe: " +grausDiferentes[i] + " números " + diferentes[i]);
	}
	
	int [] divisiveis = divideGraus(numDiferentes, grau, grausDiferentes);
	int num1=1;
	int num2=1;
	
	for (int i = 0; i < numDiferentes; i++){
		if(divisiveis[i]==1){
			num1=(int) (num1*Math.pow(diferentes[i], grausDiferentes[i]/grau));
		}
		else if (divisiveis[i]==0)
			num2=(int) (num2*Math.pow(diferentes[i], grausDiferentes[i]));
	}
	
	
	System.out.println("\n\nO resultado final é: "+ num1 +" raiz " +num2);
	
}

public static int[] divideGraus(int numDiferentes, int grau, int [] grausDiferentes){//acha os números que são divisiveis pelo grau fatorada
	int [] divisiveis = new int [numDiferentes];
	for (int i = 0; i < numDiferentes; i++) {
		if (grausDiferentes[i]%grau==0)
			divisiveis[i] = 1;
	}
	return divisiveis;
	
}

public static int [] achaGrausDiferentes(int [] divisores){//acha o grau de cada divisor
	int numDiferentes = 1;//numero de divisores diferentes
	int diferentes[] = new int [divisores.length];// array contendo todos os divisores diferentes
	int grausDiferentes[] = new int [divisores.length];//array contendo os graus de cada divisor
	
	for (int i = 0, k = 0; i < divisores.length; i++, k++){//verifica o número de vezes de cada divisor
		int corrente = diferentes[k] = divisores[i];
		grausDiferentes[k] = 1;
		for (int j = i+1; j < diferentes.length; j++) {
			if (corrente == divisores[j]){
				grausDiferentes[k]++;
			}
			else{
				i = j-1;
				j=diferentes.length;
				numDiferentes++;
			}
				
		}
		
		
	}
	int [] auxGrausDiferentes = new int [numDiferentes];
	for (int i = 0; i < numDiferentes; i++) {//copia apenas os divisores para o array 
		auxGrausDiferentes[i] = grausDiferentes[i];
	}
	
	return auxGrausDiferentes;
	
	
	
}

public static int [] achaDivisoresDiferentes(int [] divisores){//encontra número de divisores diferentes e guarda num array
	int numDiferentes = 1;//numero de divisores diferentes
	int diferentes[] = new int [divisores.length];// array contendo todos os divisores diferentes
	int grausDiferentes[] = new int [divisores.length];//array contendo os graus de cada divisor
	
	for (int i = 0, k = 0; i < divisores.length; i++, k++){//verifica o número de vezes de cada divisor
		int corrente = diferentes[k] = divisores[i];
		grausDiferentes[k] = 1;
		for (int j = i+1; j < diferentes.length; j++) {
			if (corrente == divisores[j]){
				grausDiferentes[k]++;
			}
			else{
				i = j-1;
				j=diferentes.length;
				numDiferentes++;
			}
				
		}
		
		
	}
	int [] auxDiferentes = new int [numDiferentes];
	for (int i = 0; i < numDiferentes; i++) {//copia apenas os divisores para o array 
		auxDiferentes[i] = diferentes[i];
	}
	
	return auxDiferentes;
	
}

public static int [] achaDivisores (int numero){//acha todos os divisores
	int divisores [] = new int [1024];//array contento todos os divisores
	int divisor = 2;
	int aux = numero;
	int numDivisores = 0;
	
	while (aux > 1){//verifica até a variavel chegar em 1, não podendo mais ser fatorada
		int resto = aux%divisor;
		if (resto == 0){//verifica se o resto é igual a 0, se for é divisivel
			divisores[numDivisores++]=divisor;
			aux/=divisor;
		}
		else{//se o resto não for igual a 0 incrementa o divisor
			divisor++;
		}
			
		
	}
	int auxDivisores [] = new int [numDivisores];//array contento todos os divisores com tamanho adequado
	for (int i = 0; i < auxDivisores.length; i++) {//copia apenas os divisores para o array 
		auxDivisores[i] = divisores[i];
	}
	return auxDivisores;
}

}
[/code][/quote]

Por que vc perguntou qul o grau da raiz?

		System.out.println("Digite o grau da raiz: ");

A raiz será apenas quadrada (²√.)? Se for, você pode tirar fora a pergunta e colocar na variável grau o número 2, caso contrário deixe assim, pois podemos ter raízes de diferentes tipos. Ex.: quadrada (²√.), cúbica (³√.), …etc

verdade. esqueci. vc quer o numero fatorado e depois a raiz desse resultado.

vc conhece uma forma de fazer utilizando um array de numeros primos?

O usuário entanglement faz um comentario interessante as 21/12/2011 06:20:03:

como ele sugeriu, e eu pude comprovar, ter uma tabela de números primos acelera o processo da fatoração. vc só fica limitado a fatorar números que tenham sua raiz menores ou iguais ao maior primo armazenado.

Realmente, pois tendo uma tabela não necessitaria descobrir cada um dos fatores, pois já teríamos eles. E de qualquer forma todos os números depois de fatorados tornarão-se fatores de primos. Ex.: testamos na fatoração se o número é divisível por 2, se não for, pulamos para o próximo que é o 3 e assim sucessivamente, porém poderemos desconsiderar os próximos números como 4, 6, 8, 9…etc, pois são todos divisíveis por 2 ou 3, e caso o número não seja divisível por eles, também não será dos seus divisores.

Dê uma pesquisada sobre os Números de Gödel e Fatores Primos.

Bem, para armazenar os primos, você poderia utilizar uma lista pré-escrita contendo uma grande quantidade de números primos (porém não é aconselhável, tendo em vista que o número que você irá fatorar poderá ser maior que sua lista), ou gerar esta lista na hora da execução, antes de fatorá-los, contendo todos os números primos de 2 até o número a ser fatorado.

[quote=AlanGomes]Estou criando um aplicativo andorid e estou com um problema:
Se eu tenho √80 eu preciso que ela seja fatorada para 4√5 utilizando MMC, alguém pode me ajudar?
EX:
80|2 \ 2²
40|2 /
20|2 \ 2²
10|2 /
5|5 > 5
1|

&#8730;2².2².5
2.2&#8730;5
4&#8730;5[/quote]

Com o operador % você consegue descobrir se um número é divisível por outro. Dessa forma, só armazenar quantas vezes cada fator é divisível (no seu exemplo, 2 é divisível 4 vezes - o expoente - e o 5 apena uma). Você pode armazenar essas informações em um Map, por exemplo. Chamarei a base de b e o expoente de e, para facilitar. Seu Map terá uma chave 2 com valor 4 e uma chave 5 com valor 1;

Tendo isso em mãos, só seguir a lógica:
Para cada chave do Map:
se o valor for par, então o fator é b^(n/2). O expoente é dividido por 2 para cortar com a raiz.
se o valor for ímpar, então o fator é raiz(b) * b^((n-1)/2) - o (n-1) é pra eliminar o que ficará na raiz, tornando o expoente par e, portanto, divisível por 2.

No final, só multiplicar todos os fatores.

[quote=ibaierle]Olá amigo, fiz um método bem básico. Ele realiza a fatoração, porém não realiza a fatoração de números sem que a divisão de um pelo outro não seja exata. Ex.: “²√2³”, ele poderia fatorar para “2 ²√2”, mas ele só irá fatorar números com divisões corretas. Ex.: “²√2²”, ou elevado na quatro, ou seis ou oito. Fiz no programa para que você possa alterar o grau da raiz podendo ser qualquer um, e não somente quadrada(²).
Para realizar a outra fatoração Ex.: “²√2³”, vai dar um pouco mais de trabalho, porém não é difícil, você apenas precisa seguir a lógica que criei. Teste o programa, pois testei algumas entradas e as mesmas funcionaram. Segue o código.

[code]import java.util.*;

public class Fatoracao {

public static void main (String [] args){
	
	Scanner scanner = new Scanner(System.in);
	System.out.println("Digite o número que gostaria de fatorar: ");
	int numero = scanner.nextInt();
	System.out.println("Digite o grau da raiz: ");
	int grau = scanner.nextInt();
	int divisores [] = achaDivisores(numero);//todos os divisores do número
	int numDiferentes = 1;//numero de divisores diferentes
	int diferentes[] = new int [divisores.length];// array contendo todos os divisores diferentes
	int grausDiferentes[] = new int [divisores.length];//array contendo os graus de cada divisor
	
	diferentes = achaDivisoresDiferentes(divisores);
	grausDiferentes = achaGrausDiferentes(divisores);
	numDiferentes = diferentes.length;
	
	
	for (int i = 0; i < divisores.length; i++) {
		System.out.println("Um dos divisores é: "+divisores[i]);
	}
	for (int i = 0; i < numDiferentes; i++) {
		System.out.println("Existe: " +grausDiferentes[i] + " números " + diferentes[i]);
	}
	
	int [] divisiveis = divideGraus(numDiferentes, grau, grausDiferentes);
	int num1=1;
	int num2=1;
	
	for (int i = 0; i < numDiferentes; i++){
		if(divisiveis[i]==1){
			num1=(int) (num1*Math.pow(diferentes[i], grausDiferentes[i]/grau));
		}
		else if (divisiveis[i]==0)
			num2=(int) (num2*Math.pow(diferentes[i], grausDiferentes[i]));
	}
	
	
	System.out.println("\n\nO resultado final é: "+ num1 +" raiz " +num2);
	
}

public static int[] divideGraus(int numDiferentes, int grau, int [] grausDiferentes){//acha os números que são divisiveis pelo grau fatorada
	int [] divisiveis = new int [numDiferentes];
	for (int i = 0; i < numDiferentes; i++) {
		if (grausDiferentes[i]%grau==0)
			divisiveis[i] = 1;
	}
	return divisiveis;
	
}

public static int [] achaGrausDiferentes(int [] divisores){//acha o grau de cada divisor
	int numDiferentes = 1;//numero de divisores diferentes
	int diferentes[] = new int [divisores.length];// array contendo todos os divisores diferentes
	int grausDiferentes[] = new int [divisores.length];//array contendo os graus de cada divisor
	
	for (int i = 0, k = 0; i < divisores.length; i++, k++){//verifica o número de vezes de cada divisor
		int corrente = diferentes[k] = divisores[i];
		grausDiferentes[k] = 1;
		for (int j = i+1; j < diferentes.length; j++) {
			if (corrente == divisores[j]){
				grausDiferentes[k]++;
			}
			else{
				i = j-1;
				j=diferentes.length;
				numDiferentes++;
			}
				
		}
		
		
	}
	int [] auxGrausDiferentes = new int [numDiferentes];
	for (int i = 0; i < numDiferentes; i++) {//copia apenas os divisores para o array 
		auxGrausDiferentes[i] = grausDiferentes[i];
	}
	
	return auxGrausDiferentes;
	
	
	
}

public static int [] achaDivisoresDiferentes(int [] divisores){//encontra número de divisores diferentes e guarda num array
	int numDiferentes = 1;//numero de divisores diferentes
	int diferentes[] = new int [divisores.length];// array contendo todos os divisores diferentes
	int grausDiferentes[] = new int [divisores.length];//array contendo os graus de cada divisor
	
	for (int i = 0, k = 0; i < divisores.length; i++, k++){//verifica o número de vezes de cada divisor
		int corrente = diferentes[k] = divisores[i];
		grausDiferentes[k] = 1;
		for (int j = i+1; j < diferentes.length; j++) {
			if (corrente == divisores[j]){
				grausDiferentes[k]++;
			}
			else{
				i = j-1;
				j=diferentes.length;
				numDiferentes++;
			}
				
		}
		
		
	}
	int [] auxDiferentes = new int [numDiferentes];
	for (int i = 0; i < numDiferentes; i++) {//copia apenas os divisores para o array 
		auxDiferentes[i] = diferentes[i];
	}
	
	return auxDiferentes;
	
}

public static int [] achaDivisores (int numero){//acha todos os divisores
	int divisores [] = new int [1024];//array contento todos os divisores
	int divisor = 2;
	int aux = numero;
	int numDivisores = 0;
	
	while (aux > 1){//verifica até a variavel chegar em 1, não podendo mais ser fatorada
		int resto = aux%divisor;
		if (resto == 0){//verifica se o resto é igual a 0, se for é divisivel
			divisores[numDivisores++]=divisor;
			aux/=divisor;
		}
		else{//se o resto não for igual a 0 incrementa o divisor
			divisor++;
		}
			
		
	}
	int auxDivisores [] = new int [numDivisores];//array contento todos os divisores com tamanho adequado
	for (int i = 0; i < auxDivisores.length; i++) {//copia apenas os divisores para o array 
		auxDivisores[i] = divisores[i];
	}
	return auxDivisores;
}

}
[/code][/quote]
pow, muito obrigado, funcionou perfeitamente!