n,i : VAR nat
xvar : VAR [nat->real]
x,y : VAR real
ml,ml1,ml2 : VAR MonoList
c : VAR real
maxnum(x,y:nat): {z:nat |
z>=x AND z>=y AND (z=x OR z=y)} = IF x>=y THEN x ELSE y ENDIF
max(ml1,ml2): RECURSIVE {ml |
length[nat](ml)=maxnum(length[nat](ml1),length[nat](ml2)) AND FORALL (i:nat): i<length(ml) IMPLIES
nth(ml,i) = IF null?(ml1) OR i>=length(ml1) THEN nth(ml2,i) ELSIF null?(ml2) OR i>=length(ml2) THEN nth(ml1,i) ELSE maxnum(nth(ml1,i),nth(ml2,i)) ENDIF } = IF null?(ml1) THEN ml2 ELSIF null?(ml2) THEN ml1 ELSE cons(maxnum(car(ml1),car(ml2)),max(cdr(ml1),cdr(ml2))) ENDIFMEASURE length(ml1)+length(ml2)
max_id: LEMMA max(ml,ml)=ml
max_cdr: LEMMA null?(ml1) OR null?(ml2) OR cdr(max(ml1,ml2)) = max(cdr(ml1),cdr(ml2))
varmono(i,n): RECURSIVE MonoList = IF i=0 THEN (: n :) ELSE cons(0,varmono(i-1,n)) ENDIFMEASURE i
%%% Evaluation of monomials
monolist_eval_rec(ml,c,i)(xvar): RECURSIVE
{r : real | r = c*product(0,length(ml)-1,LAMBDA (k:nat): IF k<length(ml) THEN xvar(k+i)^nth(ml,k) ELSE 1 ENDIF) } = IF null?(ml) THEN c ELSE monolist_eval_rec(cdr(ml),c*xvar(i)^car(ml),i+1)(xvar) ENDIF MEASURE ml BY <<
monolist_eval(ml)(xvar) : real =
monolist_eval_rec(ml,1,0)(xvar)
monolist_eval_prod: LEMMA
monolist_eval(ml)(xvar) =
product(0,length(ml)-1,LAMBDA (i:nat): IF i<length(ml) THEN xvar(i)^nth(ml,i) ELSE 1 ENDIF)
%%% Multiplying monomials, which is really adding them
monosum(ml1,ml2) : RECURSIVE {pml2:MonoList| FORALL (xvar): monolist_eval(pml2)(xvar)
= monolist_eval(ml1)(xvar)*monolist_eval(ml2)(xvar)} = IF null?(ml1) THEN ml2 ELSIF null?(ml2) THEN ml1 ELSE cons(car(ml1)+car(ml2),monosum(cdr(ml1),cdr(ml2))) ENDIF MEASURE length(ml1)+length(ml2)
;+(ml1,ml2) : MACRO MonoList = monosum(ml1,ml2)
%%% Multivariate Polynomials
MultiPolyList: TYPE = list[[real,MonoList]]
mpl,mpl1,mpl2 : VAR MultiPolyList
meval(mpl)(xvar) : RECURSIVE real = IF null?(mpl) THEN 0 ELSELET (coe,mon) = car(mpl) IN
coe*monolist_eval(mon)(xvar) + meval(cdr(mpl))(xvar) ENDIFMEASURE length(mpl)
meval_sigma: LEMMA
meval(mpl)(xvar) =
sigma(0,length(mpl)-1,LAMBDA (i:nat): IF i<length(mpl) THEN
nth(mpl,i)`1*monolist_eval(nth(mpl,i)`2)(xvar) ELSE 0 ENDIF)
%%% Degree
degree(mpl): RECURSIVE {ml |
(NOT null?(mpl)) IMPLIES FORALL (i:below(length(mpl))):
ml = max(nth(mpl,i)`2,ml) AND
length(ml)>=length(nth(mpl,i)`2)} = IF null?(mpl) THEN (: :) ELSIF null?(cdr(mpl)) THEN car(mpl)`2 ELSE max(car(mpl)`2,degree(cdr(mpl))) ENDIFMEASURE length(mpl)
multipoly_to_poly(mpl)(t:nat)(v:nat)(d:nat): real = IF t<length(mpl) AND v<length(nth(mpl,t)`2) AND d=nth(nth(mpl,t)`2,v) THEN 1 ELSIF t<length(mpl) AND null?(nth(mpl,t)`2) AND d=0 THEN 1 ELSIF t<length(mpl) AND v>=length(nth(mpl,t)`2) AND d=0 THEN 1 ELSE 0 ENDIF
multipoly_to_mpoly(mpl): MPoly = IF length(mpl)=0 THEN mk_mpoly(LAMBDA (t:nat): LAMBDA (v:nat): LAMBDA (d:nat): 0, LAMBDA (v:nat): 0, 1,LAMBDA (i:nat): 0) ELSE mk_mpoly(multipoly_to_poly(mpl),list2array[nat](0)(degree(mpl)),
length(mpl),LAMBDA (i:nat): IF i<length(mpl) THEN nth(mpl,i)`1 ELSE 0 ENDIF) ENDIF
%%% Simplifying
mp_simp_rec(swiped,toswipe,ans:MultiPolyList,mono:MonoList,thiscoeff:real): RECURSIVE {mpl | FORALL (xvar): meval(mpl)(xvar)=meval(swiped)(xvar)+meval(toswipe)(xvar)
+meval(ans)(xvar)+thiscoeff*monolist_eval(mono)(xvar)} = IF null?(swiped) AND null?(toswipe) AND thiscoeff/=0 THEN cons((thiscoeff,mono),ans) ELSIF null?(swiped) AND null?(toswipe) THEN ans ELSIF null?(toswipe) AND thiscoeff/=0 THEN
mp_simp_rec(null,cdr(swiped),cons((thiscoeff,mono),ans),car(swiped)`2,car(swiped)`1) ELSIF null?(toswipe) THEN
mp_simp_rec(null,cdr(swiped),ans,car(swiped)`2,car(swiped)`1) ELSIF mono = car(toswipe)`2 THEN mp_simp_rec(swiped,
cdr(toswipe),ans,mono,car(toswipe)`1+thiscoeff) ELSE mp_simp_rec(cons(car(toswipe),swiped),cdr(toswipe),ans,mono,thiscoeff) ENDIFMEASURE lex2(length(swiped)+length(toswipe),length(toswipe))
mp_simp(mpl): {mulist:MultiPolyList| meval(mpl)=meval(mulist)} = IF null?(mpl) THEN mpl ELSE mp_simp_rec(null,mpl,null,car(mpl)`2,0) ENDIF
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.