// // Un altro semplice WebWorker (n.5) : // 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; // onmessage=function(eccoqua){ var eccolo; eccolo=eccoqua.data; if(isNaN(eccolo)){$ricevuto=2;} else{$ricevuto=eccolo; if(1>$ricevuto)$ricevuto=1;} $ricevuto=$ricevuto%$listaprimi.length; // 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.5)"]; 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]} //