version 1.5, 2013/02/15 07:05:49 |
version 1.6, 2018/03/29 01:32:50 |
|
|
* DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE, |
* DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE, |
* PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE. |
* PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE. |
* |
* |
* $OpenXM: OpenXM_contrib2/asir2000/builtin/rat.c,v 1.4 2003/12/23 10:39:57 ohara Exp $ |
* $OpenXM: OpenXM_contrib2/asir2000/builtin/rat.c,v 1.5 2013/02/15 07:05:49 noro Exp $ |
*/ |
*/ |
#include "ca.h" |
#include "ca.h" |
#include "parse.h" |
#include "parse.h" |
|
|
void Pnm(), Pdn(), Pderiv(), Pederiv(), Prderiv(); |
void Pnm(), Pdn(), Pderiv(), Pederiv(), Prderiv(); |
|
|
struct ftab rat_tab[] = { |
struct ftab rat_tab[] = { |
{"nm",Pnm,1}, |
{"nm",Pnm,1}, |
{"dn",Pdn,1}, |
{"dn",Pdn,1}, |
{"diff",Pderiv,-99999999}, |
{"diff",Pderiv,-99999999}, |
{"ediff",Pederiv,-99999999}, |
{"ediff",Pederiv,-99999999}, |
{"rdiff",Prderiv,-99999999}, |
{"rdiff",Prderiv,-99999999}, |
{0,0,0}, |
{0,0,0}, |
}; |
}; |
|
|
void Pnm(arg,rp) |
void Pnm(arg,rp) |
NODE arg; |
NODE arg; |
Obj *rp; |
Obj *rp; |
{ |
{ |
Obj t; |
Obj t; |
Q q; |
Q q; |
|
|
asir_assert(ARG0(arg),O_R,"nm"); |
asir_assert(ARG0(arg),O_R,"nm"); |
if ( !(t = (Obj)ARG0(arg)) ) |
if ( !(t = (Obj)ARG0(arg)) ) |
*rp = 0; |
*rp = 0; |
else |
else |
switch ( OID(t) ) { |
switch ( OID(t) ) { |
case O_N: |
case O_N: |
switch ( NID(t) ) { |
switch ( NID(t) ) { |
case N_Q: |
case N_Q: |
NTOQ(NM((Q)t),SGN((Q)t),q); *rp = (Obj)q; break; |
NTOQ(NM((Q)t),SGN((Q)t),q); *rp = (Obj)q; break; |
default: |
default: |
*rp = t; break; |
*rp = t; break; |
} |
} |
break; |
break; |
case O_P: |
case O_P: |
*rp = t; break; |
*rp = t; break; |
case O_R: |
case O_R: |
*rp = (Obj)NM((R)t); break; |
*rp = (Obj)NM((R)t); break; |
default: |
default: |
*rp = 0; |
*rp = 0; |
} |
} |
} |
} |
|
|
void Pdn(arg,rp) |
void Pdn(arg,rp) |
NODE arg; |
NODE arg; |
Obj *rp; |
Obj *rp; |
{ |
{ |
Obj t; |
Obj t; |
Q q; |
Q q; |
|
|
asir_assert(ARG0(arg),O_R,"dn"); |
asir_assert(ARG0(arg),O_R,"dn"); |
if ( !(t = (Obj)ARG0(arg)) ) |
if ( !(t = (Obj)ARG0(arg)) ) |
*rp = (Obj)ONE; |
*rp = (Obj)ONE; |
else |
else |
switch ( OID(t) ) { |
switch ( OID(t) ) { |
case O_N: |
case O_N: |
switch ( NID(t) ) { |
switch ( NID(t) ) { |
case N_Q: |
case N_Q: |
if ( DN((Q)t) ) |
if ( DN((Q)t) ) |
NTOQ(DN((Q)t),1,q); |
NTOQ(DN((Q)t),1,q); |
else |
else |
q = ONE; |
q = ONE; |
*rp = (Obj)q; break; |
*rp = (Obj)q; break; |
default: |
default: |
*rp = (Obj)ONE; break; |
*rp = (Obj)ONE; break; |
} |
} |
break; |
break; |
case O_P: |
case O_P: |
*rp = (Obj)ONE; break; |
*rp = (Obj)ONE; break; |
case O_R: |
case O_R: |
*rp = (Obj)DN((R)t); break; |
*rp = (Obj)DN((R)t); break; |
default: |
default: |
*rp = 0; |
*rp = 0; |
} |
} |
} |
} |
|
|
void Pderiv(arg,rp) |
void Pderiv(arg,rp) |
NODE arg; |
NODE arg; |
Obj *rp; |
Obj *rp; |
{ |
{ |
Obj a,t; |
Obj a,t; |
LIST l; |
LIST l; |
P v; |
P v; |
NODE n; |
NODE n; |
|
|
if ( !arg ) { |
if ( !arg ) { |
*rp = 0; return; |
*rp = 0; return; |
} |
} |
asir_assert(ARG0(arg),O_R,"diff"); |
asir_assert(ARG0(arg),O_R,"diff"); |
reductr(CO,(Obj)ARG0(arg),&a); |
reductr(CO,(Obj)ARG0(arg),&a); |
n = NEXT(arg); |
n = NEXT(arg); |
if ( n && (l = (LIST)ARG0(n)) && OID(l) == O_LIST ) |
if ( n && (l = (LIST)ARG0(n)) && OID(l) == O_LIST ) |
n = BDY(l); |
n = BDY(l); |
for ( ; n; n = NEXT(n) ) { |
for ( ; n; n = NEXT(n) ) { |
if ( !(v = (P)BDY(n)) || OID(v) != O_P ) |
if ( !(v = (P)BDY(n)) || OID(v) != O_P ) |
error("diff : invalid argument"); |
error("diff : invalid argument"); |
derivr(CO,a,VR(v),&t); a = t; |
derivr(CO,a,VR(v),&t); a = t; |
} |
} |
*rp = a; |
*rp = a; |
} |
} |
|
|
/* simple derivation with reduction */ |
/* simple derivation with reduction */ |
Line 153 void Prderiv(arg,rp) |
|
Line 153 void Prderiv(arg,rp) |
|
NODE arg; |
NODE arg; |
Obj *rp; |
Obj *rp; |
{ |
{ |
Obj a,t; |
Obj a,t; |
LIST l; |
LIST l; |
P v; |
P v; |
NODE n; |
NODE n; |
|
|
if ( !arg ) { |
if ( !arg ) { |
*rp = 0; return; |
*rp = 0; return; |
} |
} |
asir_assert(ARG0(arg),O_R,"rdiff"); |
asir_assert(ARG0(arg),O_R,"rdiff"); |
a = (Obj)ARG0(arg); |
a = (Obj)ARG0(arg); |
n = NEXT(arg); |
n = NEXT(arg); |
if ( n && (l = (LIST)ARG0(n)) && OID(l) == O_LIST ) |
if ( n && (l = (LIST)ARG0(n)) && OID(l) == O_LIST ) |
n = BDY(l); |
n = BDY(l); |
for ( ; n; n = NEXT(n) ) { |
for ( ; n; n = NEXT(n) ) { |
if ( !(v = (P)BDY(n)) || OID(v) != O_P ) |
if ( !(v = (P)BDY(n)) || OID(v) != O_P ) |
error("rdiff : invalid argument"); |
error("rdiff : invalid argument"); |
simple_derivr(CO,a,VR(v),&t); a = t; |
simple_derivr(CO,a,VR(v),&t); a = t; |
} |
} |
*rp = a; |
*rp = a; |
} |
} |
|
|
/* Euler derivation */ |
/* Euler derivation */ |
Line 179 void Pederiv(arg,rp) |
|
Line 179 void Pederiv(arg,rp) |
|
NODE arg; |
NODE arg; |
Obj *rp; |
Obj *rp; |
{ |
{ |
Obj a,t; |
Obj a,t; |
LIST l; |
LIST l; |
P v; |
P v; |
NODE n; |
NODE n; |
|
|
if ( !arg ) { |
if ( !arg ) { |
*rp = 0; return; |
*rp = 0; return; |
} |
} |
asir_assert(ARG0(arg),O_P,"ediff"); |
asir_assert(ARG0(arg),O_P,"ediff"); |
reductr(CO,(Obj)ARG0(arg),&a); |
reductr(CO,(Obj)ARG0(arg),&a); |
n = NEXT(arg); |
n = NEXT(arg); |
if ( n && (l = (LIST)ARG0(n)) && OID(l) == O_LIST ) |
if ( n && (l = (LIST)ARG0(n)) && OID(l) == O_LIST ) |
n = BDY(l); |
n = BDY(l); |
for ( ; n; n = NEXT(n) ) { |
for ( ; n; n = NEXT(n) ) { |
if ( !(v = (P)BDY(n)) || OID(v) != O_P ) |
if ( !(v = (P)BDY(n)) || OID(v) != O_P ) |
error("diff : invalid argument"); |
error("diff : invalid argument"); |
ediffp(CO,a,VR(v),&t); a = t; |
ediffp(CO,a,VR(v),&t); a = t; |
} |
} |
*rp = a; |
*rp = a; |
} |
} |