Scientific Calculator

(public) gio/algebrapoly

By gio gio

Funzioni di algebra polinomiale e di servizio

Tagged: algebra

display=function(x,title){confirm(string(x),title)};

//trova un numero complesso in forma polare; l' unità di misura degli angoli è quella in uso
topolar=function(c){var s=-1;
    if |c|==0 -> [0,0] else if sign(imag(c))>=0 -> s=1;
    [|c|,s*acos(real(c)/|c|)]};

// true se un numero in valore assoluto è < di "err"
ifzero=function(x,err){
	var er=10;if err==null -> er=10 else er=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=concat(pos,[j+1]);k=0;j+=lor;r=true;))    
			};
		while (j<(lde-lor+1)) -> (
			if (orig[k]==dest[j])-> segui()
			else (k=0;j+=1;));
			[r,pos]};
			
// esegue una funzione (una variabile) per tutti i valori di una lista
tutto=function(f,l){var ll=clone(l);var t=[];
	while(ll != []) ->(t=concat(t,[f(shift(ll))]));t};
	
// 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],[tutto(system:type,a)])));b};

//2 funzioni di prova, la seconda è ricorsiva
realp=function(x){real(x)};
divn=function(x,n){if (x mod n ==0)-> divn(x/n,n) else x};

// 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=0;if err==null -> er=10 else er=err;
    if ifzero(real(c),er) -> (x = 0) else (x=real(c));
    if (not ifzero(imag(c),er)) -> (x += imag(c)*1i);
    x};
//come sopra, ma per qualunque lista "vv" comunque sia strutturata;
// lascia invaiati gli elementi non numerici
CHOP = function(vv,err){var s=[];var er=10;if err==null -> er=10 else er=err;
 			var cri=function(ww,ee){var(s,k)=[[],0];
				while (k<len(ww)) -> (
					if (instring(system:type(ww[k]),"integer-float-complex-rational"))[0]->(
						s=concat(s,[chopRI(ww[k],er)]);s)
					else (if (instring(system:type(ww[k]),"list-matrix"))[0]-> s=concat(s,[cri(ww[k],er)])
					else s=concat(s,[ww[k]]));k+=1);s};
	if instring(system:type(vv),"integer-float-complex-rational")[0]->(chopRI(vv,er))
	else (if instring(system:type(vv),"list-matrix")[0]-> (s=concat(s,cri(vv,er));s)
	else vv)};
//cambiano in una struttura qualunque "vv" da "rational" a "float" e viceversa
FLOAT = function(vv){var s=[];
 			var cri=function(ww,ee){var(s,k)=[[],0];
				while (k<len(ww)) -> (
					if (instring(system:type(ww[k]),"integer-float-complex-rational"))[0]->(
						s=concat(s,[ww[k]*1.]);s)
					else (if (instring(system:type(ww[k]),"list-matrix"))[0]-> s=concat(s,[cri(ww[k])])
					else s=concat(s,[ww[k]]));k+=1);s};
	if instring(system:type(vv),"integer-float-complex-rational")[0]->((vv)*1.)
	else (if instring(system:type(vv),"list-matrix")[0]-> (s=concat(s,cri(vv));s)
	else vv)};
toR=function(x,err){var er=10;if err==null -> er=10 else er=err;
	rationalize(real(x),10^-er)+rationalize(imag(x),10^-er)*1i};
RATIONAL = function(vv,err){var s=[];var er=10;if err==null -> er=10 else er=err;
		var cri=function(ww,ee){var(s,k)=[[],0];
			while (k<len(ww)) -> (
				if (instring(system:type(ww[k]),"integer-float-complex"))[0]->(
					s=concat(s,[toR(ww[k],er)]);s)
				else (if (instring(system:type(ww[k]),"list-matrix"))[0]-> s=concat(s,[cri(ww[k],er)])
				else s=concat(s,[ww[k]]));k+=1);s};
	if instring(system:type(vv),"integer-float-complex")[0]->toR(vv,er)
	else (if instring(system:type(vv),"list-matrix")[0]-> (s=concat(s,cri(vv,er));s)
	else (vv))};

// i coefficienti dei polinomi sono ordinati dal termine noto alla potenza più alta come una lista
// in tutte le funzioni di polinomi.
//dati i polimomi "ff"==P(x) e "gg"== (x=t-a) trova i polinomio composto Y(t)=P((t-a))
polytrasl= function(ff,gg){var (k,j,r,s)=[0,0,[],0];
	while (k< len(ff)) ->(j=k;
		while (j<len(ff))->(s += nCr(j,k)*ff[j]*(gg[0])^(j-k);j+=1);
			r=concat(r,[s*(gg[1])^k]);s=0;k+=1;);r};

// trova i coefficienti del polinomio prodotto i cui fattori (numeri o polinomi)
// sono gli elementi di tipo lista della lista "lst"
polymul=function(lst){var (mul,ls,ww)=[[1],clone(lst),0];
	var MU=function(a,b){var (k,h,I,J,r,s)=[0,0,len(a)-1,len(b)-1,[],0];
		while (k<=I+J)->(h=max(0,k-J);
			while (h<=min(k,I))->(s+=a[h]*b[k-h];h+=1;);
			r=concat(r,[s]);s=0;k+=1);r};
    while (len(ls)>0) ->(ww=shift(ls);
        if (instring(system:type(ww),"integer-float-complex-rational"))[0]->(mul=mul*ww;)
        else (if (instring(system:type(ww),"list-matrix")[0])-> mul=MU(mul,ww))
             );mul};

// costruisce i coefficienti della derivata di un polinomio di "lst"
polyder=function(lst){var (k,d,ls)=[0,[],clone(list)];shift(ls);
	while(ls!= []) ->(k+=1;d=concat(d,[shift(ls)*k]));d};

// calcola il polinomio integrale indefinito del polinomio "lst".
// il termine noto è posto a zero
polyinteg=function(lst){var (k,d,ls)=[0,[0],clone(lst)];
	while(ls!= []) ->(k+=1;d=concat(d,[shift(ls)/k]));d};

// da il valore di un polinomio di coefficienti "cc" nel valore "x"
// c'è la funzione destra e quella sinistra in quanto funziona anche con polinomi
// di matrici
polydx=function(x,cc) {var (k,y,c)=[0,0,clone(cc)];
	while c != []->(y +=shift(c)*x^k;k+=1);
	y};
polysx=function(x,cc) {var (k,y,c)=[0,0,clone(cc)];
	while c != []->(y +=(x^k)*shift(c);k+=1);
	y};
	
// divide un polinomio (numeri o matrici) per (x-x0).
// in una lista da il resto e i coefficienti del polinomio ottenuto
polydivdx=function(x0,ll){var (l,q)=[clone(ll),[]];
	while(l != []) ->(q=concat(q,[polydx(x0,l)]);shift(l));
	[shift(q),q]};
polydivsx=function(x0,ll){var (l,q)=[clone(ll),[]];
	while(l != []) ->(q=concat(q,[polysx(x0,l)]);shift(l));
	[shift(q),q]};

// x^y
potenza= function(x,y){x^y};

// soluzione di una equazione di secondo grado
eq2=function(lst){if dim(lst)[0] != 3 -> error("i coeff. devono essere 3");
		var(c,b,a)=lst;
		var dsc=(b^2-4*a*c)^(1/2);
		[(-b-dsc)/(2*a),(-b+dsc)/(2*a)]};

// soluzione di una equazione di terzo grado col metodo di Cardano
eq3=function(lst,err){if dim(lst)[0] != 4 -> error("i coeff. devono essere 4");
	var er=10;if err==null -> er=10 else er=err;
	var (f_i,ls,s,ww)=[true,clone(lst),[],e^(2/3*pi*1i)];
	if ifzero(ls[3],er) ->(f_i=false;pop(ls);s=eq2(ls)) 
		else (ls=ls/ls[3];var b3 = -ls[2]/3;var(q,p,o,a)=polytrasl(ls,[b3,1]));
	if (f_i and ifzero(p,er) and ifzero(q,er))->(f_i=false;s=[b3,b3,b3]);
	if (f_i and ifzero(p,er))->(f_i=false;s=b3-q^(1/3)*[1,ww,1/ww])
		else (var z12=eq2([-(p^3)/27,q,a]););
	if f_i -> (var z1=z12[0]^(1/3);var z2=-p/(3*z1);
	s=b3+[z1+z2,z1*ww+z2/ww,z1/ww+z2*ww]);
	s};

vereq3=function(lst){var s=eq3(lst);
    r=polymul([[-s[0],1],[-s[1],1],[-s[2],1]])*lst[3];
    var qq=[0,lst];
    map(x-> (qq=polydivdx(x,qq[1])),s);
    [[lst,r,lst-r,concat(["sol"],s)],qq]};

spam? | offensive?

0 Comments

Sign in to leave a comment