[BACK]Return to parif.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib2 / asir2018 / builtin

Annotation of OpenXM_contrib2/asir2018/builtin/parif.c, Revision 1.1

1.1     ! noro        1: /* $OpenXM$ */
        !             2: #include "ca.h"
        !             3: #include "parse.h"
        !             4: #include "ox.h"
        !             5:
        !             6: Q ox_pari_stream;
        !             7: int ox_pari_stream_initialized = 0;
        !             8: int ox_get_pari_result = 0;
        !             9: P ox_pari_starting_function = 0;
        !            10:
        !            11: typedef void (*mpfr_func)(NODE,Obj *);
        !            12:
        !            13: void Pmpfr_ai();
        !            14: void Pmpfr_eint(), Pmpfr_erf(),Pmpfr_li2();
        !            15: void Pmpfr_zeta();
        !            16: void Pmpfr_j0(), Pmpfr_j1();
        !            17: void Pmpfr_y0(), Pmpfr_y1();
        !            18: void Pmpfr_gamma(), Pmpfr_lngamma(), Pmpfr_digamma();
        !            19: void Pmpfr_floor(), Pmpfr_round(), Pmpfr_ceil();
        !            20:
        !            21: void Pox_shutdown(NODE arg,Q *rp);
        !            22: void Pox_launch_nox(NODE arg,Obj *rp);
        !            23: void Pox_push_cmo(NODE arg,Obj *rp);
        !            24: void Pox_pop_cmo(NODE arg,Obj *rp);
        !            25: void Pox_execute_function(NODE arg,Obj *rp);
        !            26:
        !            27: struct mpfr_tab_rec {
        !            28:   char *name;
        !            29:   mpfr_func func;
        !            30: } mpfr_tab[] = {
        !            31:   {"ai",Pmpfr_ai},
        !            32:   {"zeta",Pmpfr_zeta},
        !            33:   {"j0",Pmpfr_j0},
        !            34:   {"j1",Pmpfr_j1},
        !            35:   {"y0",Pmpfr_y0},
        !            36:   {"y1",Pmpfr_y1},
        !            37:   {"eint",Pmpfr_eint},
        !            38:   {"erf",Pmpfr_erf},
        !            39:   {"li2",Pmpfr_li2},
        !            40:   {"gamma",Pmpfr_gamma},
        !            41:   {"lngamma",Pmpfr_gamma},
        !            42:   {"digamma",Pmpfr_gamma},
        !            43:   {"floor",Pmpfr_floor},
        !            44:   {"ceil",Pmpfr_ceil},
        !            45:   {"round",Pmpfr_round},
        !            46: };
        !            47:
        !            48: mpfr_func mpfr_search(char *name)
        !            49: {
        !            50:   int i,n;
        !            51:
        !            52:   n = sizeof(mpfr_tab)/sizeof(struct mpfr_tab_rec);
        !            53:   for ( i = 0; i < n; i++ )
        !            54:     if ( !strcmp(name,mpfr_tab[i].name) )
        !            55:       return mpfr_tab[i].func;
        !            56:   return 0;
        !            57: }
        !            58:
        !            59: Obj list_to_vect(Obj a)
        !            60: {
        !            61:   int len,i;
        !            62:   VECT v;
        !            63:   NODE nd;
        !            64:
        !            65:   if ( !a || OID(a) != O_LIST ) return a;
        !            66:   len = length(BDY((LIST)a));
        !            67:   MKVECT(v,len);
        !            68:   for ( i = 0, nd = BDY((LIST)a); nd; nd = NEXT(nd), i++ )
        !            69:      v->body[i] = (pointer)list_to_vect((Obj)BDY(nd));
        !            70:   return (Obj)v;
        !            71: }
        !            72:
        !            73: Obj vect_to_mat(VECT v)
        !            74: {
        !            75:   MAT m;
        !            76:   int len,col,i,j;
        !            77:
        !            78:   len = v->len;
        !            79:   if ( v->body[0] && OID((Obj)v->body[0]) == O_VECT ) {
        !            80:     col = ((VECT)v->body[0])->len;
        !            81:   for ( i = 1; i < len; i++ )
        !            82:     if ( !v->body[i] || OID((Obj)v->body[i]) != O_VECT
        !            83:      || ((VECT)v->body[i])->len != col )
        !            84:     break;
        !            85:     if ( i == len ) {
        !            86:     /* convert to a matrix */
        !            87:     MKMAT(m,len,col);
        !            88:     for ( i = 0; i < len; i++ )
        !            89:       for ( j = 0; j < col; j++ )
        !            90:       m->body[i][j] = ((VECT)v->body[i])->body[j];
        !            91:     return (Obj)m;
        !            92:   }
        !            93:   }
        !            94:   return (Obj)v;
        !            95: }
        !            96:
        !            97: void reset_ox_pari()
        !            98: {
        !            99:   NODE nd;
        !           100:   Q r;
        !           101:
        !           102:   if ( ox_get_pari_result ) {
        !           103:   nd = mknode(1,ox_pari_stream);
        !           104:   Pox_shutdown(nd,&r);
        !           105:     ox_get_pari_result = 0;
        !           106:   ox_pari_stream_initialized = 0;
        !           107:   }
        !           108: }
        !           109:
        !           110: pointer evalparif(FUNC f,NODE arg)
        !           111: {
        !           112:   int ac,intarg,opt,prec;
        !           113:   Q q,r,cmd;
        !           114:   Z narg;
        !           115:   Real sec;
        !           116:   NODE nd,oxarg,t,t1,n;
        !           117:   STRING name;
        !           118:   USINT ui;
        !           119:   LIST list;
        !           120:   Obj ret,dmy;
        !           121:   mpfr_func mpfr_function;
        !           122:   V v;
        !           123:
        !           124:   if ( arg && ARG0(arg) && NID((Num)ARG0(arg)) != N_C
        !           125:     && (mpfr_function = mpfr_search(f->name)) ) {
        !           126:     (*mpfr_function)(arg,&ret);
        !           127:     return (pointer) ret;
        !           128:   }
        !           129:
        !           130:   if ( !ox_pari_stream_initialized ) {
        !           131:   if ( ox_pari_starting_function && OID(ox_pari_starting_function) == O_P ) {
        !           132:     v = VR(ox_pari_starting_function);
        !           133:     if ( (long)v->attr != V_SR ) {
        !           134:       error("pari : no handler.");
        !           135:     }
        !           136:     MKNODE(nd,0,0);
        !           137:     r = (Q)bevalf((FUNC)v->priv,0);
        !           138:   }else {
        !           139: #if !defined(VISUAL)
        !           140:   MKSTR(name,"ox_pari");
        !           141:   nd = mknode(2,NULL,name);
        !           142:   Pox_launch_nox(nd,(Obj *)&r);
        !           143: #else
        !           144:   error("Please load names.rr from latest asir-contrib library before using pari functions.");
        !           145: #endif
        !           146:   }
        !           147:   ox_pari_stream = r;
        !           148:     ox_pari_stream_initialized = 1;
        !           149:   }
        !           150:
        !           151:   ac = argc(arg);
        !           152:   /* reverse the arg list */
        !           153:   for ( n = arg, t = 0; n; n = NEXT(n) ) {
        !           154:     MKNODE(t1,BDY(n),t); t = t1;
        !           155:   }
        !           156:   /* push the reversed arg list */
        !           157:   for ( ; t; t = NEXT(t) ) {
        !           158:     oxarg = mknode(2,ox_pari_stream,BDY(t));
        !           159:     Pox_push_cmo(oxarg,&dmy);
        !           160:   }
        !           161:   MKSTR(name,f->name);
        !           162:   STOQ(ac,narg);
        !           163:   oxarg = mknode(3,ox_pari_stream,name,narg);
        !           164:   Pox_execute_function(oxarg,&dmy);
        !           165:   ox_get_pari_result = 1;
        !           166: #if defined(VISUAL) || defined(__MINGW32__)
        !           167: #define SM_popCMO 262
        !           168:   STOQ(SM_popCMO,cmd);
        !           169:   oxarg = mknode(2,ox_pari_stream,cmd);
        !           170:   Pox_push_cmd(oxarg,&dmy);
        !           171:   nd = mknode(1,ox_pari_stream);
        !           172:   MKLIST(list,nd);
        !           173:   MKReal(1.0/8,sec);
        !           174:   oxarg = mknode(2,list,sec);
        !           175:   ret=0;
        !           176:   do {
        !           177:     check_intr();
        !           178:     Pox_select(oxarg,&list);
        !           179:     oxarg = mknode(1,list);
        !           180:     Plength(oxarg,&ret);
        !           181:   }while (!ret);
        !           182:   oxarg = mknode(1,ox_pari_stream);
        !           183:   Pox_get(oxarg,&ret);
        !           184: #else
        !           185:   oxarg = mknode(1,ox_pari_stream);
        !           186:   Pox_pop_cmo(oxarg,&ret);
        !           187: #endif
        !           188:   ox_get_pari_result = 0;
        !           189:   if ( ret && OID(ret) == O_ERR ) {
        !           190:     char buf[BUFSIZ];
        !           191:     soutput_init(buf);
        !           192:     sprintexpr(CO,((ERR)ret)->body);
        !           193:     error(buf);
        !           194:   }
        !           195:   if ( ret && OID(ret) == O_LIST ) {
        !           196:     ret = list_to_vect(ret);
        !           197:   ret = vect_to_mat((VECT)ret);
        !           198:   }
        !           199:   return ret;
        !           200: }
        !           201:
        !           202: struct pariftab {
        !           203:   char *name;
        !           204:   int dmy;
        !           205:   int type;
        !           206: };
        !           207:
        !           208: /*
        !           209:  * type = 1 => argc = 1, second arg = precision
        !           210:  * type = 2 => argc = 1, second arg = (long int)0
        !           211:  *
        !           212:  */
        !           213: /*
        !           214: {"abs",0,1},
        !           215: {"adj",0,1},
        !           216: */
        !           217:
        !           218: struct pariftab pariftab[] = {
        !           219: {"arg",0,1},
        !           220: {"bigomega",0,1},
        !           221: {"binary",0,1},
        !           222: {"ceil",0,1},
        !           223: {"centerlift",0,1},
        !           224: {"cf",0,1},
        !           225: {"classno",0,1},
        !           226: {"classno2",0,1},
        !           227: {"conj",0,1},
        !           228: {"content",0,1},
        !           229: {"denom",0,1},
        !           230: {"det",0,1},
        !           231: {"det2",0,1},
        !           232: {"dilog",0,1},
        !           233: {"disc",0,1},
        !           234: {"discf",0,1},
        !           235: {"divisors",0,1},
        !           236: {"eigen",0,1},
        !           237: {"eintg1",0,1},
        !           238: {"erfc",0,1},
        !           239: {"eta",0,1},
        !           240: {"floor",0,1},
        !           241: {"frac",0,1},
        !           242: {"galois",0,1},
        !           243: {"galoisconj",0,1},
        !           244: {"gamh",0,1},
        !           245: {"gamma",0,1},
        !           246: {"hclassno",0,1},
        !           247: {"hermite",0,1},
        !           248: {"hess",0,1},
        !           249: {"imag",0,1},
        !           250: {"image",0,1},
        !           251: {"image2",0,1},
        !           252: {"indexrank",0,1},
        !           253: {"indsort",0,1},
        !           254: {"initalg",0,1},
        !           255: {"isfund",0,1},
        !           256: {"ispsp",0,1},
        !           257: {"isqrt",0,1},
        !           258: {"issqfree",0,1},
        !           259: {"issquare",0,1},
        !           260: {"jacobi",0,1},
        !           261: {"jell",0,1},
        !           262: {"ker",0,1},
        !           263: {"keri",0,1},
        !           264: {"kerint",0,1},
        !           265: {"kerintg1",0,1},
        !           266: {"length",0,1},
        !           267: {"lexsort",0,1},
        !           268: {"lift",0,1},
        !           269: {"lindep",0,1},
        !           270: {"lll",0,1},
        !           271: {"lllgen",0,1},
        !           272: {"lllgram",0,1},
        !           273: {"lllgramgen",0,1},
        !           274: {"lllgramint",0,1},
        !           275: {"lllgramkerim",0,1},
        !           276: {"lllgramkerimgen",0,1},
        !           277: {"lllint",0,1},
        !           278: {"lllkerim",0,1},
        !           279: {"lllkerimgen",0,1},
        !           280: {"lngamma",0,1},
        !           281: {"logagm",0,1},
        !           282: {"mat",0,1},
        !           283: {"matrixqz2",0,1},
        !           284: {"matrixqz3",0,1},
        !           285: {"matsize",0,1},
        !           286: {"modreverse",0,1},
        !           287: {"mu",0,1},
        !           288: {"nextprime",0,1},
        !           289: {"norm",0,1},
        !           290: {"norml2",0,1},
        !           291: {"numdiv",0,1},
        !           292: {"numer",0,1},
        !           293: {"omega",0,1},
        !           294: {"order",0,1},
        !           295: {"ordred",0,1},
        !           296: {"phi",0,1},
        !           297: {"pnqn",0,1},
        !           298: {"polred",0,1},
        !           299: {"polred2",0,1},
        !           300: {"primroot",0,1},
        !           301: {"psi",0,1},
        !           302: {"quadgen",0,1},
        !           303: {"quadpoly",0,1},
        !           304: {"real",0,1},
        !           305: {"recip",0,1},
        !           306: {"redreal",0,1},
        !           307: {"regula",0,1},
        !           308: {"reorder",0,1},
        !           309: {"reverse",0,1},
        !           310: {"rhoreal",0,1},
        !           311: {"roots",0,1},
        !           312: {"round",0,1},
        !           313: {"sigma",0,1},
        !           314: {"signat",0,1},
        !           315: {"simplify",0,1},
        !           316: {"smalldiscf",0,1},
        !           317: {"smallfact",0,1},
        !           318: {"smallpolred",0,1},
        !           319: {"smallpolred2",0,1},
        !           320: {"smith",0,1},
        !           321: {"smith2",0,1},
        !           322: {"sort",0,1},
        !           323: {"sqr",0,1},
        !           324: {"sqred",0,1},
        !           325: {"sqrt",0,1},
        !           326: {"supplement",0,1},
        !           327: {"trace",0,1},
        !           328: {"trans",0,1},
        !           329: {"trunc",0,1},
        !           330: {"unit",0,1},
        !           331: {"vec",0,1},
        !           332: {"wf",0,1},
        !           333: {"wf2",0,1},
        !           334: {"zeta",0,1},
        !           335: {"factor",0,1},
        !           336:
        !           337: {"allocatemem",0,0},
        !           338:
        !           339: {"factpol",0,2},
        !           340: {"isprime",0,2},
        !           341: {"factorint",0,2},
        !           342: {0,0,0},
        !           343: };
        !           344:
        !           345: void parif_init() {
        !           346:   int i;
        !           347:
        !           348:   for ( i = 0, parif = 0; pariftab[i].name; i++ )
        !           349:      appendparif(&parif,pariftab[i].name, 0,pariftab[i].type);
        !           350: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>