Ormiston pairs: Difference between revisions

Content added Content deleted
(→‎{{header|Free Pascal}}: checking mod 18 =0 is faster.)
m (→‎{{header|Free Pascal}}: checking every second number for prime....useful especially for bigger numbers)
Line 537: Line 537:
tpd10_UsedDgts2 = ^td10_UsedDgts2;
tpd10_UsedDgts2 = ^td10_UsedDgts2;
var
var
p_zero : tDigits10;// faster than fillchar
p_zero : tDigits10;


procedure OutIn(cnt,p1,p2:NativeInt);
procedure OutIn(cnt,p1,p2:NativeInt);
Line 557: Line 557:
begin
begin
outP := p_zero;
outP := p_zero;
begin
repeat
repeat
r := p DIV 10;
r := p DIV 10;
inc(outP[p-10*r]);
inc(outP[p-10*r]);
p := r;
p := r;
until r = 0;
until r = 0;
end;
end;
end;


function CheckOrmiston(const d1,d2:tpd10_UsedDgts2):boolean;inline;
function CheckOrmiston(const d1,d2:tpd10_UsedDgts2):boolean;inline;
// checking four digits at once.Ord to circumvent conditional jumps
begin
begin
exit((ORD(d1^[0]=d2^[0]) + ORD(d1^[1]=d2^[1]) + ORD(d1^[2]=d2^[2])) =3);
result := (d1^[1]=d2^[1]) AND (d1^[0]=d2^[0]) AND (d1^[2]=d2^[2]);
// result := (d1^[0]=d2^[0]) AND (d1^[1]=d2^[1]) AND (d1^[2]=d2^[2]);
end;
end;

var
var
pSieve : tpPrimes;
pSieve : tpPrimes;
Line 578: Line 573:
{$align 16}
{$align 16}
p1,p2 :tDigits10;
p1,p2 :tDigits10;
pr,pr_before,
pr,prLimit :nativeInt;
cnt,prLimit :nativeInt;
delta,cnt : NativeUint;
Begin
Begin
T0 := now;
T0 := now;
Line 585: Line 580:
T1 := now;
T1 := now;
Writeln('time for sieving ',FormatDateTime('NN:SS.ZZZ',T1-T0));
Writeln('time for sieving ',FormatDateTime('NN:SS.ZZZ',T1-T0));

pSieve := @PrimeSieve[0];
pSieve := @PrimeSieve[0];
pr_before := 2;
pr := 3;
Convert2Digits10(pr_before,p1);
pr := pr_before;
prLimit := 100*1000;
prLimit := 100*1000;
cnt := 0;
cnt := 0;
repeat
repeat
delta := 0;
repeat
repeat
inc(pr);
pr +=2;
delta += 2;
until pSieve[pr];
until pSieve[pr];
if pr > limit then
if pr > limit then
BREAK;
BREAK;

if (pr-pr_before) mod 18 = 0 then
if delta mod 18 = 0 then
begin
begin
Convert2Digits10(pr,p1);
Convert2Digits10(pr,p1);
Convert2Digits10(pr_before,p2);
Convert2Digits10(pr-delta,p2);
if CheckOrmiston(@p1,@p2) then
if CheckOrmiston(@p1,@p2) then
begin
begin
inc(cnt);
inc(cnt);
IF cnt <= 30 then
IF cnt <= 30 then
OutIn(cnt,pr_before,pr);
OutIn(cnt,pr-delta,pr);
end;
end;
end;
end;
p1 := p2;
pr_before := pr;
if pr >=prLimit then
if pr >=prLimit then
prlimit:= OutByPot10(cnt,prlimit);
prlimit:= OutByPot10(cnt,prlimit);
Line 618: Line 611:
{{out|@TIO.RUN}}
{{out|@TIO.RUN}}
<pre>
<pre>
time for sieving 00:00.333
time for sieving 00:00.313
[ 1,913| 1,931][18,379|18,397][19,013|19,031][25,013|25,031][34,613|34,631]
[ 1,913| 1,931][18,379|18,397][19,013|19,031][25,013|25,031][34,613|34,631]
[35,617|35,671][35,879|35,897][36,979|36,997][37,379|37,397][37,813|37,831]
[35,617|35,671][35,879|35,897][36,979|36,997][37,379|37,397][37,813|37,831]
Line 629: Line 622:
3,722 Ormiston pairs before 10,000,000
3,722 Ormiston pairs before 10,000,000
34,901 Ormiston pairs before 100,000,000
34,901 Ormiston pairs before 100,000,000
Real time: 0.620 s User time: 0.528 s Sys. time: 0.085 s CPU share: 98.95 %

Real time: 0.648 s User time: 0.557 s Sys. time: 0.085 s CPU share: 99.05 %
@home 1E10
@home 1E10
// Limit= 10*1000*1000*1000;
// Limit= 10*1000*1000*1000;
Line 639: Line 631:
3,037,903 Ormiston pairs before 10,000,000,000
3,037,903 Ormiston pairs before 10,000,000,000


real 0m25,887s user 0m23,680s sys 0m2,199s
real 0m22,777s user 0m20,654s sys 0m2,115s
</pre>
</pre>