Crivo de Eratóstenes Simples em Pascal
Publicado por Perfil removido (última atualização em 02/05/2012)
[ Hits: 5.477 ]
Esta implementação do Crivo de Erastótenes possui diretivas de pré-compilação que permitem que o código seja compilado por fpc (Free Pascal) ou gpc (GNU Pascal).
Na prática é igual a um IF ... THEN ... sem usar BEGIN ... END e usando ENDIF. Sendo também que esta etapa ocorre como uma filtragem de código, antes deste ser compilado.
No caso os compiladores consideram na compilação o código dentro de {$ifdef X} ... {$endif} somente se houver uma identificação de um símbolo (aqui chamado de X) no contexto
Já {$ifndef X} ... {$endif} faz o contrário: compila se a definição do símbolo não for encontrada.
A pré-definição "FPC" indica uso do compilador Free Pascal.
A pré-definição __GPC_RELEASE__ indica uso do compilador GNU PASCAL.
O código demarcado, portanto, só será usado conforme estes símbolos aparecerem {ifdef ...} ou não {ifndef ...}, isto é, conforme os compiladores utilizados.
O nome dos tipos de dados numéricos para valores grandes é diferente nos dois compiladores e foi utilizada uma predefinição na área TYPE do código.
Dentro desta área o código é selecionado em tempo de compilação conforme a diretiva.
Mais abaixo também está outro par de compilações condicionais.
A procedure Inc (...) parece não funcionar com valores não-ordinais ou inteiros no Free Pascal, portanto foi escolhido o incremento na forma-padrão como opção.
Acredito que o uso de Inc (...) funcione do mesmo modo que a variável com "duplo mais" (V++) ou "mais igual" (V+=2) funcionam otimizados em C.
Program sieve001;
{$ifndef __GPC_RELEASE__} Uses Crt; {$endif}
Type
{$ifdef FPC}
MyInt = QWord;
MyReal = Extended;
{$endif}
{$ifdef __GPC_RELEASE__}
MyInt = LongestWord;
MyReal = LongestReal;
{$endif}
Const
{
A titulo de curiosidade para valores grandes
X = MyInt (18446744073709551615);
T = MyInt (500000);
S = MyInt (279800);
}
T = MyInt (500000);
S = MyInt (41550);
Var
primes : Array [1..S] of MyInt;
i, j, l, m, p, q : MyInt;
k, n : MyReal;
Begin
primes[1] := 2;
primes[2] := 3;
j:=0; l:=3; m:=l;
k:=0.0; n := 5.0;
p := T; q := S;
While m<=q Do Begin
primes[m] := 1;
Inc(m);
End;
Repeat
i := Trunc(n);
j := 1;
k := SQRT(n);
While (primes[j]<k) And ((i Mod primes[j])<>0) Do Inc(j);
If (primes[j]>k) Then Begin
primes[l] := i;
Inc (l);
End;
{$ifdef FPC}
If ((i Mod 3)=2) Then n:=n+2
Else n:=n+4;
{$endif}
{$ifdef __GPC_RELEASE__}
If ((i Mod 3)=2) Then Inc(n,2.0)
Else Inc(n,4.0);
{$endif}
Until (n>=p);
m := 1;
While m<l Do Begin
Write (primes[m], ' ');
Inc(m);
End;
WriteLn;
End.
Operações simples e avançadas com matrizes
IA Turbina o Desktop Linux enquanto distros renovam forças
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Linux em 2025: Segurança prática para o usuário
Desktop Linux em alta: novos apps, distros e privacidade marcam o sábado
IA chega ao desktop e impulsiona produtividade no mundo Linux
Atualizando o Fedora 42 para 43
Como saber se o seu e-mail já teve a senha vazada?
Como descobrir se a sua senha já foi vazada na internet?









