RosettaCodeData/Task/Jacobi-symbol/JavaScript/jacobi-symbol.js

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();