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}} |