Parallel calculations: Difference between revisions

Content deleted Content added
m omissions
Added JavaScript version -- uses web workers
Line 536: Line 536:
12878893 -> [47 274019]
12878893 -> [47 274019]
</pre>
</pre>

=={{header|JavaScript}}==
This code demonstrates Web Workers. This should work on current versions of Firefox, Safari, Chrome and Opera.

This first portion should be placed in a file called "parallel_worker.js". This file contains the logic used by every worker created.
<lang javascript>
var onmessage = function(event) {
postMessage({"n" : event.data.n,
"factors" : factor(event.data.n),
"id" : event.data.id});
};

function factor(n) {
var factors = [];
for(p = 2; p <= n; p++) {
if((n % p) == 0) {
factors[factors.length] = p;
n /= p;
}
}
return factors;
}
</lang>

This portion appends each of the numbers with their factors as the results arrive into an html tag with the id "result". Once the final worker completes its task (worker_count is reduced to 0), the reduce function is called to determine which number is the answer.
<lang javascript>
var numbers = [12757923, 12878611, 12757923, 15808973, 15780709, 197622519];
var workers = [];
var worker_count = 0;

var results = [];

for(var i = 0; i < numbers.length; i++) {
worker_count++;
workers[i] = new Worker("parallel_worker.js");
workers[i].onmessage = accumulate;
workers[i].postMessage({n: numbers[i], id: i});
}

function accumulate(event) {
n = event.data.n;
factors = event.data.factors;
id = event.data.id;
result = document.getElementById("result");
ne = document.createElement("p");
ne.appendChild(document.createTextNode(n + " : " + factors));
result.appendChild(ne);
results[id] = {n:n, factors:factors};
// Cleanup - kill the worker and countdown until all work is done
workers[id].terminate();
worker_count--;
if(worker_count == 0)
reduce();
}

function reduce() {
answer = 0;
for(i = 1; i < results.length; i++) {
min = results[i].factors[0];
largest_min = results[answer].factors[0];
if(min > largest_min)
answer = i;
}
n = results[answer].n;
factors = results[answer].factors;
result = document.getElementById("result");
ne = document.createElement("p");
ne.appendChild(document.createTextNode("The number with the relatively largest factors is: " + n + " : " + factors));
result.appendChild(ne);
results[id] = {n:n, factors:factors};

}

</lang>
=={{header|Perl 6}}==
=={{header|Perl 6}}==
Assuming that <tt>factors</tt> is defined exactly as in the prime decomposition task:
Assuming that <tt>factors</tt> is defined exactly as in the prime decomposition task: