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: |