;30-May-1999                                                    Alain Brobecker

;Things to add/improve/ponder in this library:
;     * simplification of fractions.
;     * comparisons, by example a Q> function returning true or false (0).


 1 3 COPY2 QPRINT " + "
 1 2 COPY2 QPRINT " = "
 Q+ QPRINT CR
END


#QSWAP2 3 SWAP SWAP2 4 SWAP SWAP2 END
#QPRINT SWAP2 HPRINT "/" HPRINT END

;IN         p1 q1 p2 q2
;OUT        p1*q2+p2*q1 q1*q2
#Q+
  COPY      ;p1 q1 p2 q2 q2
  4 SWAP    ;p1 q2 p2 q2 q1
  COPY      ;p1 q2 p2 q2 q1 q1
  3 SWAP    ;p1 q2 p2 q1 q1 q2
  *         ;p1 q2 p2 q1 q1*q2
  3 SWAP    ;p1 q2 q1*q2 q1 p2
  *         ;p1 q2 q1*q2 p2*q1
  SWAP2     ;p1 q2 p2*q1 q1*q2
  4 SWAP    ;q1*q2 q2 p2*q1 p1
  SWAP2     ;q1*q2 q2 p1 p2*q1
  3 SWAP    ;q1*q2 p2*q1 p1 q2
  *         ;q1*q2 p2*q1 p1*q2
  +         ;q1*q2 p1*q2+p2*q1
  SWAP2
END

;IN         p1 q1 p2 q2
;OUT        p1*q2 p2*q1
#Q/
  3 SWAP    ;p1 q2 p2 q1
  *         ;p1 q2 p2*q1
  COPY SKIP<>0 "Error, denominator is null"
  3 SWAP    ;p2*q1 q2 p1
  *         ;p2*q1 p1*q2
  SWAP2    ;p1*q2 p2*q1
END

;IN         p1 q1 p2 q2
;OUT        p1*p2 q1*q2
#Q*
  4 SWAP    ;q2 q1 p2 p1
  *         ;q2 q1 p1*p2
  3 SWAP    ;p1*p2 q1 q2
  *         ;p1*p1 q1*q2
END

;IN         p1 q1 p2 q2
;OUT        p1*q2-p2*q1 q1*q2
#Q-
  SWAP2     ;p1 q1 q2 p2
  0         ;p1 q1 q2 p2 0
  SWAP2     ;p1 q1 q2 0 p2
  -         ;p1 q1 q2 -p2
  SWAP2     ;p1 q1 -p2 q2
  Q+
END
