view ch.c @ 0:e0bbaa717f41 draft default tip

lol J
author Jordi Gutiérrez Hermoso <jordigh@octave.org>
date Mon, 25 Nov 2013 11:56:30 -0500
parents
children
line wrap: on
line source

/* Copyright 1990-2011, Jsoftware Inc.  All rights reserved. */
/* License in license.txt.                                   */
/*                                                                         */
/* Conjunctions: Hypergeometric Series                                     */

#include "j.h"


static A jthparm(J jt,A j,A f,A h){A z;
 if(!(VERB&AT(f)))R shift1(aslash(CSTAR,atab(CPLUS,h,j)));
 RZ(z=CALL1(VAV(f)->f1,j,f));
 ASSERT(1>=AR(z),EVRANK); 
 ASSERT(!AR(z)||AN(j)==AN(z),EVLENGTH);
 R z;
}

static A jthgv(J jt,B b,I n,A w,A self){A c,d,e,h,*hv,j,y;V*sv=VAV(self);
 RZ(j=IX(n)); h=sv->h; hv=AAV(h);
 c=hparm(j,sv->f,hv[0]);
 d=hparm(j,sv->g,hv[1]);
 e=shift1(divide(w,apv(n,1L,1L)));
 switch((VERB&AT(sv->f)?2:0)+(VERB&AT(sv->g)?1:0)){
  case 0: y=ascan(CSTAR,divide(tymes(c,e),d)); break;
  case 1: y=divide(ascan(CSTAR,tymes(c,e)),d); break;
  case 2: y=divide(tymes(c,ascan(CSTAR,e)),ascan(CSTAR,d)); break;
  case 3: y=divide(tymes(c,ascan(CSTAR,e)),d);
 }
 R b?over(zero,ascan(CPLUS,y)):aslash(CPLUS,y);
}    /* verb or complex cases */

static A jthgd(J jt,B b,I n,A w,A p,A q){A c,d,e,z;D r,s,t,*u,*v,x,*zv;I j,pn,qn;
 RZ(c=cvt(FL,p)); u=DAV(c); pn=AN(c);
 RZ(d=cvt(FL,q)); v=DAV(d); qn=AN(d);
 RZ(e=cvt(FL,w)); x=*DAV(e); r=s=1; t=0; z=0;
 if(b&&2000>n){GA(z,FL,1+n,1,0); zv=DAV(z); *zv++=0; *zv++=1;}
 NAN0;
 for(j=1;j<n&&t!=s&&!_isnan(s);++j){
  DO(pn, r*=u[i]; ++u[i];);  /* r*=u[i]++; compiler error on 3B1 */
  DO(qn, r/=v[i]; ++v[i];); 
  r*=x/j; t=s; s+=r; if(z)*zv++=s; JBREAK0;
 }
 NAN1;
 R !b?scf(s):z?take(sc(1+j),z):hgd(b,j,w,p,q);
}    /* real vector p,q; real scalar w; all terms (1=b) or last term (0=b) */

static DF2(jthgeom2){PROLOG;A h,*hv,t,z;B b;I an,*av,j,n;V*sv=VAV(self);
 RZ(a&&w);
 if(AR(w))R rank2ex(a,w,self,0L,0L,jthgeom2);
 RZ(a=AT(a)&FL+CMPX?vib(a):vi(a));
 an=AN(a); av=AV(a); n=0; DO(an, j=av[i]; ASSERT(0<=j,EVDOMAIN); if(n<j)n=j;);
 if(!n)R tymes(zero,a);
 h=sv->h; hv=AAV(h);
 b=VERB&(AT(sv->f)|AT(sv->g))||CMPX&(AT(w)|AT(hv[0])|AT(hv[1]));
 if(!b)z=hgd((B)(1<an),n,w,hv[0],hv[1]);
 else if(2000>n)z=hgv((B)(1<an),n,w,self);
 else{
  j=10; t=mtv; z=one;
  while(z&&!equ(z,t)){t=z; z=hgv(0,j,w,self); j+=j;} 
  RZ(z); if(1<an)z=hgv(1,j,w,self);
 }
 if(1<an)z=from(minimum(a,sc(IC(z)-1)),z);
 EPILOG(z);
}

static DF1(jthgeom1){R hgeom2(sc(IMAX),w,self);}

static F2(jtcancel){A c,d,f,x,y;
 f=eval("#/.~");
 a=ravel(a); x=nub(a); c=df1(a,f);
 w=ravel(w); y=nub(w); d=df1(w,f);
 a=repeat(maximum(zero,minus(c,from(indexof(y,x),over(d,zero)))),x);
 w=repeat(maximum(zero,minus(d,from(indexof(x,y),over(c,zero)))),y);
 R link(a,w);
}

F2(jthgeom){A c,d,h=0;B p,q;I at,wt;
 RZ(a&&w);
 at=AT(a); p=1&&at&NOUN; c=d=mtv;
 wt=AT(w); q=1&&wt&NOUN;
 if(p){c=a; ASSERT(!AN(a)||at&NUMERIC,EVDOMAIN); ASSERT(1>=AR(a),EVRANK);}
 if(q){d=w; ASSERT(!AN(w)||wt&NUMERIC,EVDOMAIN); ASSERT(1>=AR(w),EVRANK);}
 RZ(h=cancel(c,d));
 R fdef(CHGEOM,VERB, jthgeom1,jthgeom2, a,w,h, 0L, 0L,0L,0L);
}    /* a H. w */

F1(jthgdiff){A*hv,p,q,x,y;V*v=VAV(w);
 ASSERTNN(v->f,v->g);
 hv=AAV(v->h); 
 x=hv[0]; x=1==AN(x)?head(x):x;
 y=hv[1]; y=1==AN(y)?head(y):y;
 p=divide(aslash(CSTAR,x),aslash(CSTAR,y));
 q=hgeom(increm(x),increm(y));
 R equ(p,one)?q:folk(qq(p,zero),ds(CSTAR),q);
}    /* a H. w D. 1 */

DF1(jthgcoeff){PROLOG;A c,d,h,*hv,y,z;B b;I j,n,pn,qn,*v;V*sv=VAV(self);
 RZ(w=vi(w)); v=AV(w); 
 n=0; DO(AN(w), j=v[i]; ASSERT(0<=j,EVDOMAIN); if(n<j)n=j;);
 if(!n)R eq(w,w);
 h=sv->h; hv=AAV(h);
 b=VERB&(AT(sv->f)|AT(sv->g))||CMPX&(AT(w)|AT(hv[0])|AT(hv[1]));
 if(!b){D r=1.0,*u,*v,*yv;
  RZ(c=cvt(FL,hv[0])); u=DAV(c); pn=AN(c);
  RZ(d=cvt(FL,hv[1])); v=DAV(d); qn=AN(d);
  GA(y,FL,n,1,0); yv=DAV(y);
  DO(n, DO(pn, r*=u[i]; ++u[i];); DO(qn, r/=v[i]; ++v[i];); yv[i]=r;); 
 }else{A j;
  RZ(j=IX(n));
  c=hparm(j,sv->f,hv[0]);
  d=hparm(j,sv->g,hv[1]);
  switch((VERB&AT(sv->f)?2:0)+(VERB&AT(sv->g)?1:0)){
   case 0: y=ascan(CSTAR,divide(c,d)); break;
   case 1: y=divide(ascan(CSTAR,c),d); break;
   case 2: y=divide(c,ascan(CSTAR,d)); break;
   case 3: y=divide(c,d);
 }}
 RZ(z=from(w,over(one,y)));
 EPILOG(z);
}    /* coefficients indexed by w excluding !j */