RosettaCodeData/Task/Jacobi-symbol/PascalABC.NET/jacobi-symbol.pas

35 lines
651 B
ObjectPascal

function jacobi(n, k: integer): integer;
begin
assert((k > 0) and (k mod 2 = 1));
n := n mod k;
result := 1;
while n <> 0 do
begin
while n mod 2 = 0 do
begin
n := n shr 1;
if (k and 7) in [3, 5] then
result := -result;
end;
swap(n, k);
if ((n and 3) = 3) and ((k and 3) = 3) then
result := -result;
n := n mod k;
end;
if k <> 1 then result := 0;
end;
begin
write('n/k|');
for var n := 1 to 20 do write(n:3);
writeln(#10, '—' * 64);
for var k := 1 to 21 step 2 do
begin
write(k:2, ' |');
for var n := 1 to 20 do
write(jacobi(n, k):3);
writeln;
end;
end.