Verificador de Números Mutuamente Amigos - multithread - OpenMP
Por: Giovanni Rotta • 4/4/2016 • Trabalho acadêmico • 840 Palavras (4 Páginas) • 683 Visualizações
Trabalho 3
Números Mutuamente Amigos
Programação Concorrente
INE 5410
Giovanni Rotta
14103948
Este trabalho tem como objetivo praticar ferramentas e métodos de sincronização de códigos, aplicando os conceitos visto em sala de aula, realizando dois programas usando técnicas diferentes, a fim de identificar a melhoria de desempenho que a programação paralela nos proporciona em alguns casos.
Para este trabalho usamos a linguagem C e para a solução paralela utilizamos o OpenMP.
O terceiro trabalho da disciplina de Programação Concorrente consiste em implementar uma solução sequencial e paralela para um programa capaz de identificar números mutuamente amigos em uma determinada faixa de números. Dois números a e b são mutuamente amigos se a razão entre a soma de todos os divisores do número a e o número a é igual a razão entre a soma de todos os divisores do número b e o número b.
A solução sequencial e paralela deverão encontrar todos os pares de números inteiros mutuamente amigos entre dois números escolhidos, máx e min.
Solução do Problema.
Primeiramente foi definida a função main, em seus parametros estão os argumentos usado na hora de executar o código, número max, número min e no caso da solução paralela, número de threads, todos estes atributos setam um variável global, utilizada na maioria das funções do código.
Nesta função além de setar as variaveis global, é criado um array bidimensional e também as funções de achar razão e compararVetores, ambas pedem o array para salvar e ler os dados manipulados.
[pic 1]
Resolvi começar achando a razão de cada número, com este valor em mãos eu poderia depois compara-los e achar quais são mutuamente amigos.
Porém para conseguir esta razão eu precisaria da soma dos divisores e também do número em si, então criei primeiramente uma função de achar a soma dos divisores.
A soma dos divisores de um número é essencial para se achar números mutuamente amigos, números divisores de outro são todos os números cujo a divisão pelo outro resulta em zero, e a soma destes números é usada para compor a razão a ser comparada, a fim de se achar os números mutuamente amigos.
Para isso foi cirado um metodo acharSoma, que contêm o parametro número, deste número é retirado e somado todos os seus divisores, esta função retorna o valor final da soma.
[pic 2]
.
Com este valor em mãos eu posso agora obter a razão esperada, porém como vou comparar os números que compõem a razão e não o resultado (pois pode existir o mesmo resultado para diferentes razões) preciso fazer o mdc dos números que compõem esta razão, desta maneira posso comparar as razões diretamente.
A função de MDC foi retirada do enunciado do trabalho, feito pelo professor.
[pic 3]
Já temos o suficiente para conseguir fazer a comparação, primeiramente salvaremos os dados recebidos em um array bidimensional sendo que o dividendo da razão será salvo na primeira coluna e o divisor na segunda.
Um loop é usado para percorrer os números dentro da faixa Max e Min escolhidas e salva-los no array.
[pic 4]
Com o array completo é possível agora compará-lo, e para isso fiz a função de compararVetores, cujo recebe o mesmo array, para poder averiguar os números mutuamente amigos.
[pic 5]
...