Come, per esempio, è fatto il file esterno
del WebWorker. Lo conservo qui per ricrearlo se
andasse perso.
//
// Un altro semplice WebWorker (n.1a) :
// Ce ne sono vari altri simili con
// solo piccole differenze ma qui
// faccio un calcolo impegnativo ossia
// trovare le radici primitive
// di uno dei numeri primi scelti ed
// elencati qui ( la ricerca con i grossi
// primi puo' durare ad ogni passo varie
// ore o forse giorni )
//
var $listaprimi=[65537,59029,78121,700001,
900001,10000019,20000003,30000001,
600000001,700000001,6000000001,
7000000001,9000000001,40000000000001];
//
var $ricevuto=0,$nunc,$attesa=150;
var $ampio=5,$dai=2,$nquanti=12,$ogni=10000000;
//
// Riceve il messaggio e lo applica...
//
onmessage=function(eccoqua){
var eccolo,adattato,scelto,inirp;
eccolo=parseInt(eccoqua.data);
if(isNaN(eccolo)){adattato=2;}
else{adattato=Math.max(1,eccolo);}
scelto=adattato%1000;
inirp=(adattato-scelto)/1000;
$ricevuto=scelto%$listaprimi.length;
$dai=2+Math.min(inirp,Math.round(
$listaprimi[$ricevuto]/10) );
// Se il primo e' grosso potrebbe
// metterci ore a calcolare qualche
// radice primitiva...
postMessage("Ecco quale primo uso "+
$listaprimi[$ricevuto]);
};
//
function $lavoro(){
var k,n=20,data=new Date();
var ss="???:"+$ricevuto;
if(isNaN($ricevuto))$ricevuto=4;
if($ricevuto>0){$attesa=500;
$nunc=data.getTime();
$ricevuto=$ricevuto%$listaprimi.length;
ss=[$ricevuto," Ora: "+$nunc,
" Cerca Radici Primitive del "+
$listaprimi[$ricevuto]+" !(n.1a)"];
postMessage(ss);
//
// Da ora lavora soltanto
// la funzione $trovaradprim()
//
setTimeout("$trovaradprim()",$attesa);
return true;
}
else { postMessage(ss); $ricevuto=1; }
setTimeout("$lavoro()",$attesa);}
//
// All'avviamento del WebWorker viene
// lanciata questa funzione:
//
$lavoro();
//
// Questa funzione serve per trovare molte
// radici primitive ripetendo il calcolo
// innumerevoli volte.
//
function $trovaradprim(){
//
// Dopo avere trovato varie radici
// primitive manda il messaggio .
var quale,primo,elenco=["NonFatto!",0];
quale=Math.max(1,Math.round($ricevuto)
)%$listaprimi.length;
if(isNaN(quale))quale=1;
primo=$listaprimi[quale];
//
// La wai e' quella che veramente
// fa la ricerca...
//
elenco=$wai(primo,$nquanti);
postMessage([primo,elenco[0],
"\u003cbr/\u003e FINE avendo ricevuto "+
$ricevuto," in data "+$nunc,elenco ]);
//
// ripete la ricerca
//
setTimeout("$trovaradprim()",$attesa);
}
//
// Per segnalare che sta lavorando
//
var $segnalo=function(n){
if(n%$ogni==0)postMessage("Ora fa: "+n+
"| "+$dai+" Ha ricevuto: "+$ricevuto);
}
//
// Prodotto di due interi... se il primo
// p ed i due interi sono piccoli.
//
var $pmod_classico=function(a,b,p){
return (a*b)%p}
//
// prodotto di due GRANDI interi ed
// usando un primo p molto GRANDE.
//
var $pmod=function(a,b,p){
var k,na,nn,nr,rs;
na=Math.round(Math.abs(a))%p;
rs=na%100;
nn=Math.round(Math.abs(b))%p;
nr=(rs*nn)%p;
for(k=0;9>k;k++){
na=(na-rs)/100;
rs=na%100;nn=(100*nn)%p;
nr=(nr+(rs*nn)%p)%p;}
return nr;}
//
// Questa e' la funzione che cerca un
// certo numero ossia al massimo quante
// ci sono di radici primitive .
// Il calcolo fatto in questo modo e'
// molto inefficiente ma appunto per
// questo serve a mettere alla prova
// il metodo del WebWorker che evita
// di bloccare il browser ed il PC.
//
var $wai=function(numero,quante){
var xradpri=function(nu,tot,rini){
var k,h,n,kk,xrp;
var rr=[" Numero: "+nu+" "];
for(h=0;tot>h;h++){n=0;
xrp=h+rini;
kk=1;
for(k=0;nu>k;k++){
kk=$pmod(xrp,kk,nu);
$segnalo(k);
n++;if(2>kk)break};
n++;
if(n==nu)rr[rr.length]=[xrp,
n+" "];}
return rr;}
var qui;
$dai=2+($dai+98)%numero;
qui="In_$wai ("+$dai+") : "+
xradpri(numero,quante,$dai);
return [qui,0]}
//