Algebraic to RPN
02-24-2017, 09:27 PM (This post was last modified: 02-25-2017 03:10 PM by Han.)
Post: #1
 Han Senior Member Posts: 1,882 Joined: Dec 2013
Algebraic to RPN
The code below takes an algebraic expression and converts it to an RPN string. The program itself is not all that useful (in my opinion) but it hopefully provides to those interested in programming expressions a bit of insight into how expressions are built.

For example, in the CAS view, type:

CRPN(x^2-4*x)

to obtain "x 2 ^ 4 x * - +"

EDIT: Joe Horn pointed out to me that the "+" appeared extraneous -- which was also my initial reaction. As it turns out, the CAS treats subtraction as a sequence of negation followed by addition. So the "-" operator is actually the negation operator, which can be verified by typing f:=neg(x) in the CAS view, and extracting the operation using f[1]. I never really gave this much thought, but it is neat to see how expressions are handled on a lower level.

Code:
#pragma mode( separator(.,;) integer(h32) ) #cas CRPN(f):= begin   local rpn, op, par, n, j, g;   rpn:="";   op:="";   par:="";   if (type(f) <> DOM_SYMBOLIC) then     rpn:=string(f);     return(rpn);   end;   op:=string(f[1]);   n:=size(op);   op:=MID(op,2,n-2);   n:=dim(f) + 1;   for j from 2 to n do     g:=f[j];     if (type(g) <> DOM_SYMBOLIC) then       par:=string(g);     else       par:=CRPN(g);     end;     if (j > 2) then rpn:=rpn + " "; end;     rpn:=rpn + par;     if ((j > 2) or (n == 2)) then       rpn:=rpn + " " + op;     end;   end;   return(rpn); end; #end

Graph 3D | QPI | SolveSys
02-25-2017, 12:19 PM
Post: #2
 ggauny@live.fr Senior Member Posts: 567 Joined: Nov 2014
RE: Algebraic to RPN
Hello Han,

I appriciate many your program. I have the same from Wiiliam C WICKES from
HP 48 INSIGHTS (part II page 534) from 1992.

I was failure to translate to HP PRIME and you give me !

Thank again.

Gérard.
02-25-2017, 02:05 PM
Post: #3
 compsystems Senior Member Posts: 1,337 Joined: Dec 2013
RE: Algebraic to RPN
extract parts and operators with [] acts as the PART command, please create a second version with PART cmd

PHP Code:
(x^2-4*x)[1] → '+'(x^2-4*x)[2] → x^2(x^2-4*x)[3] → -4*xpart(x^2-4*x) → 2part(x^2-4*x,1) → x^2part(x^2-4*x,2) → -4*xpart(x^2-4*x,0) → "+"
02-25-2017, 03:15 PM
Post: #4
 Han Senior Member Posts: 1,882 Joined: Dec 2013
RE: Algebraic to RPN
(02-25-2017 02:05 PM)compsystems Wrote:  extract parts and operators with [] acts as the PART command, please create a second version with PART cmd

PHP Code:
(x^2-4*x)[1] → '+'(x^2-4*x)[2] → x^2(x^2-4*x)[3] → -4*xpart(x^2-4*x) → 2part(x^2-4*x,1) → x^2part(x^2-4*x,2) → -4*xpart(x^2-4*x,0) → "+"

I am not sure why you would want a version using the part command, but here:

Code:
#pragma mode( separator(.,;) integer(h32) ) #cas CRPN(f):= begin   local rpn, op, par, n, j, g;   rpn:="";   op:="";   par:="";   if (type(f) <> DOM_SYMBOLIC) then     rpn:=string(f);     return(rpn);   end;   op:=string(part(f,0));   n:=size(op);   op:=MID(op,2,n-2);   n:=part(f);   for j from 1 to n do     g:=part(f,j);     if (type(g) <> DOM_SYMBOLIC) then       par:=string(g);     else       par:=CRPN(g);     end;     if (j > 1) then rpn:=rpn + " "; end;     rpn:=rpn + par;     if ((j > 1) or (n == 1)) then       rpn:=rpn + " " + op;     end;   end;   return(rpn); end; #end

Graph 3D | QPI | SolveSys
02-26-2017, 02:59 PM (This post was last modified: 03-02-2018 01:38 PM by compsystems.)
Post: #5
 compsystems Senior Member Posts: 1,337 Joined: Dec 2013
RE: Algebraic to RPN
userrpl

PHP Code:
« 0 0 { } -> EXPRESSION XPART NPARTS OPERATOR OBJECTS  « EXPRESSION    IFERR OBJ->    THEN ->STR 'OPERATOR' STO 0 'NPARTS' STO OPERATOR 1 ->LIST 'OBJECTS' STO    ELSE ->STR 'OPERATOR' STO 'NPARTS' STO NPARTS ->LIST 'OBJECTS' STO NPARTS OPERATOR OBJECTS 3 ->LIST DROP    END      IF XPART NPARTS <= XPART -1 >= AND NOT      THEN "EXPRESSION " EXPRESSION + " CONTAINS ONLY " + NPARTS + " PARTS" +      ELSE        IF XPART 0 ==        THEN OPERATOR        ELSE          IF XPART -1 ==          THEN NPARTS          ELSE OBJECTS XPART GET          END        END      END  »»'PART' STO

Hi. The code with PART CMD, is simplified to the following, also rename some variables to auto-document the code.

PHP Code:
#pragma mode( separator(.,;) integer(h32) )#cas    convToRPN(expr1):=    begin      local rpnStr, oper, partn, parts, partJ, expr2;      rpnStr:="";      oper:="";      partn:="";      if (type(expr1) <> DOM_SYMBOLIC) then        rpnStr:=string(expr1);        return(rpnStr);      end;      expr1:=(x^2-4*x);      oper:=string(expr1[1]);        parts:=size(oper);        oper:=MID(oper,2,parts-2);        parts:=dim(expr1) + 1;      for partJ from 2 to parts do        expr2:=expr1[partJ];        if (type(expr2) <> DOM_SYMBOLIC) then          partn:=string(expr2);        else          partn:=convToRPN(expr2);        end;        if (partJ > 2) then           rpnStr:=rpnStr + " ";         end;        rpnStr:=rpnStr + partn;        if ((partJ > 2) or (parts == 2)) then          rpnStr:=rpnStr + " " + oper;        end;      end;      return(rpnStr);    end;#end//(x^2-4*x)[1] -> '+'//(x^2-4*x)[2] -> x^2//(x^2-4*x)[3] -> -4*x#pragma mode( separator(.,;) integer(h32) )#cas    convToRPN2(expr1):=    begin      local rpnStr, oper, partn, parts, partJ, expr2;            rpnStr:="";      oper:="";      partn:="";      if (type(expr1) <> DOM_SYMBOLIC) then        rpnStr:=string(expr1);        return(rpnStr);      end;      oper:=part(expr1,0);      parts:=part(expr1);      for partJ from 1 to parts do        expr2:=part(expr1,partJ);        if (type(expr2) <> DOM_SYMBOLIC) then          partn:=string(expr2);        else          partn:=convToRPN2(expr2);        end;        if (partJ > 1) then           rpnStr:=rpnStr + " ";         end;        rpnStr:=rpnStr + partn;        if ((partJ > 1) or (parts == 1)) then          rpnStr:=rpnStr + " " + oper;        end;      end;      return(rpnStr);    end;#end

convToRPN2(x^3); returns "x 3 ^"

///////////////

Running step by step convToRPN2(x^3);, for those who want to see the conversion of x^3 to RPN
https://en.wikipedia.org/wiki/Reverse_Polish_notation

PHP Code:
expr1:=x^3;rpnStr:="";oper:="";partn:="";oper:=part(expr1,0); //returns "^"parts:=part(expr1); //returns 2partJ:=1;expr2:=part(expr1,partJ); //returns xpartn:=string(expr2); //returns "x"rpnStr:=rpnStr + partn; // returns "x"partJ:=2;expr2:=part(expr1,partJ); //returns 3partn:=string(expr2); //returns "3"rpnStr:=rpnStr + " "; //returns "x "rpnStr:=rpnStr + partn; //returns "x 3"rpnStr:=rpnStr + " " + oper; //returns "x 3 ^"

Or in a list of steps, without comments to copy and paste them in the history view

PHP Code:
expr1:=x^3; rpnStr:=""; oper:=""; partn:=""; oper:=part(expr1,0); parts:=part(expr1); partJ:=1; expr2:=part(expr1,partJ); partn:=string(expr2); rpnStr:=rpnStr + partn; partJ:=2; expr2:=part(expr1,partJ); partn:=string(expr2); rpnStr:=rpnStr + " ";rpnStr:=rpnStr + partn; rpnStr:=rpnStr + " " + oper;

returns

PHP Code:
[ x^3,"","","","^",2,1,x,"x","x",2,3,"3","x ","x 3","x 3 ^"]

07-28-2018, 08:33 PM
Post: #6
 Komanguy Junior Member Posts: 49 Joined: Jul 2018
RE: Algebraic to RPN
Thanks for this useful program.

I’m learning lots of things.

Guy R. KOMAN, hp 50G, hp Prime Rev. C
07-29-2018, 07:46 AM
Post: #7
 tcab Member Posts: 188 Joined: Dec 2017
RE: Algebraic to RPN
07-29-2018, 12:10 PM
Post: #8
 Joe Horn Senior Member Posts: 1,892 Joined: Dec 2013
RE: Algebraic to RPN
(07-29-2018 07:46 AM)tcab Wrote:  @compsystems - nice skin on your virtual Prime - is that available for download anywhere?

<0|ɸ|0>
-Joe-
 « Next Oldest | Next Newest »

User(s) browsing this thread: 1 Guest(s)