RosettaCodeData/Task/AKS-test-for-primes/Pascal/aks-test-for-primes.pascal

94 lines
1.6 KiB
Text
Raw Permalink Normal View History

2015-02-20 09:02:09 -05:00
const
pasTriMax = 61;
2019-09-12 10:33:56 -07:00
2015-02-20 09:02:09 -05:00
type
2019-09-12 10:33:56 -07:00
TPasTri = array[0 .. pasTriMax] of UInt64;
2015-02-20 09:02:09 -05:00
var
2019-09-12 10:33:56 -07:00
pasTri: TPasTri;
2015-02-20 09:02:09 -05:00
2019-09-12 10:33:56 -07:00
procedure PascalTriangle(n: LongWord);
// Calculate the n'th line 0.. middle
2015-02-20 09:02:09 -05:00
var
2019-09-12 10:33:56 -07:00
j, k: LongWord;
2015-02-20 09:02:09 -05:00
begin
pasTri[0] := 1;
j := 1;
2019-09-12 10:33:56 -07:00
while j <= n do
2015-02-20 09:02:09 -05:00
begin
2019-09-12 10:33:56 -07:00
Inc(j);
k := j div 2;
pasTri[k] := pasTri[k - 1];
for k := k downto 1 do
Inc(pasTri[k], pasTri[k - 1]);
2015-02-20 09:02:09 -05:00
end;
end;
2019-09-12 10:33:56 -07:00
function IsPrime(n: LongWord): Boolean;
2015-02-20 09:02:09 -05:00
var
2019-09-12 10:33:56 -07:00
i: Integer;
begin
if n > pasTriMax then
2015-02-20 09:02:09 -05:00
begin
2019-09-12 10:33:56 -07:00
WriteLn(n, ' is out of range');
Halt;
2015-02-20 09:02:09 -05:00
end;
2019-09-12 10:33:56 -07:00
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);
2015-02-20 09:02:09 -05:00
end;
end;
2019-09-12 10:33:56 -07:00
procedure ExpandPoly(n: LongWord);
2015-02-20 09:02:09 -05:00
const
2019-09-12 10:33:56 -07:00
Vz: array[Boolean] of Char = ('+', '-');
2015-02-20 09:02:09 -05:00
var
2019-09-12 10:33:56 -07:00
j: LongWord;
2015-02-20 09:02:09 -05:00
bVz: Boolean;
2019-09-12 10:33:56 -07:00
begin
if n > pasTriMax then
2015-02-20 09:02:09 -05:00
begin
2019-09-12 10:33:56 -07:00
WriteLn(n,' is out of range');
Halt;
2015-02-20 09:02:09 -05:00
end;
2019-09-12 10:33:56 -07:00
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]);
2015-02-20 09:02:09 -05:00
end;
end;
var
n: LongWord;
2019-09-12 10:33:56 -07:00
begin
for n := 0 to 9 do
2015-02-20 09:02:09 -05:00
ExpandPoly(n);
2019-09-12 10:33:56 -07:00
for n := 2 to pasTriMax do
if IsPrime(n) then
Write(n:3);
WriteLn;
2015-02-20 09:02:09 -05:00
end.