Scientific Calculator
Giordano/FunzioniBase
Funzioni di linguaggio e di base
// 07/03/2020
//funzioni utili per il debug
var (global:strhelp,global:numhelp,global:flaghelp)=["",0,false];
display=function(x,titolo){confirm(string(x),titolo)};
debug=function(str){
if flaghelp ->(if (numhelp==50) -> clrdebug();
str==null ? strhelp : (numhelp+=1;strhelp=concat(strhelp,"-",str)))};
clrdebug=function(){strhelp="";numhelp=0};
debugon=function(){flaghelp=true};
debugoff=function(){flaghelp=false};
vertype=function(x,typ,val) {system:type(x)==typ ? x :val};
// il parametro è una matrice nx2: la prima colonna contiene le condizioni booleane per cui
// se vere viene eseguita ls funzione corrispondente(2 colonna).
// esegue la funzione corrispondente alla prima condizione vera.
// se nessuna condizione è vera il risultato è "null".
// le funzioni non hanno parametri.
// il risultato è quello della funzione eseguita.
// se l' ultima condizione booleana è "true", l' ultima funzione è eseguita
// se tutte le alre sono false.
CASE=function(matrixbooleanfunction){
var BF=clone(matrixbooleanfunction);
var (f,bf)=[true,[true,null]];
while (f and((bf=shift(BF)) != null)) ->f=not bf[0];
bf[1]()};
// restrizione di parametri
// sia F=F(a,b,c,d)
// BIND(F,[x,null,null,y],g,h,l)
// chiama la funzione F(x,g,h,y)
BIND=function(F,lst,a,b,c){
var ld = [a,b,c];
var rs=map(x-> (x==null) ? shift(ld) : x,lst);
var (a,b,c,d,e,f)= rs;
[F(a,b,c,d,e,f),rs]};
//restituisce un numero intero random nell' intervallo [-a,a].
var RNDM=function(a) {round(random(-(a+1/2)..(a+1/2)))};
// trova un numero complesso in forma polare;
// qualunque sia l' unità di misura degli angoli il risultato è in radianti
topolar=function(c){var (f1,f2,f3)=[false,false,false];
if |c|==0 -> [0,0] else (var y=c/|c|;
if (imag(y)<0 )-> (y=conj(y);f1=true);
if (real(y)<0 )-> (y=conj(y*1i)/(1i);f2=true);
if (real(y)<imag(y))-> (y=conj(y/(1+1i))*(1+1i);f3=true);
var yy=asin(imag(y));
if system:getAngleMode()=="degrees" -> yy*=pi/180;
if f3 -> yy=pi/2-yy;if f2 -> yy=pi-yy;if f1 -> yy=-yy;
[|c|,yy])};
// logaritmi di numeri complessi
// qualunque sia l' unità di misura degli angoli il risultato è basato sui radianti
LN=function(x){var y=topolar(x);ln(y[0])+y[1]*1i};
LN2=function(x){LN(x)/ln(2)};
LN10=function(x){LN(x)/ln(10)};
// restituisce la lista ordinata dei numeri primi <=kk
// e la lista del loro numero d' ordine
// sotto forma di matrice (2 x n)
primi=function(kk){var (p,j,h,f,k,n)=[[1,2;1,2],3,0,true,sign(kk)*kk,0];
PR=function(){f=true;
h=1; while(f and (p[0][h]<=sqrt(j))) -> (f=(j mod p[0][h])!=0;h+=1);f};
VAI=function() {n=3;while (j<=k) -> (if (PR())-> (
p=augment(p,[j;n]);n+=1);j+=2);p};
CASE([k<1,x->p=[0;0];k<2,x->p=[1;1];true,VAI])};
// true se il numero kk è primo, false altrimenti
isprimo=function(kk){var k=sign(kk)*kk;var (p,f)=[primi(sqrt(k))[0],true];
shift(p);
while(f and (p !=[])) -> f=(k mod shift(p))!=0;f};
// true se un numero in valore assoluto è < di "10^-err"
ifzero=function(x,err){
var er=(err==null ? 10 : err);
(|x|< 10^-er)};
// se la stringa "orig" è contenuta in "dest" risponde [true,[pos1,pos2,...]]
// dove posN sono le posizioni di "orig" in "dest" (la numerazione parte da zero)
// altrimenti da [false,[]]
instring=function(orig,dest){
var (lor,lde,k,j,r,pos)=[len(orig),len(dest),0,0,false,[]];
var segui=function() {var n=0;
while (n<lor) ->(if (orig[k+n]==dest[j+n])-> n+=1
else (n=lor+1;j+=1;k=0;);
if(n==lor)-> (pos=push(pos,j);k=0;j+=1;r=true;))
};
while (j<(lde-lor+1)) -> (
if (orig[k]==dest[j])-> segui()
else (k=0;j+=1;));
[r,pos]};
// in una lista da:tipo,dimensioni valore e altro di una variabile
type=function(a){var b=[system:type(a),dim(a),a];
if (b[0]=="matrix") ->(b=[b,[system:type(a(1,1))]])
else (if (b[0]=="list") ->(b=concat([b],[MAP(system:type,a)])));b};
// da zero se due elementi nella lista sono uguali; altimenti uno
UZ=function(lst){var(k,j,l,ret)=[0,0,len(lst),1];
while (k<l) ->(j=k+1;
while ((ret==1) and(j<l)) ->(if (lst[k]==lst[j])->(ret=0;j=l;k=l);j+=1);k+=1);ret};
// ordina gli elementi di "lst" secondo la funzione booleana F(x,y)
// true -> l'ordine è invariato
// false -> gli elementi sono invertiti
// risposta= [k=numero permutazioni,s=lista ordinata]
// (-1)^k da la parità della permutazione
ordina=function(F,lst){var (s,k,p,ls,q)=[[],0,0,clone(lst),0];
while (ls != []) ->(p=shift(ls);
var ls0=clone(ls);var j=0;
while (ls0 != []) ->(q=ls0[0];
if F(q,p)->(ls[j]=p;p=q;k+=1);
j+=1;shift(ls0));
push(s,p));
[k,s]};
// rationalize per numeri complessi
// delta=|x|*10^-err
RATIONALIZE=function(x,err){var er=(err==null ? 10 : err);
rationalize(real(x),|x|*10^-er)+rationalize(imag(x),|x|*10^-er)*1i};
// da la struttura coniugata
CONJ=function(struttura){MAP(x->conj(x),struttura)};
// pone a zero la parte reale e/o la parte immaginaria se inferiore a 10^-err
chopRI=function(c,err){var x=0;var er=(err==null ? 10 : err);
if ifzero(real(c),er) -> (x = 0) else (x=real(c));
if (not ifzero(imag(c),er)) -> (x += imag(c)*1i);
x};
// stessa cosa ma calcolando l' errore relativo rispetto al modulo
chopREL=function(c,err){var (x,m)=[0,0];var er=(err==null ? 10 : err);
var m=|c|;if (m==0) -> x=0. else
(if ifzero(real(c)/m,er) -> (x = 0) else (x=real(c));
if (not ifzero(imag(c)/m,er)) -> (x += imag(c)*1i));
x};
//come sopra, ma per qualunque lista "vv" comunque sia strutturata;
// lascia invariati gli elementi non numerici
CHOP = function(Struttura,er){MAP(x->chopRI(x,er),Struttura)};
CHOPREL = function(Struttura,er){MAP(x->chopREL(x,er),Struttura)};
// esegue la funzione "FF" per ogni elemento numerico della struttura "ww"
// gli alti elementi rimangono invariati
// "FF" ammette inoltre il parametro "err", che, se non passato, assume il valore 10
MAP=function(FF,ww,err){var s=[];var er=(err==null ? 10 : err);
var f=(instring(system:type(ww),"integer-float-complex-rational")[0]);
if f -> (s=FF(ww,er))
else (if instring(system:type(ww),"string-function")[0]-> (s=ww)
else (var s=concat(s,map(x->MAP(FF,x,er),ww))));s};
// minimi e massimi un una struttura qualunque
MIN=function(struttura){var Min=-ln(0);MAP(x->(Min= (x<Min) ? x : Min),struttura);Min};
MAX=function(struttura){var Max=ln(0);MAP(x->(Max= (x>Max) ? x : Max),struttura);Max};
MINMAX=function(struttura){[MIN(struttura),MAX(struttura)]};
// il risultato non è il valore assoluto, ma il valore originario
MINABS=function(struttura){var Min=-ln(0);var m=clone(Min);
MAP(x->(Min= (|x|<m) ? (m=|x|;x) : Min),struttura);Min};
MAXABS=function(struttura){var Max=0;var m=clone(Max);
MAP(x->(Max=(|x|>m) ? (m=|x|;x) : Max),struttura);Max};
MINMAXABS=function(struttura){[MINABS(struttura),MAXABS(struttura)]};
//cambiano in una struttura qualunque "vv" da "rational" a "float" e viceversa
FLOAT = function(Struttura,er){MAP(x -> x*1.,Struttura)};
toR=function(x,err){var er=(err==null ? 10 : err);
rationalize(real(x),10^-er)+rationalize(imag(x),10^-er)*1i};
RATIONAL = function(Struttura,er){MAP(toR,Struttura,er)};
0 Comments
Sign in to leave a comment