53 lines
1.0 KiB
JavaScript
53 lines
1.0 KiB
JavaScript
function jacobi(n, k) {
|
|
if (k <= 0 || k % 2 !== 1) {
|
|
throw new Error("k must be positive and odd");
|
|
}
|
|
n %= k;
|
|
let t = 1;
|
|
while (n !== 0) {
|
|
while (n % 2 === 0) {
|
|
n /= 2;
|
|
const r = k % 8;
|
|
if (r === 3 || r === 5) {
|
|
t = -t;
|
|
}
|
|
}
|
|
[n, k] = [k, n]; // Swap n and k
|
|
if (n % 4 === 3 && k % 4 === 3) {
|
|
t = -t;
|
|
}
|
|
n %= k;
|
|
}
|
|
return k === 1 ? t : 0;
|
|
}
|
|
|
|
function print_table(out, kmax, nmax) {
|
|
let header = "n\\k|";
|
|
for (let k = 0; k <= kmax; ++k) {
|
|
header += " " + k.toString().padStart(2, ' ');
|
|
}
|
|
out.push(header);
|
|
|
|
let separator = "----";
|
|
for (let k = 0; k <= kmax; ++k) {
|
|
separator += "---";
|
|
}
|
|
out.push(separator);
|
|
|
|
for (let n = 1; n <= nmax; n += 2) {
|
|
let row = n.toString().padStart(2, ' ') + " |";
|
|
for (let k = 0; k <= kmax; ++k) {
|
|
row += " " + jacobi(k, n).toString().padStart(2, ' ');
|
|
}
|
|
out.push(row);
|
|
}
|
|
}
|
|
|
|
function main() {
|
|
const output = [];
|
|
print_table(output, 20, 21);
|
|
output.forEach(line => console.log(line));
|
|
}
|
|
|
|
main();
|