compute_posratpair(x:posrat): RECURSIVE {prp | posratpair_convert(prp)=x} = IF floor(x)=x THEN (# num:=floor(x),den:=1 #) ELSIF x>1 THEN (# num:=floor(x),den:=1 #) + compute_posratpair(x-floor(x)) ELSE (# num:=1,den:=1 #)/compute_posratpair(1/x) ENDIFMEASURE PosRatMeas(x)
aq: VAR [nat->rat]
rat_poly_to_int_rec(aq,n): RECURSIVE {ans:[# newpoly:[nat->rat],currgcd:posnat #] |
(EXISTS (cp:posrat): FORALL (j:nat): ans`newpoly(j) = cp*aq(j)) AND
(FORALL (j:upto(n)): rational_pred(ans`newpoly(j)) AND
integer_pred(ans`newpoly(j)) AND
divides(ans`currgcd,ans`newpoly(j)))} = IF n = 0 AND aq(0)=0 THEN (# newpoly:=aq,currgcd:=1 #) ELSIF n = 0 THEN LET thisden = compute_posratpair(abs(aq(0)))`den IN
(# newpoly:= (LAMBDA (i:nat): thisden*aq(i)),
currgcd:= abs(thisden*aq(0)) #) ELSIF aq(n) = 0 THEN rat_poly_to_int_rec(aq,n-1) ELSE LET currpoly = rat_poly_to_int_rec(aq,n-1),
thisden = compute_posratpair(abs(currpoly`newpoly(n)))`den IN (# newpoly:=(LAMBDA (i:nat): thisden*(currpoly`newpoly(i))),
currgcd:=compute_gcd(thisden*currpoly`newpoly(n),
currpoly`currgcd) #) ENDIFMEASURE n
rat_poly_to_int(aq,n): {ai:[nat->int] | EXISTS (cp:posrat): FORALL (j:upto(n)): ai(j) = cp*aq(j) } = LET rptir = rat_poly_to_int_rec(aq,n),
ppoly = rptir`newpoly,
mgcd = rptir`currgcd IN (LAMBDA (i:nat): IF i<=n THEN ppoly(i)/mgcd ELSE 0 ENDIF)
END clear_denominators
¤ Dauer der Verarbeitung: 0.1 Sekunden
(vorverarbeitet)
¤
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.