Scientific Calculator

(public) Giordano/FunzioniBase

By Giordano Giordano Cignani

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)};

spam? | offensive?

0 Comments

Sign in to leave a comment