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; |
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; |
||
repeat |
|||
r := p DIV 10; |
|||
inc(outP[p-10*r]); |
|||
p := r; |
|||
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 |
||
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,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 := 3; |
|||
Convert2Digits10(pr_before,p1); |
|||
pr := pr_before; |
|||
prLimit := 100*1000; |
prLimit := 100*1000; |
||
cnt := 0; |
cnt := 0; |
||
repeat |
repeat |
||
⚫ | |||
repeat |
repeat |
||
pr +=2; |
|||
delta += 2; |
|||
until pSieve[pr]; |
until pSieve[pr]; |
||
if pr > limit then |
if pr > limit then |
||
BREAK; |
BREAK; |
||
if |
if delta mod 18 = 0 then |
||
begin |
begin |
||
Convert2Digits10(pr,p1); |
Convert2Digits10(pr,p1); |
||
Convert2Digits10( |
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, |
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. |
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 |
||
⚫ | |||
⚫ | |||
@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 |
real 0m22,777s user 0m20,654s sys 0m2,115s |
||
</pre> |
</pre> |
||