Ormiston pairs: Difference between revisions

m
→‎{{header|Free Pascal}}: checking every second number for prime....useful especially for bigger numbers
(→‎{{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:
tpd10_UsedDgts2 = ^td10_UsedDgts2;
var
p_zero : tDigits10;// faster than fillchar
 
procedure OutIn(cnt,p1,p2:NativeInt);
Line 557:
begin
outP := p_zero;
beginrepeat
repeatr := p DIV 10;
r := inc(outP[p DIV -10*r]);
p := inc(outP[p-10*r]);
until r p := r0;
until r = 0;
end;
end;
 
function CheckOrmiston(const d1,d2:tpd10_UsedDgts2):boolean;inline;
// checking four digits at once.Ord to circumvent conditional jumps
begin
exit((ORDresult := (d1^[01]=d2^[01]) +AND ORD(d1^[10]=d2^[10]) +AND ORD(d1^[2]=d2^[2])) =3);
// result := (d1^[0]=d2^[0]) AND (d1^[1]=d2^[1]) AND (d1^[2]=d2^[2]);
end;
 
var
pSieve : tpPrimes;
Line 578 ⟶ 573:
{$align 16}
p1,p2 :tDigits10;
pr,pr_before,prLimit :nativeInt;
cntdelta,prLimitcnt :nativeInt NativeUint;
Begin
T0 := now;
Line 585 ⟶ 580:
T1 := now;
Writeln('time for sieving ',FormatDateTime('NN:SS.ZZZ',T1-T0));
 
pSieve := @PrimeSieve[0];
pr_beforepr := 23;
Convert2Digits10(pr_before,p1);
pr := pr_before;
prLimit := 100*1000;
cnt := 0;
repeat
until rdelta := 0;
repeat
inc(pr) +=2;
delta += 2;
until pSieve[pr];
if pr > limit then
BREAK;
 
if (pr-pr_before)delta mod 18 = 0 then
begin
Convert2Digits10(pr,p1);
Convert2Digits10(pr_beforepr-delta,p2);
if CheckOrmiston(@p1,@p2) then
begin
inc(cnt);
IF cnt <= 30 then
OutIn(cnt,pr_beforepr-delta,pr);
end;
end;
p1 := p2;
pr_before := pr;
if pr >=prLimit then
prlimit:= OutByPot10(cnt,prlimit);
Line 618 ⟶ 611:
{{out|@TIO.RUN}}
<pre>
time for sieving 00:00.333313
[ 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]
Line 629 ⟶ 622:
3,722 Ormiston pairs before 10,000,000
34,901 Ormiston pairs before 100,000,000
Real time: 0.648620 s User time: 0.557528 s Sys. time: 0.085 s CPU share: 9998.0595 %
 
Real time: 0.648 s User time: 0.557 s Sys. time: 0.085 s CPU share: 99.05 %
@home 1E10
// Limit= 10*1000*1000*1000;
Line 639 ⟶ 631:
3,037,903 Ormiston pairs before 10,000,000,000
 
real 0m250m22,887s777s user 0m230m20,680s654s sys 0m2,199s115s
</pre>
 
132

edits