12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- // get the coefficient of x^n in polynomial p(x)
- #include "stdafx.h"
- #include "defs.h"
- #define P p1
- #define X p2
- #define N p3
- void
- eval_coeff(void)
- {
- push(cadr(p1)); // 1st arg, p
- eval();
- push(caddr(p1)); // 2nd arg, x
- eval();
- push(cadddr(p1)); // 3rd arg, n
- eval();
- N = pop();
- X = pop();
- P = pop();
- if (N == symbol(NIL)) { // only 2 args?
- N = X;
- X = symbol(SYMBOL_X);
- }
- push(P); // divide p by x^n
- push(X);
- push(N);
- power();
- divide();
- push(X); // keep the constant part
- filter();
- }
- //-----------------------------------------------------------------------------
- //
- // Put polynomial coefficients on the stack
- //
- // Input: tos-2 p(x)
- //
- // tos-1 x
- //
- // Output: Returns number of coefficients on stack
- //
- // tos-n Coefficient of x^0
- //
- // tos-1 Coefficient of x^(n-1)
- //
- //-----------------------------------------------------------------------------
- int
- coeff(void)
- {
- int h, n;
- save();
- p2 = pop();
- p1 = pop();
- h = tos;
- for (;;) {
- push(p1);
- push(p2);
- push(zero);
- subst();
- eval();
- p3 = pop();
- push(p3);
- push(p1);
- push(p3);
- subtract();
- p1 = pop();
- if (equal(p1, zero)) {
- n = tos - h;
- restore();
- return n;
- }
- push(p1);
- push(p2);
- divide();
- p1 = pop();
- }
- }
|