coeff.cpp 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. // get the coefficient of x^n in polynomial p(x)
  2. #include "stdafx.h"
  3. #include "defs.h"
  4. #define P p1
  5. #define X p2
  6. #define N p3
  7. void
  8. eval_coeff(void)
  9. {
  10. push(cadr(p1)); // 1st arg, p
  11. eval();
  12. push(caddr(p1)); // 2nd arg, x
  13. eval();
  14. push(cadddr(p1)); // 3rd arg, n
  15. eval();
  16. N = pop();
  17. X = pop();
  18. P = pop();
  19. if (N == symbol(NIL)) { // only 2 args?
  20. N = X;
  21. X = symbol(SYMBOL_X);
  22. }
  23. push(P); // divide p by x^n
  24. push(X);
  25. push(N);
  26. power();
  27. divide();
  28. push(X); // keep the constant part
  29. filter();
  30. }
  31. //-----------------------------------------------------------------------------
  32. //
  33. // Put polynomial coefficients on the stack
  34. //
  35. // Input: tos-2 p(x)
  36. //
  37. // tos-1 x
  38. //
  39. // Output: Returns number of coefficients on stack
  40. //
  41. // tos-n Coefficient of x^0
  42. //
  43. // tos-1 Coefficient of x^(n-1)
  44. //
  45. //-----------------------------------------------------------------------------
  46. int
  47. coeff(void)
  48. {
  49. int h, n;
  50. save();
  51. p2 = pop();
  52. p1 = pop();
  53. h = tos;
  54. for (;;) {
  55. push(p1);
  56. push(p2);
  57. push(zero);
  58. subst();
  59. eval();
  60. p3 = pop();
  61. push(p3);
  62. push(p1);
  63. push(p3);
  64. subtract();
  65. p1 = pop();
  66. if (equal(p1, zero)) {
  67. n = tos - h;
  68. restore();
  69. return n;
  70. }
  71. push(p1);
  72. push(p2);
  73. divide();
  74. p1 = pop();
  75. }
  76. }