condense.cpp 1021 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. // Condense an expression by factoring common terms.
  2. #include "stdafx.h"
  3. #include "defs.h"
  4. void
  5. eval_condense(void)
  6. {
  7. push(cadr(p1));
  8. eval();
  9. Condense();
  10. }
  11. void
  12. Condense(void)
  13. {
  14. int tmp;
  15. tmp = expanding;
  16. save();
  17. yycondense();
  18. restore();
  19. expanding = tmp;
  20. }
  21. void
  22. yycondense(void)
  23. {
  24. expanding = 0;
  25. p1 = pop();
  26. if (car(p1) != symbol(ADD)) {
  27. push(p1);
  28. return;
  29. }
  30. // get gcd of all terms
  31. p3 = cdr(p1);
  32. push(car(p3));
  33. p3 = cdr(p3);
  34. while (iscons(p3)) {
  35. push(car(p3));
  36. gcd();
  37. p3 = cdr(p3);
  38. }
  39. // divide each term by gcd
  40. inverse();
  41. p2 = pop();
  42. push(zero);
  43. p3 = cdr(p1);
  44. while (iscons(p3)) {
  45. push(p2);
  46. push(car(p3));
  47. multiply();
  48. add();
  49. p3 = cdr(p3);
  50. }
  51. // We multiplied above w/o expanding so sum factors cancelled.
  52. // Now we expand which which normalizes the result and, in some cases,
  53. // simplifies it too (see test case H).
  54. yyexpand();
  55. // multiply result by gcd
  56. push(p2);
  57. divide();
  58. }