Alle Zerlegungen x = m² + n² mit n ≥ m bestimmen (Dimension = 1/8 r2(x), für x = ungerade) Das ist zeitintensiv: ca 200ms für x ≈ 9e15.
// Webworker-script: getestet bis x = 1e6 durch Vergleich mir r2
function decomp_2(x) { // alle Zerlegungen x = m^2 + n^2, mit n >= m,
let da = [];
if ((x % 4) == 3 || (x % 8) == 6) return da; // keine Zerlegung: x (8) = 3,6,7
for (let m=0; m <= Math.sqrt(x/2); m++) {
let n = Math.sqrt(x-m*m);
if (Number.isInteger(n)) da.push([m,n]);
}
return da;
}
Da man direkt keine Parameter an WW übergeben kann, wird diese Funktion
im Webworker-script "decomp_worker.js" gestartet mit
onmessage = function(e) {
let res = decomp_2(e.data);
postMessage(res);
}
Auf der HTML-Seite lautet der Code für 10 parallel gestartete WW
for (let n=0; n < 10; n++) { // worker laufen parallel!
let x = Math.floor(Math.random()*Number.MAX_SAFE_INTEGER);
let w = new Worker("decomp_worker.js");
w.onmessage = function(event){ // worker fertig
let da = event.data; // die result-Arrays auswerten
....
w.terminate();
};
w.postMessage(x);
}