Additive primes: Difference between revisions

Content deleted Content added
added =={{header|Pascal}}== calculating sumof digits parallel.But makes no sense, for checking isprime is most time consuming
Line 974: Line 974:
{{out}}
{{out}}
<pre>%1 = [54, 54, 54, 54]</pre>
<pre>%1 = [54, 54, 54, 54]</pre>
=={{header|Pascal}}==
{{works with|Free Pascal}}
<lang pascal>program AdditivePrimes;
{$IFDEF FPC}
{$MODE DELPHI}
{$ELSE}
{$APPTYPE CONSOLE}
{$ENDIF}
uses
sysutils;
type
tNum = array[0..15] of byte;
tNumSum = record
dgtNum,
dgtSum: tNum;
num : Uint32;
end;
tpNumSum = ^tNumSum;


function isPrime(n:Uint32):boolean;
var
p,flipflop: NativeUInt;
begin
if n< 63 then
EXIT(n in [2,3,5,7,11,13,17,19,23,29,
31,37,41,43,47, 53,59,61])
else
begin
IF (n AND 1=0) OR (n mod 3 = 0 ) then
EXIT(false);
result := true;
p := 5;
flipflop := 2;
while result do
Begin
result := n mod p <> 0;
p += flipflop;
flipflop := 6-flipflop;
if p*p>n then
BREAK;
end
end
end;

procedure IncNum(var NumSum: tNumSum;delta: Uint32);
const
BASE = 10;
var
r,
dg: UInt32;
le : Int32;
Begin
if delta = 0 then
EXIT;
NumSum.num +=delta;
le := 0;
repeat
r := delta div BASE;
delta -= BASE*r;
dg := NumSum.dgtNum[le]+delta;
IF dg >= BASE then
Begin
inc(r);
dg -= BASE;
end;
NumSum.dgtNum[le] := dg;
inc(le);
delta := r;
until r = 0;
//correct sum of digits // le is >= 1
delta := NumSum.dgtSum[le];
repeat
dec(le);
delta+= NumSum.dgtNum[le];
NumSum.dgtSum[le]:= delta;
until le = 0;
end;

const
RowWidth = 4;
NextRowCnt = 72 DIV RowWidth;
RANGE = 500;
MAX_OFFSET = 0;//1000*1000*1000;
var
NumSum: tNumSum;
i,cnt,delta,Nr: NativeUint;
BEGIN
Nr := NextRowCnt;
fillchar(NumSum,SizeOf(NumSum),#0);
cnt := 0;
delta := 0;
IncNum(NumSum,MAX_OFFSET);
For i := 1 to RANGE do
begin
inc(delta);
if isprime(i+MAX_OFFSET) then
Begin
IncNum(NumSum,delta);
delta := 0;
if isprime(NumSum.dgtSum[0]) then
begin
cnt +=1;

dec(nr);
write(NumSum.num:RowWidth);
if nr = 0 then
begin
writeln;
nr := NextRowCnt;
end;

end;
end;
end;
writeln(#10,cnt,' additive primes found.');
END.
</lang>
{{out}}
<pre>
2 3 5 7 11 23 29 41 43 47 61 67 83 89 101 113 131 137
139 151 157 173 179 191 193 197 199 223 227 229 241 263 269 281 283 311
313 317 331 337 353 359 373 379 397 401 409 421 443 449 461 463 467 487

54 additive primes found.</pre>
=={{header|Perl}}==
=={{header|Perl}}==
{{libheader|ntheory}}
{{libheader|ntheory}}