números primos

Delphi

04/05/2005

pessoal, preciso fazer um pequeno programa matemático que descubra se o número fornecido pelo usuário é PRIMO ou não...como faço isso essa análise?


Rafael Santana

Rafael Santana

Curtidas 0

Respostas

Rjun

Rjun

04/05/2005

function Primo(numero: integer): boolean;
var
  Divisores: integer;
  i: integer;
begin
  result := false;
  Divisores := 0;

  for i := 1 to numero do
    if ((numero mod i) = 0) then
      inc(Divisores);

  if (numero = 1) or (Divisores = 2) then
    result := true;

end;



GOSTEI 0
Rafael Santana

Rafael Santana

04/05/2005

amigo, vc poderia explicar esse código?

obrigado


GOSTEI 0
Rjun

Rjun

04/05/2005

Bom, como você deve saber, número primo e todo número natural, maior que 1 que só tem 2 divisores (o número 1 e o próprio numero).

Entao, fiz um loop do numero 1 ate o numero informado. Em cada volta do loop faço a divisao do numero pelo indice e vejo se o resto é zero. Se for zero, entao o indice é um divisor do numero.

Incremento a variavel Divisores e ao final da funcão vejo se o número de divisores é igual a 2. Se for, então o numero informado é um numero primo.

A função precisa de uma correçao no final. O código

  if (numero = 1) or (Divisores = 2) then 
    result := true; 


deve ser trocado por :

  if Divisores = 2 then result := true;



GOSTEI 0
Brunobaco

Brunobaco

04/05/2005

function Primo(numero: integer): boolean; var Divisores: integer; i: integer; begin result := false; Divisores := 0; for i := 1 to numero do if ((numero mod i) = 0) then inc(Divisores); if (numero = 1) or (Divisores = 2) then result := true; end;


Amigo, a variavel numero é o numero passado como parametro. Então entra no laço for. Qdo se faz um numero mod i, o codigo está pegando o resto da divisão apenas, e não quociente. Se o resultado for zero (ou seja, divisivel pelo numero), incrementa a variável divisores. após terminar o for, verifica se o numero passado é o numero 1 (o numero 1 é primo, e ele só será dividido por 1, ou seja, uma unic vez), e se divisores for igual a zero, significa que ele só foi dividido 2 vezes, uma vez por 1 (todos são divisíveis por 1) e por ele mesmo. Isso significa que ele é primo.

Explicação: Um número primo é aquele que é divisivel por 1 e por ele mesmo.

Entendeu??

Espero ter ajudado

Bruno Augusto


GOSTEI 0
Edilcimar

Edilcimar

04/05/2005

você não precisa checar até o valor do número e sim até a raiz quadrada dele, por ex. para saber se 1 milhão é primo basta checar até a raiz de 1 milhão (1 mil), se não for primo até aí, daí para frente não será


GOSTEI 0
Marco Salles

Marco Salles

04/05/2005

você não precisa checar até o valor do número e sim até a raiz quadrada dele, por ex. para saber se 1 milhão é primo basta checar até a raiz de 1 milhão (1 mil), se não for primo até aí, daí para frente não será


O Problema é que a Grande muaioria de Números , Não retornan Raiz Quadrada Inteiras
Por exemplo ::: 12346787980980901 é Primo ?????
Sei la:???
e sua raiz quadrada é 3513799.65008 :cry:


GOSTEI 0
Edilcimar

Edilcimar

04/05/2005

se até o seu número 3513799.65008, desprezadas as casas decimais, ele for primo daí para frente será, então basta checar até 3513799


GOSTEI 0
Andremuller

Andremuller

04/05/2005

o mais importante é parar no momente em que achou o terceiro divisor

function Primo(numero: integer): boolean;
var
  Divisores: integer;
  i: integer;
begin
  result := false;
  Divisores := 0;

  for i := 1 to numero do
    if ((numero mod i) = 0) then
    begin
      inc(Divisores);
      if Divisores > 2 then
        Break;
    end;
  if (numero = 1) or (Divisores = 2) then
    result := true;

end; 



GOSTEI 0
Edilcimar

Edilcimar

04/05/2005

no múmero primo o terceiro divisor será ele próprio. se utilizar assim e o número for grande vai fazer conta desnecessária, faça o cálculo de tempo para verificar se o número 4 bilhoes e 1 é primo e calcule o tempo, depos faça da minha maneira e veja o tempo ganho


GOSTEI 0
Marco Salles

Marco Salles

04/05/2005

se até o seu número 3513799.65008, desprezadas as casas decimais, ele for primo daí para frente será, então basta checar até 3513799

Sera :?: :?:
Que para analisar o Numero 12346787980980901 a gente analisa o Numero 3513799 :?: :?: :?:

Bem , o fato é que o assunto é polemico:

Ver

The Electronic Frontier Foundation is offering a $100,000 award to the first person or group to discover a ten million digit prime number! fonte: http://www.mersenne.org/


e mesmo outro Post interresante:

http://forum.devmedia.com.br/viewtopic.php?t=41137&highlight=primos&sid=f1a58c8990777a29760a6189af124603


GOSTEI 0
Rjun

Rjun

04/05/2005

você não precisa checar até o valor do número e sim até a raiz quadrada dele, por ex. para saber se 1 milhão é primo basta checar até a raiz de 1 milhão (1 mil), se não for primo até aí, daí para frente não será


Bom, seguindo a lógica para saber se 25 é primo, bastaria chegar até 5.
5 é primo mas 25 não, ja que 25 é divisivel por 1, 5, e 25. Então acho que sua lógica esta errada. Se alguém tiver outra sugestão posta aí.


GOSTEI 0
Edilcimar

Edilcimar

04/05/2005

Desculpe o engano na escrita, o certo é se ele não for primo até o número 3513799.65008, desprezadas as casas decimais, daí para frente ele NÃO será, portanto basta checar até 3513799. Isto é uma regra matemática. O probelma de achar um primo com 10 milhões de dígitos é que a raíz quadrada do mesmo anda terá mais de 3 mil dígitos, você se habilita a gastar anos para o computador fazer este tipo de conta?


GOSTEI 0
Andremuller

Andremuller

04/05/2005

pois é, só que 4 bilhões não é primo e faça a sua maneira e a minha (que só completei a idéia do colega não é propriamente minha idéia), na minha ele já cai fora nas primeiras iterações.

O negócio então é fazer um mix das duas idéias.
Se dá pra fazer só até a raiz quadrada, o que pode ser porque não tenho certeza, melhor, só que de qualquer forma deve-se parar ao encontrar o terceiro divisor


GOSTEI 0
Massuda

Massuda

04/05/2005

Bom, seguindo a lógica para saber se 25 é primo, bastaria chegar até 5. 5 é primo mas 25 não, ja que 25 é divisivel por 1, 5, e 25. Então acho que sua lógica esta errada. Se alguém tiver outra sugestão posta aí.
Pelo que me lembro, a regra é essa mesma que o colega Edilcimar postou... basta testar até a raiz quadrada do valor testado.

Isso parte do princípio que todo número natural não nulo é divisível por 1 e por ele próprio; qualquer outro divisor estará entre 2 e a raiz quadrada do valor testado.


GOSTEI 0
Edilcimar

Edilcimar

04/05/2005

é isto aí massuda, a idéia é esta que você disse
para saber se o número 25 é primo basta ir de 1 até a raiz de 25 (que é 5), se até aí o número só for divisível por 1 então ele é primo, como 25 é divisível por 5 então 25 não é primo


GOSTEI 0
Rjun

Rjun

04/05/2005

Andre

Acho que sua ideia é a melhor. Apenas necessita fazer um ajuste na função, ja que 1 não é primo.


GOSTEI 0
Edilcimar

Edilcimar

04/05/2005

bom a minha funciona, quanto a 1 ser ou não primo existem duas facções, uma dizendo que ele é primo e outra dizendo que não é, mas não cabe aqui este tipo de discussão, pois ficaríamos a vida inteira um tentando convencer o outro, e o que importa é agilizar a conta


GOSTEI 0
Andremuller

Andremuller

04/05/2005

Colegas, reunindo a idéia do edilcimar e a minha, que se preocupam com o tempo de resposta, temos até agora a seguinte função:

function Primo(ANumero: integer): boolean;
var
  i, iNumero: integer;
  rNumero: Real;
begin
  Result := True;

  rNumero :=  Int(Sqrt(ANumero));
  iNumero :=  StrToInt(FloatToStr(rNumero));

  for i := 2 to iNumero do
    if (ANumero mod i) = 0 then
    begin
      Result := False;
      Exit;
    end;
end;



GOSTEI 0
Edilcimar

Edilcimar

04/05/2005

é exatamente isto


GOSTEI 0
Edilcimar

Edilcimar

04/05/2005

está aqui um pedaço do que utilizo para calcular números primos para criptografia rsa
Quantidade1 := StrToInt(Edit1.Text);
While I <= Quantidade1 do
Begin
Cont := 0;
J := 1;
While J <= Round(Sqrt(I)) do
Begin
Resto := I mod J;
If Resto = 0 then
Cont := Cont + 1;
If Cont > 1 then
Break;
J := J + 1;
End;
End;


GOSTEI 0
Tnaires

Tnaires

04/05/2005

Olá
E não se esqueçam também do Crivo de Eratóstenes... Tendo em mãos um número p, vc pode determinar todos os números primos contidos no intervalo [1, p]. Basta eliminar todos os números do intervalo que são divisíveis por todos os números primos contidos entre 1 e a raiz quadrada d ´p´ (sim, o edilcimar está certo, para decepção de alguns :D). Esse pré-processamento é útil qdo vc precisa determinar várias vezes se um número dentro d um dado intervalo é primo.
Exemplo: entre 1 e 25, vc eliminaria:
- os números divisíveis por 2: 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24
- os números divisíveis por 3: 9, 15, 21
- os números divisíveis por 5: 25
- de 7 pra cima não precisa, pq já passou d 5 (raiz d 25)
- o resultado: 1, 2, 3, 5, 7, 11, 13, 17, 19, 23
Abraços


GOSTEI 0
Marco Salles

Marco Salles

04/05/2005

Desculpe o engano na escrita, o certo é se ele não for primo até o número 3513799.65008, desprezadas as casas decimais, daí para frente ele NÃO será, portanto basta checar até 3513799
.

Agora sim :lol: ..A Ideia não é checar o Numero reultado da raiz , mas fazer a divisão do Numero com todos os numeros ate o Valor da sua Raiz.
Faz sentido e ganha um tempão no processamento :P :P :P


GOSTEI 0
Beppe

Beppe

04/05/2005

O ´problema´ já está resolvido, certo? (se houver um fator(divisor) entre 2 e Trunc(Sqrt(N)), não é primo)

Quanto a questão do 1 ser ou não primo, a resposta é ´nem primo nem composto´, já que obedece nenhuma das duas leis.

http://en.wikipedia.org/wiki/Prime_numbers
http://www.andrews.edu/~calkins/math/webtexts/numb03.htm
http://primes.utm.edu/largest.html
http://www.math.utah.edu/~alfeld/math/prime.html
http://mathforum.org/library/drmath/view/57058.html
http://www.aaamath.com/B/fra63ax2.htm
http://www.oswego.org/mtestprep/math8/a/primecompositel.cfm
http://mathworld.wolfram.com/PrimeNumber.html
http://mathforum.org/dr.math/faq/faq.prime.num.html


GOSTEI 0
Marco Salles

Marco Salles

04/05/2005

citacão de tnaires
sim, o edilcimar está certo, para decepção de alguns


Não entendi esta colocação... Não sei se o nobre colega esta se referindo a Mim ou ao Rjun

citação de Rjun:
Então acho que sua lógica esta errada. Se alguém tiver outra sugestão posta aí.


Como so posso falar em meu nome , quero deixar entendido , que em momento nenhum disse o contrário (Nunca disse que o edicilmar estivesse errado, apenas queria entender a sua Sugestão). E tb nunca sinto decpção , por aprender algo novo, muito pelo contário, me sinto é feliz.


GOSTEI 0
Edilcimar

Edilcimar

04/05/2005

para o beppe de um dos links mencionados http://mathforum.org/dr.math/faq/faq.prime.num.html
A prime number [u:048429930a]is a positive integer that has exactly two positive integer factors, 1 and itself[/u:048429930a]. For example, if we list the factors of 28, we have 1, 2, 4, 7, 14, and 28. That´s six factors. If we list the factors of 29, we only have 1 and 29. That´s 2. So we say that 29 is a prime number, but 28 isn´t.

2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, etc.

Como eu disse existem 2 facções uma que diz que 1 é primo e outra que diz que ele não é primo. A pessoa acima disse o o primo é o número positivo divisível por 1 e por si próprio, ora 1 é divisível por 1 e por si próprio, mas abaixo ele excluiu o 1, o como eu disse anteriormente isto é o tipo de discussão do ovo e a galinha


GOSTEI 0
Tnaires

Tnaires

04/05/2005

[quote:5cb7d9fb5d=´Marco Salles´]E tb nunca sinto decpção , por aprender algo novo, muito pelo contário, me sinto é feliz.[/quote:5cb7d9fb5d]
Situação esclarecida :)
Abraços, amigo


GOSTEI 0
Beppe

Beppe

04/05/2005

Eu também postei estes dois links que explicitam que 1 não é primo. Enquanto 1 é divisível por 1 e por ele mesmo, para ser primo precisa ter exatamente 2 divisores (diferentes).
Pode ver também que o 1 nunca é incluído em listagens de números primos nem em fatorações. O ´1´ é então chamado de unidade
http://mathforum.org/library/drmath/view/57058.html
http://mathworld.wolfram.com/PrimeNumber.html

O [url=http://mathworld.wolfram.com/FundamentalTheoremofArithmetic.html]teorema fundamental da aritmética[/url] e a [url=http://mathworld.wolfram.com/UniqueFactorization.html]fatorização única[/url] fornecem contra-exemplos.


GOSTEI 0
POSTAR