Ormiston pairs: Difference between revisions
Content added Content deleted
m (uups sort entries) |
(→{{header|Free Pascal}}: checking mod 18 =0 is faster.) |
||
Line 412: | Line 412: | ||
=={{header|Pascal}}== |
=={{header|Pascal}}== |
||
==={{header|Free Pascal}}=== |
==={{header|Free Pascal}}=== |
||
update the digits by adding difference. |
//update the digits by adding difference.// Using MOD 18 = 0 and convert is faster. |
||
<syntaxhighlight lang=pascal> |
<syntaxhighlight lang=pascal> |
||
program Ormiston; |
program Ormiston; |
||
Line 533: | Line 533: | ||
type |
type |
||
tDigits10 = array[0..15] of byte; |
|||
td10_UsedDgts2 = array[0.. |
td10_UsedDgts2 = array[0..3] of Uint32; |
||
tpd10_UsedDgts2 = ^td10_UsedDgts2; |
tpd10_UsedDgts2 = ^td10_UsedDgts2; |
||
//size of 32 byte. two XMMx - 16 byte copies p1:=p2 |
|||
tDigits10 = record |
|||
d10_UsedDgts :td10_UsedDgts; |
|||
d10_dgts :array[0..15] of byte; |
|||
d10_maxIdx : Uint32; |
|||
⚫ | |||
procedure Out_Digits10(const p0:tDigits10); |
|||
var |
var |
||
p_zero : tDigits10;// faster than fillchar |
|||
i : Int32; |
|||
⚫ | |||
with p0 do |
|||
begin |
|||
i := d10_maxIdx; |
|||
while i >= 0 do |
|||
begin |
|||
write(d10_dgts[i]); |
|||
⚫ | |||
end; |
|||
write(' '); |
|||
For i := 0 to 9 do |
|||
write(d10_UsedDgts[i]); |
|||
writeln; |
|||
end; |
|||
end; |
|||
procedure OutIn(cnt,p1,p2:NativeInt); |
procedure OutIn(cnt,p1,p2:NativeInt); |
||
Line 575: | Line 552: | ||
end; |
end; |
||
procedure Convert2Digits10(p:NativeUint;var outP:tDigits10); |
|||
var |
var |
||
r : NativeUint; |
|||
begin |
begin |
||
⚫ | |||
fillchar(result,SizeOf(result),#0); |
|||
with result do |
|||
begin |
begin |
||
⚫ | |||
repeat |
repeat |
||
r := p DIV 10; |
r := p DIV 10; |
||
inc(outP[p-10*r]); |
|||
d10_dgts[i] := m10; |
|||
inc(d10_UsedDgts[m10]); |
|||
inc(i); |
|||
p := r; |
p := r; |
||
until r = 0; |
until r = 0; |
||
Line 594: | Line 566: | ||
end; |
end; |
||
⚫ | |||
procedure Add2Digits10(delta:Uint32;var p0,p1:tDigits10); |
|||
// checking four digits at once.Ord to circumvent conditional jumps |
|||
var |
|||
i,r,m10,dgt: Uint32; |
|||
begin |
|||
p1 := p0; |
|||
with p1 do |
|||
begin |
|||
i := 0; |
|||
repeat |
|||
m10 := d10_dgts[i]; |
|||
//remove old digit |
|||
dec(d10_UsedDgts[m10]); |
|||
r := delta DIV 10; |
|||
dgt := m10 + delta -10*r; |
|||
⚫ | |||
begin |
|||
dgt -= 10; |
|||
r += 1; |
|||
end; |
|||
d10_dgts[i] := dgt; |
|||
//insert new digit |
|||
inc(d10_UsedDgts[dgt]); |
|||
delta := r; |
|||
inc(i); |
|||
until (i> d10_maxIdx) OR (delta = 0); |
|||
if (i> d10_maxIdx) AND (delta>0) then |
|||
begin |
|||
d10_maxIdx += 1; |
|||
r := delta DIV 10; |
|||
dgt := delta -10*r; |
|||
d10_dgts[i] := dgt; |
|||
inc(d10_UsedDgts[dgt]); |
|||
end; |
|||
end; |
|||
end; |
|||
⚫ | |||
//check 4 byte at once, not byte by byte |
|||
begin |
begin |
||
exit((ORD(d1^[0]=d2^[0]) + ORD(d1^[1]=d2^[1]) + ORD(d1^[2]=d2^[2])) =3); |
|||
// result := (d1^[0]=d2^[0]) AND (d1^[1]=d2^[1]) AND (d1^[2]=d2^[2]); |
|||
end; |
end; |
||
Line 639: | Line 576: | ||
pSieve : tpPrimes; |
pSieve : tpPrimes; |
||
T1,T0: TDateTime; |
T1,T0: TDateTime; |
||
{$align 16} |
|||
p1,p2 :tDigits10; |
p1,p2 :tDigits10; |
||
pr,pr_before, |
pr,pr_before, |
||
Line 650: | Line 588: | ||
pSieve := @PrimeSieve[0]; |
pSieve := @PrimeSieve[0]; |
||
pr_before := 2; |
pr_before := 2; |
||
Convert2Digits10(pr_before,p1); |
|||
pr := pr_before; |
pr := pr_before; |
||
prLimit := 100*1000; |
prLimit := 100*1000; |
||
Line 660: | Line 598: | ||
if pr > limit then |
if pr > limit then |
||
BREAK; |
BREAK; |
||
if (pr-pr_before) mod 18 = 0 then |
|||
if CheckOrmiston(@p1.d10_UsedDgts,@p2.d10_UsedDgts) then |
|||
begin |
begin |
||
Convert2Digits10(pr,p1); |
|||
Convert2Digits10(pr_before,p2); |
|||
IF cnt <= 30 then |
|||
if CheckOrmiston(@p1,@p2) then |
|||
⚫ | |||
⚫ | |||
⚫ | |||
OutIn(cnt,pr_before,pr); |
|||
⚫ | |||
end; |
end; |
||
p1 := p2; |
p1 := p2; |
||
Line 688: | Line 630: | ||
34,901 Ormiston pairs before 100,000,000 |
34,901 Ormiston pairs before 100,000,000 |
||
Real time: 0. |
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; |
|||
time for sieving 00:17. |
time for sieving 00:17.708 |
||
... |
.... |
||
34,901 Ormiston pairs before 100,000,000 |
34,901 Ormiston pairs before 100,000,000 |
||
326,926 Ormiston pairs before 1,000,000,000 |
326,926 Ormiston pairs before 1,000,000,000 |
||
3,037,903 Ormiston pairs before 10,000,000,000 |
3,037,903 Ormiston pairs before 10,000,000,000 |
||
real |
real 0m25,887s user 0m23,680s sys 0m2,199s |
||
</pre> |
</pre> |
||
=={{header|Phix}}== |
=={{header|Phix}}== |
||
{{trans|Wren}} |
{{trans|Wren}} |