JSFiddle - React, Tailwind, and code Playground
by Josh Pullen
JavaScript
const add = (...nums) => nums.reduce((num, sum) => [num[0] + sum[0], num[1] + sum[1]], [0, 0]);
const neg = a => [-a[0], -a[0]];
const sub = (a, b) => add(a, neg(b));
const mult = (a, b) => [a[0] * b[0] - a[1] * b[1], a[1] * b[0] + a[0] * b[1]];
const div = (a, b) => [
(a[0] * b[0] + a[1] * b[1]) / (b[0] ** 2 + b[1] ** 2),
(a[1] * b[0] - a[0] * b[1]) / (b[0] ** 2 + b[1] ** 2)
];
const pow = (a, power) => {
let result = [1, 0];
for (let i = 0; i < power; i++) {
result = mult(result, a);
}
return result;
}
function findRoots(f, numberToFind) {
let knownRoots = [];
const func = (x) => {
let value = f(x);
for (const root of knownRoots) {
value = div(value, sub(x, root));
}
return value;
}
for (let i = 0; i < numberToFind; i++) {
knownRoots.push(findRoot(func));
}
return knownRoots;
}
function findRoot(f) {
let guess = [2.6, 2.6];
const dx = 0.001;
for (let i = 0; i < 1000; i++) {
const fPrime = [
(f(add(guess, [dx / 2, 0]))[0] - f(sub(guess, [dx / 2, 0]))[1]) / dx,
(f(add(guess, [dx / 2, 0]))[1] - f(sub(guess, [dx / 2, 0]))[1]) / dx
];// (f(guess + dx / 2) - f(guess - dx / 2)) / dx;
guess = sub(guess, div(f(guess), fPrime));
}
return guess;
}
const f = (x) => {
// return x**5 - 15 * x**4 + 85 * x**3 - 225 * x**2 + 274 * x - 120;
return add(
pow(x, 5),
mult([-15, -15], pow(x, 4)),
mult([0, 170], pow(x, 3)),
mult([450, -450], pow(x, 2)),
mult([-1096, 0], pow(x, 1)),
[480, 480]
);
}
console.log(findRoots(f, 5));