Вы находитесь на странице: 1из 4

Universidade Federal de Minas Gerais Pampulha

Cincias da Computao

Documentao TP1

Trabalho apresentado disciplina


Organizao de Computadores I

Leonel Fonseca Ivo 2007041418

Maro/2008

Nmeros Primos
Algoritmo utilizado (linguagem C):
#include <stdio.h>
/*Implementa o Crivo de Eratstenes para a identificao dos primos*/
/*Parametro: Vetor com os numeros cujas primalidades sero verificadas*/
int testa_primo (int *crivo, int n)
{
int salto;
//Modo de caminhar no vetor
int i;
//Contadores
//A primeira posicao do crivo (posicao 0) contera sempre o numero
//2, portanto, a posicao de um inteiro 'n' no crivo e exatamente
//n-2
if (n > 1 && crivo[n - 2] != 0)
{
salto = n;
//Zera todos os multiplos de 'n' no crivo
for (i = n + salto; i < 1000; i += salto)
crivo[i-2] = 0;
return 1; //'n' e primo
}
return 0;
}
int main ()
{
int i, n;
int *primos; //Vetor que 'simula' o Crivo de Eratostenes
int total = 0;
//Interrompe execucao ao encontrar os 100
//primeiros primos
primos = malloc (sizeof(int *) * 1000);
n = 2;
//Primeiro numero do Crivo
//Monta Crivo de Eratstenes comecando de 2 e indo ate 1002
for (i = 0; i < 1000; i++)
{
primos[i] = n;
n++;
}
for (i = 0; i < 1002; i++)
{
if (testa_primo (primos, i) == 1)
{
printf ("%d e primo\n", primos[i-2]);
total++;
}
if (total == 100)
break;
n++;
}
printf ("total primos: %d\n", total);
}

Explicao sobre o algoritmo


O algoritmo utiliza-se do Crivo de Eratstenes para encontrar os cem primeiros
nmeros primos. Esse mtodo funciona da seguinte maneira: monta-se uma lista
com os nmeros naturais de 1 a n; comea-se marcando o nmero 2 (primeiro
primo), cortando-se da lista todos os seus mltiplos; marca-se o prximo nmero
no eliminado (3) e tambm elimina-se todos os seus mltiplos da lista; repete esse
processo at que sobre somente os nmeros marcados, que so todos os primos no
intervalo de 1 a n.
Esse Crivo montado no main e passado como parmetro para a funo
testa_primo. Essa ltima verifica se o nmero cuja primalidade deve ser testada se
encontra no vetor (verifica se no h um zero na posio n-2. A posio de n no
vetor o ndice n-2 porque o ndice zero ocupado pelo nmero 2, o ndice 1
por 3, e assim por diante). Se sim, ento faz todos os seus mltiplos presentes na
lista iguais a zero e retorna 1, significando que n primo. Caso contrrio, 0
retornado.
Cada primo encontrado impresso na tela (acontece no main) at que se tenha
encontrado os 100 primeiros primos.

Decises de implementao
Na a implementao do algoritmo, o Crivo de Eratstenes montado em um
vetor, cujo tamanho foi fixado em 1000 posies, por saber que os 100 primeiros
primos no fugiriam a esse limite.
Outras decises tomadas foram: comear a listagem do Crivo pelo nmero 2,
que o primeiro nmero primo; o vetor preenchido no main e passado como
parmetro para a funo testa_primo, juntamente com o nmero cuja primalidade
ser testada; a funo testa_primo a responsvel por eliminar (zerar) da lista
todos os mltiplos do parmetro n, se n for um nmero ainda no eliminado, e
retornar 1 se esse nmero for primo ou 0 caso contrrio.

Dificuldades encontradas
A inteno inicial era fazer um algoritmo que implementasse o Teorema de
Fermat para o clculo de nmeros primos. Tal teorema diz que:
Se p um nmero primo e n pertence aos naturais tal
que mdc(p, n) = 1, ento a^(p-1) = 1 mod p.
Ao tentar implement-lo, a primeira dificuldade encontrada foi relativa ao uso
das instrues load word (lw) e store word (sw) do MIPS. A dvida era saber quando
o contedo de um registrador deveria ser armazenado na memria e quando no (por
exemplo: os registradores de argumentos $a0 a $a3 deveriam ser salvos na

memria para seu uso na funo chamada ou isso desnecessrio?). Outra dvida
foi referente aos retornos de funes chamadas para suas chamadoras, o que implica
em dvidas quanto ao uso dos jumps, e como os valores de retorno poderiam ser
usados nessas ltimas.
Sanadas essas dvidas e implementado esse algoritmo, vimos que tal estratgia
no poderia ser utilizada para o clculo dos 100 primeiros nmeros primos, visto
que, ao fazer a^(p-1), os nmeros logo excediam o limite de 2^32. Adotou-se,
ento, a estratgia descrita no tpico anterior.