[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Programa_para_achar_nºs_primos_...
--- Eleu Lima Natalli <eleu.vix@zaz.com.br> escreveu:
> Alguem sabe em q site posso baixar o prog q ''caça''
> nº primos ?
Não sei bem o que você tem em mente, mas em
www.mersenne.org
você pode baixar um programa que procura primos de Mersenne,
leia mais lá sobre o assunto. O programa abaixo gera primos de Proth,
primos da forma a*2^b + 1 (com a relativamente pequeno). Exemplo:
boto:~/papers/mersenne/prog%./proth1a 1 500 120
7 * 2^120 + 1 = 9304595970494411110326649421962412033 é primo.
231 * 2^120 + 1 = 307051667026315566640779430924759597057 é primo.
277 * 2^120 + 1 = 368196154832421696794354555697655447553 é primo.
315 * 2^120 + 1 = 418706818672248499964699223988308541441 é primo.
331 * 2^120 + 1 = 439974466604807153931160136952794054657 é primo.
Acabei de rodar este exemplo e não demorou nada perceptível.
O exemplo abaixo demorou poucos segundos.
boto:~/papers/mersenne/prog%./proth1a 1 1000 500
711 * 2^500 + 1 = 2327380722214156869579377874444422997226032494736619065322620162716351129243723608522005035643717855734280432414695210487553469404124514460916583116046337 é primo.
Note que estes números são _demonstravelmente_ primos e não
apenas _provavelmente_ primos.
Eu compilei o programa assim:
boto:~/papers/mersenne/prog%gcc proth1.c -lm -lgmp -Wall -o proth1a
Isto em uma máquina Linux. Deve ser fácil fazer o programa funcionar
em OS parecidos com Unix e deve ser possível até em Windows.
Há mais coisa deste tipo no livro do Gugu e meu sobre primos de Mersenne,
disponível na minha home page.
[]s, N.
=======================================================================
#include <stdlib.h>
#include <stdio.h>
#include <gmp.h>
mpz_t pp;
int
proth(unsigned long h, unsigned long k)
{
unsigned long i;
mpz_t pm, test, aux;
extern mpz_t pp;
mpz_init(pm);
mpz_init(test);
mpz_init(aux);
mpz_ui_pow_ui(pm,(long)(2),k);
mpz_mul_ui(pm,pm,h);
mpz_fdiv_q_2exp(aux,pm,(long)(1));
mpz_add_ui(pp,pm,(long)(1));
/* Calculamos pp = hh * 2^k + 1, pm = pp - 1 e aux = (pp-1)/2. */
mpz_set_ui(test,(long)(2));
mpz_powm(test,test,aux,pp);
if ( mpz_cmp(test,pm) == 0 )
{
mpz_clear(pm);
mpz_clear(test);
mpz_clear(aux);
return(1);
}
if ( mpz_cmp_ui(test,(long)(1)) != 0 )
{
mpz_clear(pm);
mpz_clear(test);
mpz_clear(aux);
return(0);
}
for ( i = 3 ; i < 1000 ; i += 2 )
{
mpz_set_ui(test,i);
if ( mpz_probab_prime_p(test,25) )
{
mpz_powm(test,test,aux,pp);
if ( mpz_cmp(test,pm) == 0 )
{
mpz_clear(pm);
mpz_clear(test);
mpz_clear(aux);
return(1);
}
if ( mpz_cmp_ui(test,(long)(1)) != 0 )
{
mpz_clear(pm);
mpz_clear(test);
mpz_clear(aux);
return(0);
}
}
}
mpz_clear(pm);
mpz_clear(test);
mpz_clear(aux);
return(-1);
}
int
main(int argc, char *argv[])
{
int answ;
unsigned long h, hmin, hmax, k;
extern mpz_t pp;
hmin = atol(argv[1]);
hmax = atol(argv[2]);
k = atol(argv[3]);
mpz_init(pp);
for ( h = hmin ; h <= hmax ; h++ ) if ( h & 1 )
{
answ = proth(h,k);
if ( answ == 1 )
{
printf("%ld * 2^%ld + 1 = ",h,k);
mpz_out_str(stdout,10,pp);
printf(" é primo.\n");
}
else if ( answ < 0 ) printf("%ld * 2^%ld + 1: difícil...\n",h,k);
}
return(0);
}
=========================================================================