93 lines
1.6 KiB
Text
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.
|