RosettaCodeData/Task/AKS-test-for-primes/Pascal/aks-test-for-primes.pascal
2019-09-12 10:33:56 -07:00

93 lines
1.6 KiB
Text

const
pasTriMax = 61;
type
TPasTri = array[0 .. pasTriMax] of UInt64;
var
pasTri: TPasTri;
procedure PascalTriangle(n: LongWord);
// Calculate the n'th line 0.. middle
var
j, k: LongWord;
begin
pasTri[0] := 1;
j := 1;
while j <= n do
begin
Inc(j);
k := j div 2;
pasTri[k] := pasTri[k - 1];
for k := k downto 1 do
Inc(pasTri[k], pasTri[k - 1]);
end;
end;
function IsPrime(n: LongWord): Boolean;
var
i: Integer;
begin
if n > pasTriMax then
begin
WriteLn(n, ' is out of range');
Halt;
end;
PascalTriangle(n);
Result := true;
i := n div 2;
while Result and (i > 1) do
begin
Result := Result and (pasTri[i] mod n = 0);
Dec(i);
end;
end;
procedure ExpandPoly(n: LongWord);
const
Vz: array[Boolean] of Char = ('+', '-');
var
j: LongWord;
bVz: Boolean;
begin
if n > pasTriMax then
begin
WriteLn(n,' is out of range');
Halt;
end;
case n of
0: WriteLn('(x-1)^0 = 1');
1: WriteLn('(x-1)^1 = x-1');
else
PascalTriangle(n);
Write('(x-1)^', n, ' = ');
Write('x^', n);
bVz := true;
for j := n - 1 downto n div 2 + 1 do
begin
Write(vz[bVz], pasTri[n - j], '*x^', j);
bVz := not bVz;
end;
for j := n div 2 downto 2 do
begin
Write(vz[bVz], pasTri[j], '*x^', j);
bVz := not bVz;
end;
Write(vz[bVz], pasTri[1], '*x');
bVz := not bVz;
WriteLn(vz[bVz], pasTri[0]);
end;
end;
var
n: LongWord;
begin
for n := 0 to 9 do
ExpandPoly(n);
for n := 2 to pasTriMax do
if IsPrime(n) then
Write(n:3);
WriteLn;
end.