Data commit
This commit is contained in:
parent
7387c8f97b
commit
cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions
127
Task/Prime-conspiracy/Pascal/prime-conspiracy.pas
Normal file
127
Task/Prime-conspiracy/Pascal/prime-conspiracy.pas
Normal file
|
|
@ -0,0 +1,127 @@
|
|||
program primCons;
|
||||
{$IFNDEF FPC}
|
||||
{$APPTYPE CONSOLE}
|
||||
{$ENDIF}
|
||||
const
|
||||
PrimeLimit = 2038074748 DIV 2;
|
||||
type
|
||||
tLimit = 0..PrimeLimit;
|
||||
tCntTransition = array[0..9,0..9] of NativeInt;
|
||||
tCntTransRec = record
|
||||
CTR_CntTrans:tCntTransition;
|
||||
CTR_primCnt,
|
||||
CTR_Limit : NativeInt;
|
||||
end;
|
||||
tCntTransRecField = array[0..19] of tCntTransRec;
|
||||
var
|
||||
primes: array [tLimit] of boolean;
|
||||
CntTransitions : tCntTransRecField;
|
||||
|
||||
procedure SieveSmall;
|
||||
//sieve of eratosthenes with only odd numbers
|
||||
var
|
||||
i,j,p: NativeInt;
|
||||
Begin
|
||||
FillChar(primes[1],SizeOF(primes),chr(ord(true)));
|
||||
i := 1;
|
||||
p := 3;
|
||||
j := i*(i+1)*2;
|
||||
repeat
|
||||
IF (primes[i]) then
|
||||
begin
|
||||
p := i+i+1;
|
||||
repeat
|
||||
primes[j] := false;
|
||||
inc(j,p);
|
||||
until j > PrimeLimit;
|
||||
end;
|
||||
inc(i);
|
||||
j := i*(i+1)*2;//position of i*i
|
||||
IF PrimeLimit < j then
|
||||
BREAK;
|
||||
until false;
|
||||
end;
|
||||
|
||||
procedure OutputTransitions(const Trs:tCntTransRecField);
|
||||
var
|
||||
i,j,k,res,cnt: NativeInt;
|
||||
ThereWasOutput: boolean;
|
||||
Begin
|
||||
cnt := 0;
|
||||
while Trs[cnt].CTR_primCnt > 0 do
|
||||
inc(cnt);
|
||||
dec(cnt);
|
||||
IF cnt < 0 then
|
||||
EXIT;
|
||||
|
||||
write('PrimCnt ');
|
||||
For i := 0 to cnt do
|
||||
write(Trs[i].CTR_primCnt:i+7);
|
||||
writeln;
|
||||
For i := 0 to 9 do
|
||||
Begin
|
||||
ThereWasOutput := false;
|
||||
For j := 0 to 9 do
|
||||
Begin
|
||||
res := Trs[0].CTR_CntTrans[i,j];
|
||||
IF res > 0 then
|
||||
Begin
|
||||
ThereWasOutput := true;
|
||||
write('''',i,'''->''',j,'''');
|
||||
For k := 0 to cnt do
|
||||
Begin
|
||||
res := Trs[k].CTR_CntTrans[i,j];
|
||||
write(res/Trs[k].CTR_primCnt*100:k+6:k+2,'%');
|
||||
end;
|
||||
writeln;
|
||||
end;
|
||||
end;
|
||||
IF ThereWasOutput then
|
||||
writeln;
|
||||
end;
|
||||
end;
|
||||
|
||||
var
|
||||
pCntTransOld,
|
||||
pCntTransNew : ^tCntTransRec;
|
||||
i,primCnt,lmt : NativeInt;
|
||||
prvChr,
|
||||
nxtChr : NativeInt;
|
||||
Begin
|
||||
SieveSmall;
|
||||
pCntTransOld := @CntTransitions[0].CTR_CntTrans;
|
||||
|
||||
|
||||
pCntTransOld^.CTR_CntTrans[2,3]:= 1;
|
||||
lmt := 10*1000;
|
||||
|
||||
//starting at 2 *2+1 => 5
|
||||
primCnt := 2; // the prime 2,3
|
||||
prvChr := 3;
|
||||
nxtChr := prvChr;
|
||||
for i:= 2 to PrimeLimit do
|
||||
Begin
|
||||
inc(nxtChr,2);
|
||||
if nxtChr >= 10 then nxtChr := 1;
|
||||
IF primes[i] then
|
||||
Begin
|
||||
inc(pCntTransOld^.CTR_CntTrans[prvChr][nxtChr]);
|
||||
inc(primCnt);
|
||||
prvchr := nxtChr;
|
||||
IF primCnt >= lmt then
|
||||
Begin
|
||||
with pCntTransOld^ do Begin
|
||||
CTR_Limit := i;
|
||||
CTR_primCnt := primCnt;
|
||||
end;
|
||||
pCntTransNew := pCntTransOld;
|
||||
inc(pCntTransNew);
|
||||
pCntTransNew^:= pCntTransOld^;
|
||||
pCntTransOld := pCntTransNew;
|
||||
lmt := lmt*10;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
pCntTransOld^.CTR_primCnt := 0;
|
||||
OutputTransitions(CntTransitions);
|
||||
end.
|
||||
Loading…
Add table
Add a link
Reference in a new issue