In rete: http://www.elegio.it/doc/tn/lumodulare.html
Oltre che come pagina curiosa di un tizio piuttosto originale che scarica molte cose qui, http://www.elegio.it/max/ e gioca col calcolo tensoriale che piaceva a Bruno Finzi ma ora a chi oltre che a me ? http://www.elegio.it/doc/finzipastori/ ... oltre che pagina folcloristica forse questa pagina potrebbe essere utilizzabile come pagina di test delle prestazioni di calcolo di un PC o per confronto tra le capacità di calcolo numerico dei browser tipo Firefox, Chrome, Safari, Internet Explorer, Opera.... o come suggerimento per combattere, con la crittografia, gli asfissianti spioni armati di informatica.
Applicazione dell'algoritmo di Euclide
In Javascript:
function inversamod(a,bprimo){ var p,d,t,q; var x=0,y=1,z=0,v=1,w=0; p=Math.round(Math.abs(bprimo)); t=p; d=Math.round(Math.abs(a))%p; while(t!=0){ z=d%t; q=(d-z)/t; d=t; t=z; z=x; x=v-q*x; v=z; z=y; y=w-q*y; w=z; } return [d,(v+p)%p,w]; }Tradotto in Maximese:
inversamod(a,bprimo):= block([i,p,d,t,q, x:0,y:1,z:0,v:1,w:0], p:abs(bprimo), t:p,d:mod(abs(a),p), for i:1 while is(notequal(t,0)) do(z:mod(d,t), q:(d-z)/t,d:t,t:z, z:x,x:v-q*x,v:z, z:y,y:w-q*y,w:z), return ([d,mod(v+p,p),w]))$Soluzione di un sistema di equazioni lineari
Risolve un sistema lineare a 3 ( o più... mooolto di più ) incognite creato con la funzioneMath.random()
e del quale non è garantita la risolvibilità ( la matrice potrebbe essere, per caso singolare anche se la probabilità che lo sia è molto bassa ) ossia un piccolo sistema di ordine tre per evidenziare le regole di costruzione della matrice del sistema e come specificare il termine noto e che argomenti passare alla funzione che calcola la LU ( la matrice del sistema espressa come prodotto di due matrici, la Lower ossia la triangolare inferiore e la Upper ossia la triangolare superiore ) e alla funzione che la usa....Javascript non abilitato...
Notare gli zeri del vettore che contiene la matrice i cui indici sono sempre positivi per cui la colonna e la riga zero sono dati non appartenenti alla matrice ed usabili come memoria di servizio.
...Javascript non abilitato...
...Javascript non abilitato...
...Javascript non abilitato...
...Javascript non abilitato...
Anche il termine noto è stato generato usando la function
Math.random()
...Javascript non abilitato...
...Javascript non abilitato...
Ecco il test decisivo: il prodotto della matrice per il vettore soluzione trovato deve essere coincidente, a meno di errori di troncamento, col termine noto assegnato.
...Javascript non abilitato...
Per esaminare un altro sistema basta ricaricare questa pagina dato che la matrice e il termine noto sono generati in modo casuale. Oppure usare il form qua sotto, di specifica dell'ordine voluto.
Fare attenzione che cercando soluzioni di sistemi lineari enormi, di ordine 1000 ( mille incognite ed un milione di elementi di matrice, mica uno scherzo...) ed osando assegnare l'ordine 1000, la routine blocca il sistema fino a quando non ha terminato il calcolo ! Il browser allora chiede se deve andare avanti a valutare lo script ma, per quanto ho visto... prima o poi il calcolo termina.
La pesantezza del calcolo ossia la sua durata è proporzionale al cubo dell'ordine del sistema per cui usando, per esempio, 2000 come ordine la matrice contiene quattro milioni di elementi e la durata è circa otto volte maggiore del calcolo di un sistema di ordine 1000.
Notare che io sono veramente riuscito a vedere sul mio PC casalingo il vettore risultato di un sistema ciclopico di ordine 2000 calcolato addirittura con un linguaggio interpretato, non compilato ossia Javascript, concepito per ben altri scopi che quello di fare supercalcolo... Per ora non ho osato di più ma quanto sono lontani i tempi della mia giovinezza quando, per riuscire a trovare la soluzione di un sistema di 2000 equazioni occorreva un SUPERCALCOLATORE e rischiavo di farmi maledire dai gestori del centro calcolo ( non pagando le ore di calcolo essendo dipendente del centro calcolo stesso... http://www.cilea.it/).
Soluzione di un sistema di equazioni lineari modulo un numero primo
Per trovare adeguati numeri primi basta installarsi sul PC il programma Maxima ( vedere http://www.elegio.it/max/ o acquistare il programma Mathematica o Maple etc.. ). Qui uso un numero primo vicino al milione ossia 999983 e, per i vincoli imposti dall'uso di Javascript che non sa gestire come veri interi i numeri un po' maggiori di un milione di miliardi è consigliabile non usare numeri primi maggiori di 10 milioni perché i calcoli fanno uso di quadrati che, appunto, per i limiti di Javascript, rischierebbero di fare tracimazione.
...Javascript non abilitato...
Notare gli zeri del vettore che contiene la matrice i cui indici sono sempre positivi per cui la colonna e la riga zero sono dati non appartenenti alla matrice ed usabili come memoria di servizio.
...Javascript non abilitato...
...Javascript non abilitato...
Notare che non è garantito che la matrice, generata a caso, non sia singolare. La probabilità è almeno l'inverso del numero primo usato e legata all'ordine del sistema lineare per cui se si usa un numero primo piccolo la probabilià diventa alta... Questo, tuttavia, ai fini pratici/crittografici, non rappresenta un grosso problema: basta avere un generatore di matrici, concordato tra chi cripta e chi è il voluto decrittatore, e saltare quella che viene riconosciuta singolare......Javascript non abilitato...
...Javascript non abilitato...
Anche il termine noto è stato generato usando la function
Math.random()
...Javascript non abilitato...
...Javascript non abilitato...
Ecco il test decisivo: il prodotto della matrice per il vettore soluzione trovato deve essere ESATTAMENTE coincidente col termine noto assegnato.
...Javascript non abilitato...
Questa parte ha interesse in crittografia....
Supponiamo di avere un vettore costituito dalle cifre UNICODE ( http://it.wikipedia.org/wiki/Unicode ) di un dato documento. Se moltiplichiamo questo vettore per una matrice di interi lavorando in algebra modulare otteniamo un vettore risultato assolutamente incomprensibile ma se, conoscendo la matrice che è stata usata risolviamo il sistema usando come termine noto il misterioso vettore otteniamo il vettore di partenza ossia i caratteri del documento scritto in UNICODE ( http://www.elegio.it/calcolatrice/archivio-utili-201308.html#n004 ) .
Ovviamente per applicare concretamente le
function Javascript
contenute in questo documento bisogna curare vari dettagli IMPORTANTI del metodo ossia, evitare di generare casualmente caratteri proibiti in HTML ossia il carattere<
di inizio marca, il carattere>
di fine marca e il carattere&
che ha funzioni varie, in particolare per specificare i codici UNICODE.Poi, ovviamente, sarebbe consigliabile e prudente non dare nell'occhio generando sequenze di caratteri che, vistosamente, segnalano la presenza di parti criptate nel documento. Ma questo argomento, la http://it.wikipedia.org/wiki/Steganografia è un argomento che va trattato ed approfondito a parte...
Qualche sperimentazione del solutore di sistemi in algebra modulare
Indirizzi utili ( si fa per dire )
http://www.elegio.it/doc/ Varie cose...
http://www.elegio.it/doc/tn/ La crittografia del pierino ... forse non troppo tonto ( o dummy )
http://www.elegio.it/doc/tn/metodo-lineare-congruente.html
http://www.elegio.it/doc/tridia/sorgenti/alin_libesterna(operativa).txt
Una libreria che vorrei migliorare ma, già ora insegna qualcosa su quello che può fare lo snobbato linguaggio Javascript ( molta gente non sa quello che dice ) in ambito matematico-numerico.
Notare che questa libreria è utilizzabile da chiunque su internet semplicemente scrivendo
<script type="text/javascript" src="http://www.elegio.it/doc/tridia/sorgenti/alin_libesterna(operativa).txt" > </script>
e naturalmente può ricopiarsi il file ed usarlo gratis e comodamente senza bisogno di stare collegato in rete.