7 agosto 2011

javascript numeri primi

Indice dei tutorials: http://gheryd.blogspot.com/2011/06/javascript-gwt-tutorials.html

Utilizzando un semplice script ho implementato qualcosa di simile al Crivello di Eratostene per determinare i numeri primi fino ad un certo numero.
Questo semplice esempio ci consentirà poi di fare qualche analisi su come ottimizzare le performance di esecuzione.

Per eseguirlo basta copiare il contenuto del box in un file .html e aprirlo con il browser.

Eccovi quello che dovrebbe comparire:



<html>
<head>
<script type="text/javascript">

var primes;
function onClickHandler() {
    var startTime = (new Date()).getTime();
    primes = [2];
    var n = parseInt( document.getElementById("endN").value );
    if(isNaN(n)) {
       alert("Is not a number!");
       return;
    }
    var tbody = document.createElement("tbody");
    var tr = document.createElement("tr");
    tbody.appendChild(tr);
    for(var i=1; i<=n; i++) {
       if( i%10==1 ){
          tr = document.createElement("tr");
          tbody.appendChild(tr);
       }
       var td = document.createElement("td");
       td.appendChild( document.createTextNode(i) );
       td.style.border = "1px solid gray";
       if( isPrimeNumber(i) )
           td.style.backgroundColor = "magenta";
       tr.appendChild(td);
    }
    var table = document.createElement("table");
    table.setAttribute("cellPadding", "5");
    table.appendChild(tbody);
    var container = document.getElementById("container");
    container.innerHTML = "";
    container.appendChild(document.createTextNode("trovati: "+primes.length));
    container.appendChild(document.createTextNode(" tempo [s]: "+((new Date()).getTime()-startTime)/1000  ) );
    container.appendChild(table);
}

function isPrimeNumber(n) {
    if(n==2) return true;
    else if(n==1 || n%2==0) return false;
    for(var j=0; j<primes.length; j++)
        if( n%primes[j]==0 ) return false;
    primes.push(n);
    return true;
}

</script>
</head>
<body>
   <input id="endN" name="endN"  type="text" type="text" />
   <br/>
   <button onclick="onClickHandler()">search</button>
   <div id="container"></div>
</body>
</html>

Spiegazione.
Sulla funzione "onClickHandler" viene creata una tabella. Successivamente la tabella viene popolata con i numeri interi positivi fino alla cifra indicata nella textbox.
Con la funzione "isPrimeNumber" viene verificato se il numero è primo, in tal caso alla cella che viene aggiunto uno sfondo viola per evidenziare questa caratteristica.
Nella funzione "isPrimeNumber", man mano che viene richiamata, viene aggiunto nella variabile array "primes" l'eventuale numero primo.


Ottimizzazione.
Se si esegue lo script per numeri molto alti (per esempio un milione), i tempi di esecuzione potrebbe essere piuttosto lunghi.
E' possibile ottimizzare i tempi di esecuzione dello script con un controllo all'interno del ciclo che crea le celle della tabella. Infatti si potrebbe aggiungere una variabile contatore che viene azzerata quando raggiunge il valore 10. Quando la variabile assume i valori 2,4,5,6,8,10 sicuramente il numero non è primo, quindi è inutile chiamare la funzione isPrimeNumber che esegue ogni volta un ciclo su tutti i numeri primi.
Chiaramente questo controllo non deve essere fatto al primo giro. Ecco un esempio:

var c = 1;
for(var i=1; i<=n; i++) {
    ...
    var isPrime = (c!=i && (c%2==0 || c==5)) || isPrimeNumber(i);
    if(c==10) c = 1; else c++;
    if( isPrime )
           td.style.backgroundColor = "magenta";
    tr.appendChild(td);
}

1 agosto 2011

UBUNTU 11.04 wireless disabled

english version

Recentemente mi è capitato di avere disattivata la scheda wireless.
Ho provato con il comando:

gheryd@gheryd:~$ sudo ifconfig wlan0 up

e mi è comparso un messaggio di errore che indicava un blocco rfkill.
Cercando su web ho trovato informazioni su questo pagina:
http://linuxwireless.org/en/users/Documentation/rfkill

Quindi ho verificato che esisteva un blocco software tramite il seguente comando
gheryd@gheryd:~$ rfkill list

Questo comando vi elenca lo stato dei blocchi su vari dispositivi (wireless, bluetooth, etc).
Per esempio se avete disabilitato la scheda wireless tramite l'apposito tasto sul vostro computer vi verrà segnalato un "hard blocked: yes", se invece è stata disabilitata via software vi verrà segnalato "soft blocked: yes".
Nel mio caso la wireless avevo un blocco software, per ripristinare ho effettuato il comando
gheryd@gheryd:~$ rfkill unblock all
Poi ho riavviato la scheda wireless
gheryd@gheryd:~$ sudo ifconfig wlan0 up