123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 |
- // Divide polynomials
- #include "stdafx.h"
- #include "defs.h"
- void
- eval_quotient(void)
- {
- push(cadr(p1)); // 1st arg, p(x)
- eval();
- push(caddr(p1)); // 2nd arg, q(x)
- eval();
- push(cadddr(p1)); // 3rd arg, x
- eval();
- p1 = pop(); // default x
- if (p1 == symbol(NIL))
- p1 = symbol(SYMBOL_X);
- push(p1);
- divpoly();
- }
- //-----------------------------------------------------------------------------
- //
- // Divide polynomials
- //
- // Input: tos-3 Dividend
- //
- // tos-2 Divisor
- //
- // tos-1 x
- //
- // Output: tos-1 Quotient
- //
- //-----------------------------------------------------------------------------
- #define DIVIDEND p1
- #define DIVISOR p2
- #define X p3
- #define Q p4
- #define QUOTIENT p5
- void
- divpoly(void)
- {
- int h, i, m, n, x;
- U **dividend, **divisor;
- save();
- X = pop();
- DIVISOR = pop();
- DIVIDEND = pop();
- h = tos;
- dividend = stack + tos;
- push(DIVIDEND);
- push(X);
- m = coeff() - 1; // m is dividend's power
- divisor = stack + tos;
- push(DIVISOR);
- push(X);
- n = coeff() - 1; // n is divisor's power
- x = m - n;
- push_integer(0);
- QUOTIENT = pop();
- while (x >= 0) {
- push(dividend[m]);
- push(divisor[n]);
- divide();
- Q = pop();
- for (i = 0; i <= n; i++) {
- push(dividend[x + i]);
- push(divisor[i]);
- push(Q);
- multiply();
- subtract();
- dividend[x + i] = pop();
- }
- push(QUOTIENT);
- push(Q);
- push(X);
- push_integer(x);
- power();
- multiply();
- add();
- QUOTIENT = pop();
- m--;
- x--;
- }
- tos = h;
- push(QUOTIENT);
- restore();
- }
- #if SELFTEST
- static char *s[] = {
- "quotient(x^2+1,x+1)-x+1",
- "0",
- "quotient(a*x^2+b*x+c,d*x+e)-(-a*e/(d^2)+a*x/d+b/d)",
- "0",
- };
- void
- test_quotient(void)
- {
- test(__FILE__, s, sizeof s / sizeof (char *));
- }
- #endif
|