Conversão de código com int para BigInteger - crivo de eratostenes

5 respostas
D

Olá amigos,

Segue o código que retorna uma lista com todos os números primos de 3 até n. É um algoritmo conhecido como crivo de eratostenes, para gerar primos.

/************************************************/

List<Integer> crivo_eratostenes(int n){
		List<Integer> primos = new LinkedList<Integer>();  
		int [] v = new int[(n-1)/2 + 1];// a posição 0 não usa. 
                                                           
		int T,P = 3;
		for( int j=1;j<v.length; j++)
			v[j] = 1;
		
		int saida = 0;
		while(saida == 0){
			if((P*P) > n){
				for( int j=1;j<v.length; j++)
					if(v[j]== 1)primos.add(2*j +1);
				saida = -1;
			}
			else if(v[(P -1)/2]== 0)P=P + 2;
			else{
				T = P*P;
				while(T <= n){
					v[(T-1)/2] = 0;
					T = T + 2*P;
				}
				P = P+2;
			}
		}		
		return primos;
	}

/************************************************/

Então, estou tentando fazer a função acima funcionar com BigInteger ao envés de int. Mas, não estou conseguindo. Preciso dela para uma aplicação com algoritmos de criptografia em que quero trabalhar com números enormes!!!
Alguem poderia fazer isso por mim?
Deu pra entender qual é a minha dúvida?
Um dos obstáculos que encontrei, foi como manipular vetores e listas de BigInteger.

Obrigado,
David

5 Respostas

alucardeck

david-santiago:

Alguem poderia fazer isso por mim?

Isso já é motivo pra mim não te ajudar =)

Nada pessoal… :twisted:

não sei… mas tem uma carinha de dever de casa… =x

shoko

Opa claro que podemos ajudar, mais cara qual é o seu problema, sua dificuldade, você não está conseguindo por qual motivo?

D

alucardeck,
isso não é lição de casa…hehehehehhe
eu estou estudando teoria dos numeros inteiros e criptografia.

Mas eu sei que eu preciso utilizar a classe BigInteger.

Se alguem puder colocar trechos de código com essa classe utilizando vetores ou listas de BigInteger, já me ajudaria. Eu li a documentação da SUN e não encontrei nada que pudesse me ajudar!

Por exemplo, quando quero declarar um vetor de BigInterger, o código abaixo não funciona:

BigInteger[]  v = new BigInteger(new BigInteger("1010010018921293792810219201902")) ;

Obrigado

T

Hum, não entendi direito que tipo de vetor de BigInteger você está querendo criar. Você quer criar um vetor com 1 elemento BigInteger, assim:

BigInteger[] v = new BigInteger[] {
    new BigInteger ("[telefone removido]")
};

?

T

Outra coisinha. Você sabe que no caso do Crivo de Eratóstenes você precisa de uma quantidade de memória proporcional à quantidade de primos que você quer listar. Portanto, em uma máquina de 2GB de memória, e supondo que você consiga criar um BitSet de 2 bilhões de bits (o tamanho máximo para um bitset) você pode listar os primos de 3 até 4 bilhões (você não usa os bits pares…) Isso ainda cabe em um long (não exatamente em um int), e não é necessário um BigInteger.

Para determinar se um número inteiro muito grande é primo, não se usa o Crivo porque ele requer muita memória. Usam-se outros métodos, como você já deve saber.

Criado 15 de julho de 2008
Ultima resposta 15 de jul. de 2008
Respostas 5
Participantes 4