version 1.1, 2003/10/20 07:18:42 |
version 1.4, 2005/02/08 18:06:05 |
|
|
/* |
/* |
* $Id$ |
* $OpenXM: OpenXM_contrib2/asir2000/builtin/isolv.c,v 1.3 2003/10/23 01:32:59 saito Exp $ |
*/ |
*/ |
|
|
#include "ca.h" |
#include "ca.h" |
Line 14 static void NSolve(NODE, Obj *); |
|
Line 14 static void NSolve(NODE, Obj *); |
|
void Solve1(P, Q, pointer *); |
void Solve1(P, Q, pointer *); |
void Sturm(P, VECT *); |
void Sturm(P, VECT *); |
void boundbody(P, Q *); |
void boundbody(P, Q *); |
|
void binary(int , MAT); |
void separate(Q, Q, VECT, Q, Q, int, int, MAT, int *); |
void separate(Q, Q, VECT, Q, Q, int, int, MAT, int *); |
void ueval(P, Q, Q *); |
void ueval(P, Q, Q *); |
|
|
|
|
NODE arg; |
NODE arg; |
Obj *rp; |
Obj *rp; |
{ |
{ |
pointer p, Eps; |
pointer p, Eps; |
LIST root, listp; |
pointer root; |
V v; |
LIST listp; |
Q eps; |
V v; |
NODE n, n0, m0, m, ln0; |
Q eps; |
Num r; |
NODE n, n0, m0, m, ln0; |
Itv iv; |
Num r; |
BF breal; |
Itv iv; |
|
BF breal; |
|
|
p = (pointer)ARG0(arg); |
p = (pointer)ARG0(arg); |
if ( !p ) { |
if ( !p ) { |
|
|
ToBf(r, &breal); |
ToBf(r, &breal); |
NEXTNODE( n0, n ); |
NEXTNODE( n0, n ); |
MKNODE(ln0, breal, NEXT(m)); |
MKNODE(ln0, breal, NEXT(m)); |
MKLIST(listp, ln0); |
MKLIST((LIST)listp, ln0); |
BDY(n) = (pointer)listp; |
BDY(n) = (pointer)listp; |
} |
} |
NEXT(n) = 0; |
NEXT(n) = 0; |
MKLIST(listp,n0); |
MKLIST((LIST)listp,n0); |
*rp = (pointer)listp; |
*rp = (pointer)listp; |
break; |
break; |
case O_LIST: |
case O_LIST: |
|
|
chvu = stumq(sseq, up); |
chvu = stumq(sseq, up); |
chvl = stumq(sseq, low); |
chvl = stumq(sseq, low); |
tnumb = abs(chvu - chvl); |
tnumb = abs(chvu - chvl); |
MKMAT(root, tnumb, 3); |
MKMAT(root, tnumb, 4); |
pad = -1; |
pad = -1; |
|
|
fctrp(CO,inp,&fctp); |
fctrp(CO,inp,&fctp); |
|
|
BDY(root)[pad][0] = 0; |
BDY(root)[pad][0] = 0; |
BDY(root)[pad][1] = 0; |
BDY(root)[pad][1] = 0; |
BDY(root)[pad][2] = DEG(fctp); |
BDY(root)[pad][2] = DEG(fctp); |
|
BDY(root)[pad][3] = p; |
} else { |
} else { |
divq((Q)COEF(NEXT(onedeg)),(Q)COEF(onedeg),&a); |
divq((Q)COEF(NEXT(onedeg)),(Q)COEF(onedeg),&a); |
BDY(root)[pad][0] = a; |
BDY(root)[pad][0] = a; |
BDY(root)[pad][1] = BDY(root)[pad][0]; |
BDY(root)[pad][1] = BDY(root)[pad][0]; |
BDY(root)[pad][2] = DEG(fctp); |
BDY(root)[pad][2] = DEG(fctp); |
|
BDY(root)[pad][3] = p; |
} |
} |
continue; |
continue; |
} |
} |
|
|
a = BDY(root)[i][2]; |
a = BDY(root)[i][2]; |
BDY(root)[i][2] = BDY(root)[j][2]; |
BDY(root)[i][2] = BDY(root)[j][2]; |
BDY(root)[j][2] = a; |
BDY(root)[j][2] = a; |
|
a = BDY(root)[i][3]; |
|
BDY(root)[i][3] = BDY(root)[j][3]; |
|
BDY(root)[j][3] = a; |
} |
} |
} |
} |
} |
} |
|
for (i = 0; i < pad; i++) { |
|
while(cmpq(BDY(root)[i][1], BDY(root)[i+1][0]) > 0 ) { |
|
binary(i, root); |
|
binary(i+1, root); |
|
if ( cmpq(BDY(root)[i][0], BDY(root)[i+1][1]) > 0 ) { |
|
a = BDY(root)[i][0]; |
|
BDY(root)[i][0] = BDY(root)[i+1][0]; |
|
BDY(root)[i+1][0] = a; |
|
a = BDY(root)[i][1]; |
|
BDY(root)[i][1] = BDY(root)[i+1][1]; |
|
BDY(root)[i+1][1] = a; |
|
a = BDY(root)[i][2]; |
|
BDY(root)[i][2] = BDY(root)[i+1][2]; |
|
BDY(root)[i+1][2] = a; |
|
a = BDY(root)[i][3]; |
|
BDY(root)[i][3] = BDY(root)[i+1][3]; |
|
BDY(root)[i+1][3] = a; |
|
break; |
|
} |
|
} |
|
} |
for (i = 0, n0 = 0; i <= pad; i++) { |
for (i = 0, n0 = 0; i <= pad; i++) { |
istoitv(BDY(root)[i][0], BDY(root)[i][1], &iv); |
istoitv(BDY(root)[i][0], BDY(root)[i][1], &iv); |
NEXTNODE(n0,n); |
NEXTNODE(n0,n); |
|
|
int *padp; |
int *padp; |
{ |
{ |
int de, midn; |
int de, midn; |
Q mid, a, b, c, d, e; |
Q mid, e; |
P p; |
P p; |
|
|
de = abs(lown - upn); |
de = abs(lown - upn); |
|
|
(*padp)++; |
(*padp)++; |
BDY(root)[*padp][0] = up; |
BDY(root)[*padp][0] = up; |
BDY(root)[*padp][1] = low; |
BDY(root)[*padp][1] = low; |
|
BDY(root)[*padp][3] = (P *)sseq->body[0]; |
subq( BDY(root)[*padp][1], BDY(root)[*padp][0], &e ); |
subq( BDY(root)[*padp][1], BDY(root)[*padp][0], &e ); |
SGN(e) = 1; |
SGN(e) = 1; |
p = (P *)sseq->body[0]; |
|
while (cmpq(e, eps) > 0) { |
while (cmpq(e, eps) > 0) { |
addq(BDY(root)[*padp][0], BDY(root)[*padp][1], &c); |
binary(*padp, root); |
divq(c, TWO, &d); |
|
ueval(p, BDY(root)[*padp][1], &a); |
|
ueval(p, d, &b); |
|
if (SGN(a) == SGN(b)) |
|
BDY(root)[*padp][1] = d; |
|
else BDY(root)[*padp][0] = d; |
|
subq( BDY(root)[*padp][1], BDY(root)[*padp][0], &e); |
subq( BDY(root)[*padp][1], BDY(root)[*padp][0], &e); |
SGN(e) = 1; |
SGN(e) = 1; |
} |
} |
|
|
midn = stumq(sseq, mid); |
midn = stumq(sseq, mid); |
separate(mult, eps, sseq, low, mid, lown, midn, root, padp); |
separate(mult, eps, sseq, low, mid, lown, midn, root, padp); |
separate(mult, eps, sseq, mid, up, midn, upn, root, padp); |
separate(mult, eps, sseq, mid, up, midn, upn, root, padp); |
|
} |
|
|
|
void |
|
binary(indx, root) |
|
int indx; |
|
MAT root; |
|
{ |
|
Q a, b, c, d, e; |
|
P p; |
|
p = (P)BDY(root)[indx][3]; |
|
addq(BDY(root)[indx][0], BDY(root)[indx][1], &c); |
|
divq(c, TWO, &d); |
|
ueval(p, BDY(root)[indx][1], &a); |
|
ueval(p, d, &b); |
|
if (SGN(a) == SGN(b)){ |
|
BDY(root)[indx][1] = d; |
|
} else { |
|
BDY(root)[indx][0] = d; |
|
} |
} |
} |
|
|
void |
void |