Nome: Alexandre Gomes Pinto
RA: 090240
Monografia
Inteiros Consecutivos Com a Mesma Quantidade de
Divisores Principais
Resumo
Um divisor principal de um número inteiro positivo n é qualquer potência de um
primo que divide n, digamos pa | n, em que a é máximo (a é um inteiro positivo, pa+1
não divide n). Dizemos então que pa é um divisor principal de n, ou pa || n.
Para cada inteiro n ≥ 0, chamamos de Pn o conjunto de todos inteiros positivos
com exatamente n divisores principais. Alguns exemplos são:
P0 = {1},
P1 = {2, 3, 4, 5, 7, 8, 9, 11, 13, 16, 17, 19, 23, 25, 27, 29, 31, 32, ... }
P2 = {6, 10, 12, 14, 15, 18, 20, 21, 22, 24, 26, 28, 33, 34, 35, ... }
P3 = {30, 42, 60, 66, 70, 78, 84, 90, ... }
Estamos interessados em saber qual é a maior seqüência de inteiros
consecutivos em um conjunto Pn. Sabemos que tal seqüência existe, pois:
Seja M o produto dos primeiros n + 1 primos. Então M ∈ Pn+1. Logo, qualquer
seqüência de M inteiros consecutivos contém um múltiplo de M, portanto qualquer
seqüência de Pn tem um tamanho menor que M.
Abaixo segue um programa em linguagem C que retorna os elementos de um
Pn, limitados a um valor máximo de 7500. O programa é capaz de calcular o conjunto
Pn para n = 1, 2, 3. Os resultados encontrados por ele coincidem com os do artigo no
qual este trabalho se baseou, “Consecutive Integers with Equally Many Principal
Divisors – Roger B. Eggleton and James A. Macdougall”.
Exemplo de funcionamento:
Digite o numero de divisores principais (1, 2 ou 3) dos elementos do conjunto:
Entrada: 2
Digite o valor máximo do conjunto (número entre 2 e 7500):
Entrada: 100
Saída: (Números do conjunto)
Maximal run: 6
Starting with: 91
Caso existam mais seqüências com o mesmo tamanho, o programa exibirá
mais inteiros iniciais, cobrindo assim todas as maiores seqüências no intervalo
especificado. O valor máximo do conjunto não pôde ser maior devido a grande
quantidade de cálculos para P3.
#include <stdio.h>
#include <math.h>
void Um(int v[],int p[], int b);
void Dois(int v[],int p[], int b);
void Tres(int v[],int p[], int b);
void Primos(int p[], int b);
void Imprime(int b, int run, int matriz[][20], int v[]);
void Maximos(int b, int *run, int matriz[][20], int v[]);
int main() {
int v[7501], p[7501], i, j, a, b, c, n, m, e, f, run;
int matriz[10][20];
printf ("Digite o numero de divisores principais (1, 2 ou 3) dos elementos do conjunto: \n");
scanf ("%d",&n);
printf ("Digite o valor maximo do conjunto (numero entre 2 e 7500): \n");
scanf ("%d",&b);
// Inicializa o vetor p(primos), o vetor v(divisores principais) e a matriz que guardara as maiores sequencias do
conjunto
for (i = 0; i <= 7500; i++) {
p[i] = i;
}
for (i = 0; i <= 7500; i++) {
v[i] = 0;
}
for (i = 0; i <10; i++) {
for (j = 0; j < 20; j++) {
matriz[i][j] = 0;
}
}
Primos(p,b);
if (n == 1)
Um(v,p,b);
else if (n == 2)
Dois(v,p,b);
else if (n == 3)
Tres(v,p,b);
Maximos(b,&run,matriz,v);
Imprime(b,run,matriz,v);
return 0;
}
//Computa o vetor dos numeros primos
void Primos(int p[], int b){
int i,a;
for (i = 2; i*i <= b;) {
for (a = 2; (i*a <= b); a++) {
p[i*a] = 0;
}
for (i++; p[i] == 0;) {
i++;
}
}
}
//Computa P1
void Um(int v[],int p[], int b) {
int e, c, i;
for (i = 2; i < 7501; i++) {
if (p[i] !=0) {
for (e = 1; pow(p[i],e) <= b; e++) {
c = pow(p[i],e);
v[c] = c;
}
}
}
}
//Computa P2
void Dois(int v[],int p[], int b) {
int e, f, i, j, a, c;
for (i = 2; i < 7501; i++) {
if (p[i] !=0) {
for (e = 1; pow(p[i],e) <= b; e++) {
for (j = i+1; j < 7501; j++) {
if (p[j] != 0) {
for (f = 1; pow(p[j],f) <= b; f++) {
c = pow(p[i],e);
a = pow(p[j],f);
c = c*a;
if (c <= b) {
v[c] = c;
}
}
}
}
}
}
}
}
//Computa P3
void Tres(int v[],int p[], int b) {
int e, f, g, i, j, k, a, c;
for (i = 2; i < 7501; i++) {
if (p[i] !=0) {
for (e = 1; pow(p[i],e) <= b/6; e++) {
for (j = i+1; j < 7501; j++) {
if (p[j] != 0) {
for (f = 1; pow(p[j],f) <= b/6; f++) {
for (k = j+1; k < 7501; k++) {
if (p[k] != 0) {
for (g = 1; pow(p[k],g) <= b/6; g++) {
c = pow(p[i],e);
a = pow(p[j],f);
c = c*a;
a = pow(p[k],g);
c = c*a;
if (c <= b) {
v[c] = c;
}
}
}
}
}
}
}
}
}
}
}
//Encontra as maiores sequencias
void Maximos(int b, int *run, int matriz[][20], int v[]) {
int i, c, m, f;
for ( i = 0, c = 0, m = 1, *run = 1; i <= b; i++) {
if (v[i] != 0) {
c++;
if (c >= *run) {
*run = c;
m = v[i];
for (f = 0; f < 20; f++) {
if (matriz[*run][f] == 0) {
matriz[*run][f] = v[i];
f = 20;
}
}
}
}
if (v[i] == 0) {
c = 0;
}
}
}
//Imprime os vetores e as maiores sequencias encontradas
void Imprime(int b, int run, int matriz[][20], int v[]) {
int i,j;
printf("\n");
for (i = 2; i <= b; i++) {
if (v[i] != 0) {
printf("%5d",v[i]);
}
}
printf("\n\n");
printf(" Maximal run: %d\n
for (j = 0; j < 20; j++) {
Starting with: ", run);
if(matriz[run][j] !=0) {
printf("%d ", matriz[run][j]+1-run);
}
}
printf("\n");
}
Download

Monografia Inteiros Consecutivos Com a Mesma Quantidade de