quotient.cpp 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. // Divide polynomials
  2. #include "stdafx.h"
  3. #include "defs.h"
  4. void
  5. eval_quotient(void)
  6. {
  7. push(cadr(p1)); // 1st arg, p(x)
  8. eval();
  9. push(caddr(p1)); // 2nd arg, q(x)
  10. eval();
  11. push(cadddr(p1)); // 3rd arg, x
  12. eval();
  13. p1 = pop(); // default x
  14. if (p1 == symbol(NIL))
  15. p1 = symbol(SYMBOL_X);
  16. push(p1);
  17. divpoly();
  18. }
  19. //-----------------------------------------------------------------------------
  20. //
  21. // Divide polynomials
  22. //
  23. // Input: tos-3 Dividend
  24. //
  25. // tos-2 Divisor
  26. //
  27. // tos-1 x
  28. //
  29. // Output: tos-1 Quotient
  30. //
  31. //-----------------------------------------------------------------------------
  32. #define DIVIDEND p1
  33. #define DIVISOR p2
  34. #define X p3
  35. #define Q p4
  36. #define QUOTIENT p5
  37. void
  38. divpoly(void)
  39. {
  40. int h, i, m, n, x;
  41. U **dividend, **divisor;
  42. save();
  43. X = pop();
  44. DIVISOR = pop();
  45. DIVIDEND = pop();
  46. h = tos;
  47. dividend = stack + tos;
  48. push(DIVIDEND);
  49. push(X);
  50. m = coeff() - 1; // m is dividend's power
  51. divisor = stack + tos;
  52. push(DIVISOR);
  53. push(X);
  54. n = coeff() - 1; // n is divisor's power
  55. x = m - n;
  56. push_integer(0);
  57. QUOTIENT = pop();
  58. while (x >= 0) {
  59. push(dividend[m]);
  60. push(divisor[n]);
  61. divide();
  62. Q = pop();
  63. for (i = 0; i <= n; i++) {
  64. push(dividend[x + i]);
  65. push(divisor[i]);
  66. push(Q);
  67. multiply();
  68. subtract();
  69. dividend[x + i] = pop();
  70. }
  71. push(QUOTIENT);
  72. push(Q);
  73. push(X);
  74. push_integer(x);
  75. power();
  76. multiply();
  77. add();
  78. QUOTIENT = pop();
  79. m--;
  80. x--;
  81. }
  82. tos = h;
  83. push(QUOTIENT);
  84. restore();
  85. }
  86. #if SELFTEST
  87. static char *s[] = {
  88. "quotient(x^2+1,x+1)-x+1",
  89. "0",
  90. "quotient(a*x^2+b*x+c,d*x+e)-(-a*e/(d^2)+a*x/d+b/d)",
  91. "0",
  92. };
  93. void
  94. test_quotient(void)
  95. {
  96. test(__FILE__, s, sizeof s / sizeof (char *));
  97. }
  98. #endif