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

Annotation of OpenXM_contrib2/asir2000/builtin/dp.c, Revision 1.12

1.5       noro        1: /*
                      2:  * Copyright (c) 1994-2000 FUJITSU LABORATORIES LIMITED
                      3:  * All rights reserved.
                      4:  *
                      5:  * FUJITSU LABORATORIES LIMITED ("FLL") hereby grants you a limited,
                      6:  * non-exclusive and royalty-free license to use, copy, modify and
                      7:  * redistribute, solely for non-commercial and non-profit purposes, the
                      8:  * computer program, "Risa/Asir" ("SOFTWARE"), subject to the terms and
                      9:  * conditions of this Agreement. For the avoidance of doubt, you acquire
                     10:  * only a limited right to use the SOFTWARE hereunder, and FLL or any
                     11:  * third party developer retains all rights, including but not limited to
                     12:  * copyrights, in and to the SOFTWARE.
                     13:  *
                     14:  * (1) FLL does not grant you a license in any way for commercial
                     15:  * purposes. You may use the SOFTWARE only for non-commercial and
                     16:  * non-profit purposes only, such as academic, research and internal
                     17:  * business use.
                     18:  * (2) The SOFTWARE is protected by the Copyright Law of Japan and
                     19:  * international copyright treaties. If you make copies of the SOFTWARE,
                     20:  * with or without modification, as permitted hereunder, you shall affix
                     21:  * to all such copies of the SOFTWARE the above copyright notice.
                     22:  * (3) An explicit reference to this SOFTWARE and its copyright owner
                     23:  * shall be made on your publication or presentation in any form of the
                     24:  * results obtained by use of the SOFTWARE.
                     25:  * (4) In the event that you modify the SOFTWARE, you shall notify FLL by
1.6       noro       26:  * e-mail at risa-admin@sec.flab.fujitsu.co.jp of the detailed specification
1.5       noro       27:  * for such modification or the source code of the modified part of the
                     28:  * SOFTWARE.
                     29:  *
                     30:  * THE SOFTWARE IS PROVIDED AS IS WITHOUT ANY WARRANTY OF ANY KIND. FLL
                     31:  * MAKES ABSOLUTELY NO WARRANTIES, EXPRESSED, IMPLIED OR STATUTORY, AND
                     32:  * EXPRESSLY DISCLAIMS ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS
                     33:  * FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT OF THIRD PARTIES'
                     34:  * RIGHTS. NO FLL DEALER, AGENT, EMPLOYEES IS AUTHORIZED TO MAKE ANY
                     35:  * MODIFICATIONS, EXTENSIONS, OR ADDITIONS TO THIS WARRANTY.
                     36:  * UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, TORT, CONTRACT,
                     37:  * OR OTHERWISE, SHALL FLL BE LIABLE TO YOU OR ANY OTHER PERSON FOR ANY
                     38:  * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, PUNITIVE OR CONSEQUENTIAL
                     39:  * DAMAGES OF ANY CHARACTER, INCLUDING, WITHOUT LIMITATION, DAMAGES
                     40:  * ARISING OUT OF OR RELATING TO THE SOFTWARE OR THIS AGREEMENT, DAMAGES
                     41:  * FOR LOSS OF GOODWILL, WORK STOPPAGE, OR LOSS OF DATA, OR FOR ANY
                     42:  * DAMAGES, EVEN IF FLL SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF
                     43:  * SUCH DAMAGES, OR FOR ANY CLAIM BY ANY OTHER PARTY. EVEN IF A PART
                     44:  * OF THE SOFTWARE HAS BEEN DEVELOPED BY A THIRD PARTY, THE THIRD PARTY
                     45:  * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE,
                     46:  * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE.
                     47:  *
1.12    ! noro       48:  * $OpenXM: OpenXM_contrib2/asir2000/builtin/dp.c,v 1.11 2000/12/08 08:26:08 noro Exp $
1.5       noro       49: */
1.1       noro       50: #include "ca.h"
                     51: #include "base.h"
                     52: #include "parse.h"
                     53:
                     54: extern int dp_fcoeffs;
1.8       noro       55: extern int dp_nelim;
                     56: extern int dp_order_pair_length;
                     57: extern struct order_pair *dp_order_pair;
                     58: extern struct order_spec dp_current_spec;
                     59:
1.11      noro       60: int do_weyl;
1.1       noro       61:
                     62: void Pdp_ord(), Pdp_ptod(), Pdp_dtop();
                     63: void Pdp_ptozp(), Pdp_ptozp2(), Pdp_red(), Pdp_red2(), Pdp_lcm(), Pdp_redble();
                     64: void Pdp_sp(), Pdp_hm(), Pdp_ht(), Pdp_hc(), Pdp_rest(), Pdp_td(), Pdp_sugar();
                     65: void Pdp_cri1(),Pdp_cri2(),Pdp_subd(),Pdp_mod(),Pdp_red_mod(),Pdp_tdiv();
                     66: void Pdp_prim(),Pdp_red_coef(),Pdp_mag(),Pdp_set_kara(),Pdp_rat();
1.9       noro       67: void Pdp_nf(),Pdp_true_nf();
1.1       noro       68: void Pdp_nf_mod(),Pdp_true_nf_mod();
                     69: void Pdp_criB(),Pdp_nelim();
1.9       noro       70: void Pdp_minp(),Pdp_sp_mod();
1.1       noro       71: void Pdp_homo(),Pdp_dehomo();
                     72: void Pdp_gr_mod_main();
                     73: void Pdp_gr_main(),Pdp_gr_hm_main(),Pdp_gr_d_main(),Pdp_gr_flags();
                     74: void Pdp_f4_main(),Pdp_f4_mod_main();
                     75: void Pdp_gr_print();
1.8       noro       76: void Pdp_mbase(),Pdp_lnf_mod(),Pdp_nf_tab_mod(),Pdp_mdtod();
                     77: void Pdp_vtoe(), Pdp_etov(), Pdp_dtov(), Pdp_idiv(), Pdp_sep();
                     78: void Pdp_cont();
1.1       noro       79:
1.11      noro       80: void Pdp_weyl_red(),Pdp_weyl_sp(),Pdp_weyl_nf();
                     81: void Pdp_weyl_gr_main(),Pdp_weyl_gr_mod_main();
                     82: void Pdp_weyl_f4_main(),Pdp_weyl_f4_mod_main();
1.12    ! noro       83: void Pdp_weyl_mul();
1.11      noro       84:
1.1       noro       85: struct ftab dp_tab[] = {
1.8       noro       86:        /* content reduction */
1.1       noro       87:        {"dp_ptozp",Pdp_ptozp,1},
                     88:        {"dp_ptozp2",Pdp_ptozp2,2},
                     89:        {"dp_prim",Pdp_prim,1},
1.8       noro       90:        {"dp_red_coef",Pdp_red_coef,2},
                     91:        {"dp_cont",Pdp_cont,1},
                     92:
1.11      noro       93: /* polynomial ring */
1.8       noro       94:        /* s-poly */
                     95:        {"dp_sp",Pdp_sp,2},
                     96:        {"dp_sp_mod",Pdp_sp_mod,3},
                     97:
                     98:        /* m-reduction */
1.1       noro       99:        {"dp_red",Pdp_red,3},
                    100:        {"dp_red_mod",Pdp_red_mod,4},
1.8       noro      101:
                    102:        /* normal form */
1.1       noro      103:        {"dp_nf",Pdp_nf,4},
                    104:        {"dp_true_nf",Pdp_true_nf,4},
                    105:        {"dp_nf_mod",Pdp_nf_mod,5},
                    106:        {"dp_true_nf_mod",Pdp_true_nf_mod,5},
1.8       noro      107:        {"dp_lnf_mod",Pdp_lnf_mod,3},
                    108:        {"dp_nf_tab_mod",Pdp_nf_tab_mod,3},
                    109:
                    110:        /* Buchberger algorithm */
1.1       noro      111:        {"dp_gr_main",Pdp_gr_main,5},
                    112:        {"dp_gr_mod_main",Pdp_gr_mod_main,5},
1.8       noro      113:
                    114:        /* F4 algorithm */
1.1       noro      115:        {"dp_f4_main",Pdp_f4_main,3},
                    116:        {"dp_f4_mod_main",Pdp_f4_mod_main,4},
1.8       noro      117:
1.11      noro      118: /* weyl algebra */
1.12    ! noro      119:        /* multiplication */
        !           120:        {"dp_weyl_mul",Pdp_weyl_mul,2},
        !           121:
1.11      noro      122:        /* s-poly */
                    123:        {"dp_weyl_sp",Pdp_weyl_sp,2},
                    124:
                    125:        /* m-reduction */
                    126:        {"dp_weyl_red",Pdp_weyl_red,3},
                    127:
                    128:        /* normal form */
                    129:        {"dp_weyl_nf",Pdp_weyl_nf,4},
                    130:
                    131:        /* Buchberger algorithm */
                    132:        {"dp_weyl_gr_main",Pdp_weyl_gr_main,5},
                    133:        {"dp_weyl_gr_mod_main",Pdp_weyl_gr_mod_main,5},
                    134:
                    135:        /* F4 algorithm */
                    136:        {"dp_weyl_f4_main",Pdp_weyl_f4_main,3},
                    137:        {"dp_weyl_f4_mod_main",Pdp_weyl_f4_mod_main,4},
                    138:
1.8       noro      139:        {0,0,0},
                    140: };
                    141:
                    142: struct ftab dp_supp_tab[] = {
                    143:        /* setting flags */
                    144:        {"dp_ord",Pdp_ord,-1},
                    145:        {"dp_set_kara",Pdp_set_kara,-1},
                    146:        {"dp_nelim",Pdp_nelim,-1},
1.1       noro      147:        {"dp_gr_flags",Pdp_gr_flags,-1},
                    148:        {"dp_gr_print",Pdp_gr_print,-1},
1.8       noro      149:
                    150:        /* converters */
                    151:        {"dp_ptod",Pdp_ptod,2},
                    152:        {"dp_dtop",Pdp_dtop,2},
                    153:        {"dp_homo",Pdp_homo,1},
                    154:        {"dp_dehomo",Pdp_dehomo,1},
                    155:        {"dp_etov",Pdp_etov,1},
                    156:        {"dp_vtoe",Pdp_vtoe,1},
                    157:        {"dp_dtov",Pdp_dtov,1},
                    158:        {"dp_mdtod",Pdp_mdtod,1},
                    159:        {"dp_mod",Pdp_mod,3},
                    160:        {"dp_rat",Pdp_rat,1},
                    161:
                    162:        /* criteria */
                    163:        {"dp_cri1",Pdp_cri1,2},
                    164:        {"dp_cri2",Pdp_cri2,2},
                    165:        {"dp_criB",Pdp_criB,3},
                    166:
                    167:        /* simple operation */
                    168:        {"dp_subd",Pdp_subd,2},
                    169:        {"dp_lcm",Pdp_lcm,2},
                    170:        {"dp_hm",Pdp_hm,1},
                    171:        {"dp_ht",Pdp_ht,1},
                    172:        {"dp_hc",Pdp_hc,1},
                    173:        {"dp_rest",Pdp_rest,1},
                    174:
                    175:        /* degree and size */
                    176:        {"dp_td",Pdp_td,1},
                    177:        {"dp_mag",Pdp_mag,1},
                    178:        {"dp_sugar",Pdp_sugar,1},
                    179:
                    180:        /* misc */
                    181:        {"dp_mbase",Pdp_mbase,1},
                    182:        {"dp_redble",Pdp_redble,2},
                    183:        {"dp_sep",Pdp_sep,2},
                    184:        {"dp_idiv",Pdp_idiv,2},
                    185:        {"dp_tdiv",Pdp_tdiv,2},
                    186:        {"dp_minp",Pdp_minp,2},
                    187:
                    188:        {0,0,0}
1.1       noro      189: };
                    190:
1.8       noro      191: void Pdp_mdtod(arg,rp)
                    192: NODE arg;
                    193: DP *rp;
                    194: {
                    195:        MP m,mr,mr0;
                    196:        DP p;
                    197:        P t;
                    198:
                    199:        p = (DP)ARG0(arg);
                    200:        if ( !p )
                    201:                *rp = 0;
                    202:        else {
                    203:                for ( mr0 = 0, m = BDY(p); m; m = NEXT(m) ) {
                    204:                        mptop(m->c,&t); NEXTMP(mr0,mr); mr->c = t; mr->dl = m->dl;
                    205:                }
                    206:                NEXT(mr) = 0; MKDP(p->nv,mr0,*rp); (*rp)->sugar = p->sugar;
                    207:        }
                    208: }
                    209:
                    210: void Pdp_sep(arg,rp)
                    211: NODE arg;
                    212: VECT *rp;
                    213: {
                    214:        DP p,r;
                    215:        MP m,t;
                    216:        MP *w0,*w;
                    217:        int i,n,d,nv,sugar;
                    218:        VECT v;
                    219:        pointer *pv;
                    220:
                    221:        p = (DP)ARG0(arg); m = BDY(p);
                    222:        d = QTOS((Q)ARG1(arg));
                    223:        for ( t = m, n = 0; t; t = NEXT(t), n++ );
                    224:        if ( d > n )
                    225:                d = n;
                    226:        MKVECT(v,d); *rp = v;
                    227:        pv = BDY(v); nv = p->nv; sugar = p->sugar;
                    228:        w0 = (MP *)MALLOC(d*sizeof(MP)); bzero(w0,d*sizeof(MP));
                    229:        w = (MP *)MALLOC(d*sizeof(MP)); bzero(w,d*sizeof(MP));
                    230:        for ( t = BDY(p), i = 0; t; t = NEXT(t), i++, i %= d  ) {
                    231:                NEXTMP(w0[i],w[i]); w[i]->c = t->c; w[i]->dl = t->dl;
                    232:        }
                    233:        for ( i = 0; i < d; i++ ) {
                    234:                NEXT(w[i]) = 0; MKDP(nv,w0[i],r); r->sugar = sugar;
                    235:                pv[i] = (pointer)r;
                    236:        }
                    237: }
                    238:
                    239: void Pdp_idiv(arg,rp)
                    240: NODE arg;
                    241: DP *rp;
                    242: {
                    243:        dp_idiv((DP)ARG0(arg),(Q)ARG1(arg),rp);
                    244: }
                    245:
                    246: void Pdp_cont(arg,rp)
                    247: NODE arg;
                    248: Q *rp;
                    249: {
                    250:        dp_cont((DP)ARG0(arg),rp);
                    251: }
                    252:
                    253: void Pdp_dtov(arg,rp)
                    254: NODE arg;
                    255: VECT *rp;
                    256: {
                    257:        dp_dtov((DP)ARG0(arg),rp);
                    258: }
                    259:
                    260: void Pdp_mbase(arg,rp)
                    261: NODE arg;
                    262: LIST *rp;
                    263: {
                    264:        NODE mb;
                    265:
                    266:        asir_assert(ARG0(arg),O_LIST,"dp_mbase");
                    267:        dp_mbase(BDY((LIST)ARG0(arg)),&mb);
                    268:        MKLIST(*rp,mb);
                    269: }
                    270:
                    271: void Pdp_etov(arg,rp)
                    272: NODE arg;
                    273: VECT *rp;
                    274: {
                    275:        DP dp;
                    276:        int n,i;
                    277:        int *d;
                    278:        VECT v;
                    279:        Q t;
                    280:
                    281:        dp = (DP)ARG0(arg);
                    282:        asir_assert(dp,O_DP,"dp_etov");
                    283:        n = dp->nv; d = BDY(dp)->dl->d;
                    284:        MKVECT(v,n);
                    285:        for ( i = 0; i < n; i++ ) {
                    286:                STOQ(d[i],t); v->body[i] = (pointer)t;
                    287:        }
                    288:        *rp = v;
                    289: }
                    290:
                    291: void Pdp_vtoe(arg,rp)
                    292: NODE arg;
                    293: DP *rp;
                    294: {
                    295:        DP dp;
                    296:        DL dl;
                    297:        MP m;
                    298:        int n,i,td;
                    299:        int *d;
                    300:        VECT v;
                    301:
                    302:        v = (VECT)ARG0(arg);
                    303:        asir_assert(v,O_VECT,"dp_vtoe");
                    304:        n = v->len;
                    305:        NEWDL(dl,n); d = dl->d;
                    306:        for ( i = 0, td = 0; i < n; i++ ) {
                    307:                d[i] = QTOS((Q)(v->body[i])); td += d[i];
                    308:        }
                    309:        dl->td = td;
                    310:        NEWMP(m); m->dl = dl; m->c = (P)ONE; NEXT(m) = 0;
                    311:        MKDP(n,m,dp); dp->sugar = td;
                    312:        *rp = dp;
                    313: }
                    314:
                    315: void Pdp_lnf_mod(arg,rp)
                    316: NODE arg;
                    317: LIST *rp;
                    318: {
                    319:        DP r1,r2;
                    320:        NODE b,g,n;
                    321:        int mod;
                    322:
                    323:        asir_assert(ARG0(arg),O_LIST,"dp_lnf_mod");
                    324:        asir_assert(ARG1(arg),O_LIST,"dp_lnf_mod");
                    325:        asir_assert(ARG2(arg),O_N,"dp_lnf_mod");
                    326:        b = BDY((LIST)ARG0(arg)); g = BDY((LIST)ARG1(arg));
                    327:        mod = QTOS((Q)ARG2(arg));
                    328:        dp_lnf_mod((DP)BDY(b),(DP)BDY(NEXT(b)),g,mod,&r1,&r2);
                    329:        NEWNODE(n); BDY(n) = (pointer)r1;
                    330:        NEWNODE(NEXT(n)); BDY(NEXT(n)) = (pointer)r2;
                    331:        NEXT(NEXT(n)) = 0; MKLIST(*rp,n);
                    332: }
                    333:
                    334: void Pdp_nf_tab_mod(arg,rp)
                    335: NODE arg;
                    336: DP *rp;
                    337: {
                    338:        asir_assert(ARG0(arg),O_DP,"dp_nf_tab_mod");
                    339:        asir_assert(ARG1(arg),O_VECT,"dp_nf_tab_mod");
                    340:        asir_assert(ARG2(arg),O_N,"dp_nf_tab_mod");
                    341:        dp_nf_tab_mod((DP)ARG0(arg),(LIST *)BDY((VECT)ARG1(arg)),
                    342:                QTOS((Q)ARG2(arg)),rp);
                    343: }
1.1       noro      344:
                    345: void Pdp_ord(arg,rp)
                    346: NODE arg;
                    347: Obj *rp;
                    348: {
                    349:        struct order_spec spec;
                    350:
                    351:        if ( !arg )
                    352:                *rp = dp_current_spec.obj;
                    353:        else if ( !create_order_spec((Obj)ARG0(arg),&spec) )
                    354:                error("dp_ord : invalid order specification");
                    355:        else {
                    356:                initd(&spec); *rp = spec.obj;
                    357:        }
                    358: }
                    359:
                    360: void Pdp_ptod(arg,rp)
                    361: NODE arg;
                    362: DP *rp;
                    363: {
                    364:        NODE n;
                    365:        VL vl,tvl;
                    366:
                    367:        asir_assert(ARG0(arg),O_P,"dp_ptod");
                    368:        asir_assert(ARG1(arg),O_LIST,"dp_ptod");
                    369:        for ( vl = 0, n = BDY((LIST)ARG1(arg)); n; n = NEXT(n) ) {
                    370:                if ( !vl ) {
                    371:                        NEWVL(vl); tvl = vl;
                    372:                } else {
                    373:                        NEWVL(NEXT(tvl)); tvl = NEXT(tvl);
                    374:                }
                    375:                VR(tvl) = VR((P)BDY(n));
                    376:        }
                    377:        if ( vl )
                    378:                NEXT(tvl) = 0;
                    379:        ptod(CO,vl,(P)ARG0(arg),rp);
                    380: }
                    381:
                    382: void Pdp_dtop(arg,rp)
                    383: NODE arg;
                    384: P *rp;
                    385: {
                    386:        NODE n;
                    387:        VL vl,tvl;
                    388:
                    389:        asir_assert(ARG0(arg),O_DP,"dp_dtop");
                    390:        asir_assert(ARG1(arg),O_LIST,"dp_dtop");
                    391:        for ( vl = 0, n = BDY((LIST)ARG1(arg)); n; n = NEXT(n) ) {
                    392:                if ( !vl ) {
                    393:                        NEWVL(vl); tvl = vl;
                    394:                } else {
                    395:                        NEWVL(NEXT(tvl)); tvl = NEXT(tvl);
                    396:                }
                    397:                VR(tvl) = VR((P)BDY(n));
                    398:        }
                    399:        if ( vl )
                    400:                NEXT(tvl) = 0;
                    401:        dtop(CO,vl,(DP)ARG0(arg),rp);
                    402: }
                    403:
                    404: extern LIST Dist;
                    405:
                    406: void Pdp_ptozp(arg,rp)
                    407: NODE arg;
                    408: DP *rp;
                    409: {
                    410:        asir_assert(ARG0(arg),O_DP,"dp_ptozp");
1.10      noro      411:        dp_ptozp((DP)ARG0(arg),rp);
1.1       noro      412: }
                    413:
                    414: void Pdp_ptozp2(arg,rp)
                    415: NODE arg;
                    416: LIST *rp;
                    417: {
                    418:        DP p0,p1,h,r;
                    419:        NODE n0;
                    420:
                    421:        p0 = (DP)ARG0(arg); p1 = (DP)ARG1(arg);
                    422:        asir_assert(p0,O_DP,"dp_ptozp2");
                    423:        asir_assert(p1,O_DP,"dp_ptozp2");
1.10      noro      424:        dp_ptozp2(p0,p1,&h,&r);
1.1       noro      425:        NEWNODE(n0); BDY(n0) = (pointer)h;
                    426:        NEWNODE(NEXT(n0)); BDY(NEXT(n0)) = (pointer)r;
                    427:        NEXT(NEXT(n0)) = 0;
                    428:        MKLIST(*rp,n0);
                    429: }
                    430:
                    431: void Pdp_prim(arg,rp)
                    432: NODE arg;
                    433: DP *rp;
                    434: {
                    435:        DP t;
                    436:
                    437:        asir_assert(ARG0(arg),O_DP,"dp_prim");
                    438:        dp_prim((DP)ARG0(arg),&t); dp_ptozp(t,rp);
                    439: }
                    440:
                    441: void Pdp_mod(arg,rp)
                    442: NODE arg;
                    443: DP *rp;
                    444: {
                    445:        DP p;
                    446:        int mod;
                    447:        NODE subst;
                    448:
                    449:        asir_assert(ARG0(arg),O_DP,"dp_mod");
                    450:        asir_assert(ARG1(arg),O_N,"dp_mod");
                    451:        asir_assert(ARG2(arg),O_LIST,"dp_mod");
                    452:        p = (DP)ARG0(arg); mod = QTOS((Q)ARG1(arg));
                    453:        subst = BDY((LIST)ARG2(arg));
                    454:        dp_mod(p,mod,subst,rp);
                    455: }
                    456:
                    457: void Pdp_rat(arg,rp)
                    458: NODE arg;
                    459: DP *rp;
                    460: {
                    461:        asir_assert(ARG0(arg),O_DP,"dp_rat");
                    462:        dp_rat((DP)ARG0(arg),rp);
                    463: }
                    464:
1.9       noro      465: extern int DP_Multiple;
                    466:
1.1       noro      467: void Pdp_nf(arg,rp)
                    468: NODE arg;
                    469: DP *rp;
                    470: {
                    471:        NODE b;
                    472:        DP *ps;
                    473:        DP g;
                    474:        int full;
                    475:
1.11      noro      476:        do_weyl = 0;
1.1       noro      477:        asir_assert(ARG0(arg),O_LIST,"dp_nf");
                    478:        asir_assert(ARG1(arg),O_DP,"dp_nf");
                    479:        asir_assert(ARG2(arg),O_VECT,"dp_nf");
                    480:        asir_assert(ARG3(arg),O_N,"dp_nf");
                    481:        if ( !(g = (DP)ARG1(arg)) ) {
                    482:                *rp = 0; return;
                    483:        }
                    484:        b = BDY((LIST)ARG0(arg)); ps = (DP *)BDY((VECT)ARG2(arg));
                    485:        full = (Q)ARG3(arg) ? 1 : 0;
1.9       noro      486:        dp_nf_ptozp(b,g,ps,full,DP_Multiple,rp);
1.1       noro      487: }
                    488:
1.11      noro      489: void Pdp_weyl_nf(arg,rp)
                    490: NODE arg;
                    491: DP *rp;
                    492: {
                    493:        NODE b;
                    494:        DP *ps;
                    495:        DP g;
                    496:        int full;
                    497:
                    498:        asir_assert(ARG0(arg),O_LIST,"dp_weyl_nf");
                    499:        asir_assert(ARG1(arg),O_DP,"dp_weyl_nf");
                    500:        asir_assert(ARG2(arg),O_VECT,"dp_weyl_nf");
                    501:        asir_assert(ARG3(arg),O_N,"dp_weyl_nf");
                    502:        if ( !(g = (DP)ARG1(arg)) ) {
                    503:                *rp = 0; return;
                    504:        }
                    505:        b = BDY((LIST)ARG0(arg)); ps = (DP *)BDY((VECT)ARG2(arg));
                    506:        full = (Q)ARG3(arg) ? 1 : 0;
1.12    ! noro      507:        do_weyl = 1;
1.11      noro      508:        dp_nf_ptozp(b,g,ps,full,DP_Multiple,rp);
1.12    ! noro      509:        do_weyl = 0;
1.11      noro      510: }
                    511:
1.1       noro      512: void Pdp_true_nf(arg,rp)
                    513: NODE arg;
                    514: LIST *rp;
                    515: {
                    516:        NODE b,n;
                    517:        DP *ps;
                    518:        DP g;
                    519:        DP nm;
                    520:        P dn;
                    521:        int full;
                    522:
1.11      noro      523:        do_weyl = 0;
1.1       noro      524:        asir_assert(ARG0(arg),O_LIST,"dp_true_nf");
                    525:        asir_assert(ARG1(arg),O_DP,"dp_true_nf");
                    526:        asir_assert(ARG2(arg),O_VECT,"dp_true_nf");
                    527:        asir_assert(ARG3(arg),O_N,"dp_nf");
                    528:        if ( !(g = (DP)ARG1(arg)) ) {
                    529:                nm = 0; dn = (P)ONE;
                    530:        } else {
                    531:                b = BDY((LIST)ARG0(arg)); ps = (DP *)BDY((VECT)ARG2(arg));
                    532:                full = (Q)ARG3(arg) ? 1 : 0;
                    533:                dp_true_nf(b,g,ps,full,&nm,&dn);
                    534:        }
                    535:        NEWNODE(n); BDY(n) = (pointer)nm;
                    536:        NEWNODE(NEXT(n)); BDY(NEXT(n)) = (pointer)dn;
                    537:        NEXT(NEXT(n)) = 0; MKLIST(*rp,n);
                    538: }
                    539:
1.8       noro      540: void Pdp_nf_mod(arg,rp)
                    541: NODE arg;
                    542: DP *rp;
                    543: {
                    544:        NODE b;
                    545:        DP g;
                    546:        DP *ps;
                    547:        int mod,full,ac;
1.9       noro      548:        NODE n,n0;
1.8       noro      549:
1.11      noro      550:        do_weyl = 0;
1.8       noro      551:        ac = argc(arg);
                    552:        asir_assert(ARG0(arg),O_LIST,"dp_nf_mod");
                    553:        asir_assert(ARG1(arg),O_DP,"dp_nf_mod");
                    554:        asir_assert(ARG2(arg),O_VECT,"dp_nf_mod");
                    555:        asir_assert(ARG3(arg),O_N,"dp_nf_mod");
                    556:        asir_assert(ARG4(arg),O_N,"dp_nf_mod");
                    557:        if ( !(g = (DP)ARG1(arg)) ) {
                    558:                *rp = 0; return;
                    559:        }
                    560:        b = BDY((LIST)ARG0(arg)); ps = (DP *)BDY((VECT)ARG2(arg));
                    561:        full = QTOS((Q)ARG3(arg)); mod = QTOS((Q)ARG4(arg));
1.9       noro      562:        for ( n0 = n = 0; b; b = NEXT(b) ) {
                    563:                NEXTNODE(n0,n);
                    564:                BDY(n) = (pointer)QTOS((Q)BDY(b));
                    565:        }
                    566:        if ( n0 )
                    567:                NEXT(n) = 0;
                    568:        dp_nf_mod(n,g,ps,mod,full,rp);
1.8       noro      569: }
                    570:
                    571: void Pdp_true_nf_mod(arg,rp)
                    572: NODE arg;
                    573: LIST *rp;
                    574: {
                    575:        NODE b;
                    576:        DP g,nm;
                    577:        P dn;
                    578:        DP *ps;
                    579:        int mod,full;
                    580:        NODE n;
                    581:
1.11      noro      582:        do_weyl = 0;
1.8       noro      583:        asir_assert(ARG0(arg),O_LIST,"dp_nf_mod");
                    584:        asir_assert(ARG1(arg),O_DP,"dp_nf_mod");
                    585:        asir_assert(ARG2(arg),O_VECT,"dp_nf_mod");
                    586:        asir_assert(ARG3(arg),O_N,"dp_nf_mod");
                    587:        asir_assert(ARG4(arg),O_N,"dp_nf_mod");
                    588:        if ( !(g = (DP)ARG1(arg)) ) {
                    589:                nm = 0; dn = (P)ONEM;
                    590:        } else {
                    591:                b = BDY((LIST)ARG0(arg)); ps = (DP *)BDY((VECT)ARG2(arg));
                    592:                full = QTOS((Q)ARG3(arg)); mod = QTOS((Q)ARG4(arg));
                    593:                dp_true_nf_mod(b,g,ps,mod,full,&nm,&dn);
                    594:        }
                    595:        NEWNODE(n); BDY(n) = (pointer)nm;
                    596:        NEWNODE(NEXT(n)); BDY(NEXT(n)) = (pointer)dn;
                    597:        NEXT(NEXT(n)) = 0; MKLIST(*rp,n);
1.1       noro      598: }
                    599:
                    600: void Pdp_tdiv(arg,rp)
                    601: NODE arg;
                    602: DP *rp;
                    603: {
                    604:        MP m,mr,mr0;
                    605:        DP p;
                    606:        Q c;
                    607:        N d,q,r;
                    608:        int sgn;
                    609:
                    610:        asir_assert(ARG0(arg),O_DP,"dp_tdiv");
                    611:        asir_assert(ARG1(arg),O_N,"dp_tdiv");
                    612:        p = (DP)ARG0(arg); d = NM((Q)ARG1(arg)); sgn = SGN((Q)ARG1(arg));
                    613:        if ( !p )
                    614:                *rp = 0;
                    615:        else {
                    616:                for ( mr0 = 0, m = BDY(p); m; m = NEXT(m) ) {
                    617:                        divn(NM((Q)m->c),d,&q,&r);
                    618:                        if ( r ) {
                    619:                                *rp = 0; return;
                    620:                        } else {
                    621:                                NEXTMP(mr0,mr); NTOQ(q,SGN((Q)m->c)*sgn,c);
                    622:                                mr->c = (P)c; mr->dl = m->dl;
                    623:                        }
                    624:                }
                    625:                NEXT(mr) = 0; MKDP(p->nv,mr0,*rp); (*rp)->sugar = p->sugar;
                    626:        }
                    627: }
                    628:
                    629: void Pdp_red_coef(arg,rp)
                    630: NODE arg;
                    631: DP *rp;
                    632: {
                    633:        MP m,mr,mr0;
                    634:        P q,r;
                    635:        DP p;
                    636:        P mod;
                    637:
                    638:        p = (DP)ARG0(arg); mod = (P)ARG1(arg);
                    639:        asir_assert(p,O_DP,"dp_red_coef");
                    640:        asir_assert(mod,O_P,"dp_red_coef");
                    641:        if ( !p )
                    642:                *rp = 0;
                    643:        else {
                    644:                for ( mr0 = 0, m = BDY(p); m; m = NEXT(m) ) {
                    645:                        divsrp(CO,m->c,mod,&q,&r);
                    646:                        if ( r ) {
                    647:                                NEXTMP(mr0,mr); mr->c = r; mr->dl = m->dl;
                    648:                        }
                    649:                }
                    650:                if ( mr0 ) {
                    651:                        NEXT(mr) = 0; MKDP(p->nv,mr0,*rp); (*rp)->sugar = p->sugar;
                    652:                } else
                    653:                        *rp = 0;
                    654:        }
                    655: }
                    656:
                    657: void Pdp_redble(arg,rp)
                    658: NODE arg;
                    659: Q *rp;
                    660: {
                    661:        asir_assert(ARG0(arg),O_DP,"dp_redble");
                    662:        asir_assert(ARG1(arg),O_DP,"dp_redble");
                    663:        if ( dp_redble((DP)ARG0(arg),(DP)ARG1(arg)) )
                    664:                *rp = ONE;
                    665:        else
                    666:                *rp = 0;
                    667: }
                    668:
                    669: void Pdp_red_mod(arg,rp)
                    670: NODE arg;
                    671: LIST *rp;
                    672: {
                    673:        DP h,r;
                    674:        P dmy;
                    675:        NODE n;
                    676:
1.11      noro      677:        do_weyl = 0;
1.1       noro      678:        asir_assert(ARG0(arg),O_DP,"dp_red_mod");
                    679:        asir_assert(ARG1(arg),O_DP,"dp_red_mod");
                    680:        asir_assert(ARG2(arg),O_DP,"dp_red_mod");
                    681:        asir_assert(ARG3(arg),O_N,"dp_red_mod");
                    682:        dp_red_mod((DP)ARG0(arg),(DP)ARG1(arg),(DP)ARG2(arg),QTOS((Q)ARG3(arg)),
                    683:                &h,&r,&dmy);
                    684:        NEWNODE(n); BDY(n) = (pointer)h;
                    685:        NEWNODE(NEXT(n)); BDY(NEXT(n)) = (pointer)r;
                    686:        NEXT(NEXT(n)) = 0; MKLIST(*rp,n);
                    687: }
                    688: void Pdp_subd(arg,rp)
                    689: NODE arg;
                    690: DP *rp;
                    691: {
                    692:        DP p1,p2;
                    693:
                    694:        p1 = (DP)ARG0(arg); p2 = (DP)ARG1(arg);
                    695:        asir_assert(p1,O_DP,"dp_subd");
                    696:        asir_assert(p2,O_DP,"dp_subd");
                    697:        dp_subd(p1,p2,rp);
                    698: }
                    699:
1.12    ! noro      700: void Pdp_weyl_mul(arg,rp)
        !           701: NODE arg;
        !           702: DP *rp;
        !           703: {
        !           704:        DP p1,p2;
        !           705:
        !           706:        p1 = (DP)ARG0(arg); p2 = (DP)ARG1(arg);
        !           707:        asir_assert(p1,O_DP,"dp_weyl_mul"); asir_assert(p2,O_DP,"dp_mul");
        !           708:        do_weyl = 1;
        !           709:        muld(CO,p1,p2,rp);
        !           710:        do_weyl = 0;
        !           711: }
        !           712:
1.1       noro      713: void Pdp_red(arg,rp)
                    714: NODE arg;
                    715: LIST *rp;
                    716: {
                    717:        NODE n;
1.4       noro      718:        DP head,rest,dmy1;
1.1       noro      719:        P dmy;
                    720:
1.11      noro      721:        do_weyl = 0;
1.1       noro      722:        asir_assert(ARG0(arg),O_DP,"dp_red");
                    723:        asir_assert(ARG1(arg),O_DP,"dp_red");
                    724:        asir_assert(ARG2(arg),O_DP,"dp_red");
1.4       noro      725:        dp_red((DP)ARG0(arg),(DP)ARG1(arg),(DP)ARG2(arg),&head,&rest,&dmy,&dmy1);
1.1       noro      726:        NEWNODE(n); BDY(n) = (pointer)head;
                    727:        NEWNODE(NEXT(n)); BDY(NEXT(n)) = (pointer)rest;
                    728:        NEXT(NEXT(n)) = 0; MKLIST(*rp,n);
                    729: }
                    730:
1.11      noro      731: void Pdp_weyl_red(arg,rp)
                    732: NODE arg;
                    733: LIST *rp;
                    734: {
                    735:        NODE n;
                    736:        DP head,rest,dmy1;
                    737:        P dmy;
                    738:
                    739:        asir_assert(ARG0(arg),O_DP,"dp_weyl_red");
                    740:        asir_assert(ARG1(arg),O_DP,"dp_weyl_red");
                    741:        asir_assert(ARG2(arg),O_DP,"dp_weyl_red");
1.12    ! noro      742:        do_weyl = 1;
1.11      noro      743:        dp_red((DP)ARG0(arg),(DP)ARG1(arg),(DP)ARG2(arg),&head,&rest,&dmy,&dmy1);
1.12    ! noro      744:        do_weyl = 0;
1.11      noro      745:        NEWNODE(n); BDY(n) = (pointer)head;
                    746:        NEWNODE(NEXT(n)); BDY(NEXT(n)) = (pointer)rest;
                    747:        NEXT(NEXT(n)) = 0; MKLIST(*rp,n);
                    748: }
                    749:
1.1       noro      750: void Pdp_sp(arg,rp)
                    751: NODE arg;
                    752: DP *rp;
                    753: {
                    754:        DP p1,p2;
                    755:
1.11      noro      756:        do_weyl = 0;
1.1       noro      757:        p1 = (DP)ARG0(arg); p2 = (DP)ARG1(arg);
                    758:        asir_assert(p1,O_DP,"dp_sp"); asir_assert(p2,O_DP,"dp_sp");
                    759:        dp_sp(p1,p2,rp);
                    760: }
                    761:
1.11      noro      762: void Pdp_weyl_sp(arg,rp)
                    763: NODE arg;
                    764: DP *rp;
                    765: {
                    766:        DP p1,p2;
                    767:
                    768:        p1 = (DP)ARG0(arg); p2 = (DP)ARG1(arg);
                    769:        asir_assert(p1,O_DP,"dp_weyl_sp"); asir_assert(p2,O_DP,"dp_sp");
1.12    ! noro      770:        do_weyl = 1;
1.11      noro      771:        dp_sp(p1,p2,rp);
1.12    ! noro      772:        do_weyl = 0;
1.11      noro      773: }
                    774:
1.1       noro      775: void Pdp_sp_mod(arg,rp)
                    776: NODE arg;
                    777: DP *rp;
                    778: {
                    779:        DP p1,p2;
                    780:        int mod;
                    781:
1.11      noro      782:        do_weyl = 0;
1.1       noro      783:        p1 = (DP)ARG0(arg); p2 = (DP)ARG1(arg);
                    784:        asir_assert(p1,O_DP,"dp_sp_mod"); asir_assert(p2,O_DP,"dp_sp_mod");
                    785:        asir_assert(ARG2(arg),O_N,"dp_sp_mod");
                    786:        mod = QTOS((Q)ARG2(arg));
                    787:        dp_sp_mod(p1,p2,mod,rp);
                    788: }
                    789:
                    790: void Pdp_lcm(arg,rp)
                    791: NODE arg;
                    792: DP *rp;
                    793: {
                    794:        int i,n,td;
                    795:        DL d1,d2,d;
                    796:        MP m;
                    797:        DP p1,p2;
                    798:
                    799:        p1 = (DP)ARG0(arg); p2 = (DP)ARG1(arg);
                    800:        asir_assert(p1,O_DP,"dp_lcm"); asir_assert(p2,O_DP,"dp_lcm");
                    801:        n = p1->nv; d1 = BDY(p1)->dl; d2 = BDY(p2)->dl;
                    802:        NEWDL(d,n);
                    803:        for ( i = 0, td = 0; i < n; i++ ) {
                    804:                d->d[i] = MAX(d1->d[i],d2->d[i]); td += d->d[i];
                    805:        }
                    806:        d->td = td;
                    807:        NEWMP(m); m->dl = d; m->c = (P)ONE; NEXT(m) = 0;
                    808:        MKDP(n,m,*rp); (*rp)->sugar = td;       /* XXX */
                    809: }
                    810:
                    811: void Pdp_hm(arg,rp)
                    812: NODE arg;
                    813: DP *rp;
                    814: {
                    815:        DP p;
                    816:
                    817:        p = (DP)ARG0(arg); asir_assert(p,O_DP,"dp_hm");
                    818:        dp_hm(p,rp);
                    819: }
                    820:
                    821: void Pdp_ht(arg,rp)
                    822: NODE arg;
                    823: DP *rp;
                    824: {
                    825:        DP p;
                    826:        MP m,mr;
                    827:
                    828:        p = (DP)ARG0(arg); asir_assert(p,O_DP,"dp_ht");
                    829:        if ( !p )
                    830:                *rp = 0;
                    831:        else {
                    832:                m = BDY(p);
                    833:                NEWMP(mr); mr->dl = m->dl; mr->c = (P)ONE; NEXT(mr) = 0;
                    834:                MKDP(p->nv,mr,*rp); (*rp)->sugar = mr->dl->td;  /* XXX */
                    835:        }
                    836: }
                    837:
                    838: void Pdp_hc(arg,rp)
                    839: NODE arg;
                    840: P *rp;
                    841: {
                    842:        asir_assert(ARG0(arg),O_DP,"dp_hc");
                    843:        if ( !ARG0(arg) )
                    844:                *rp = 0;
                    845:        else
                    846:                *rp = BDY((DP)ARG0(arg))->c;
                    847: }
                    848:
                    849: void Pdp_rest(arg,rp)
                    850: NODE arg;
                    851: DP *rp;
                    852: {
                    853:        asir_assert(ARG0(arg),O_DP,"dp_rest");
                    854:        if ( !ARG0(arg) )
                    855:                *rp = 0;
                    856:        else
                    857:                dp_rest((DP)ARG0(arg),rp);
                    858: }
                    859:
                    860: void Pdp_td(arg,rp)
                    861: NODE arg;
                    862: Q *rp;
                    863: {
                    864:        DP p;
                    865:
                    866:        p = (DP)ARG0(arg); asir_assert(p,O_DP,"dp_td");
                    867:        if ( !p )
                    868:                *rp = 0;
                    869:        else
                    870:                STOQ(BDY(p)->dl->td,*rp);
                    871: }
                    872:
                    873: void Pdp_sugar(arg,rp)
                    874: NODE arg;
                    875: Q *rp;
                    876: {
                    877:        DP p;
                    878:
                    879:        p = (DP)ARG0(arg); asir_assert(p,O_DP,"dp_sugar");
                    880:        if ( !p )
                    881:                *rp = 0;
                    882:        else
                    883:                STOQ(p->sugar,*rp);
                    884: }
                    885:
                    886: void Pdp_cri1(arg,rp)
                    887: NODE arg;
                    888: Q *rp;
                    889: {
                    890:        DP p1,p2;
                    891:        int *d1,*d2;
                    892:        int i,n;
                    893:
                    894:        p1 = (DP)ARG0(arg); p2 = (DP)ARG1(arg);
                    895:        asir_assert(p1,O_DP,"dp_cri1"); asir_assert(p2,O_DP,"dp_cri1");
                    896:        n = p1->nv; d1 = BDY(p1)->dl->d; d2 = BDY(p2)->dl->d;
                    897:        for ( i = 0; i < n; i++ )
                    898:                if ( d1[i] > d2[i] )
                    899:                        break;
                    900:        *rp = i == n ? ONE : 0;
                    901: }
                    902:
                    903: void Pdp_cri2(arg,rp)
                    904: NODE arg;
                    905: Q *rp;
                    906: {
                    907:        DP p1,p2;
                    908:        int *d1,*d2;
                    909:        int i,n;
                    910:
                    911:        p1 = (DP)ARG0(arg); p2 = (DP)ARG1(arg);
                    912:        asir_assert(p1,O_DP,"dp_cri2"); asir_assert(p2,O_DP,"dp_cri2");
                    913:        n = p1->nv; d1 = BDY(p1)->dl->d; d2 = BDY(p2)->dl->d;
                    914:        for ( i = 0; i < n; i++ )
                    915:                if ( MIN(d1[i],d2[i]) >= 1 )
                    916:                        break;
                    917:        *rp = i == n ? ONE : 0;
                    918: }
                    919:
                    920: void Pdp_minp(arg,rp)
                    921: NODE arg;
                    922: LIST *rp;
                    923: {
                    924:        NODE tn,tn1,d,dd,dd0,p,tp;
                    925:        LIST l,minp;
                    926:        DP lcm,tlcm;
                    927:        int s,ts;
                    928:
                    929:        asir_assert(ARG0(arg),O_LIST,"dp_minp");
                    930:        d = BDY((LIST)ARG0(arg)); minp = (LIST)BDY(d);
                    931:        p = BDY(minp); p = NEXT(NEXT(p)); lcm = (DP)BDY(p); p = NEXT(p);
                    932:        if ( !ARG1(arg) ) {
                    933:                s = QTOS((Q)BDY(p)); p = NEXT(p);
                    934:                for ( dd0 = 0, d = NEXT(d); d; d = NEXT(d) ) {
                    935:                        tp = BDY((LIST)BDY(d)); tp = NEXT(NEXT(tp));
                    936:                        tlcm = (DP)BDY(tp); tp = NEXT(tp);
                    937:                        ts = QTOS((Q)BDY(tp)); tp = NEXT(tp);
                    938:                        NEXTNODE(dd0,dd);
                    939:                        if ( ts < s ) {
                    940:                                BDY(dd) = (pointer)minp;
                    941:                                minp = (LIST)BDY(d); lcm = tlcm; s = ts;
                    942:                        } else if ( ts == s ) {
                    943:                                if ( compd(CO,lcm,tlcm) > 0 ) {
                    944:                                        BDY(dd) = (pointer)minp;
                    945:                                        minp = (LIST)BDY(d); lcm = tlcm; s = ts;
                    946:                                } else
                    947:                                        BDY(dd) = BDY(d);
                    948:                        } else
                    949:                                BDY(dd) = BDY(d);
                    950:                }
                    951:        } else {
                    952:                for ( dd0 = 0, d = NEXT(d); d; d = NEXT(d) ) {
                    953:                        tp = BDY((LIST)BDY(d)); tp = NEXT(NEXT(tp));
                    954:                        tlcm = (DP)BDY(tp);
                    955:                        NEXTNODE(dd0,dd);
                    956:                        if ( compd(CO,lcm,tlcm) > 0 ) {
                    957:                                BDY(dd) = (pointer)minp; minp = (LIST)BDY(d); lcm = tlcm;
                    958:                        } else
                    959:                                BDY(dd) = BDY(d);
                    960:                }
                    961:        }
                    962:        if ( dd0 )
                    963:                NEXT(dd) = 0;
                    964:        MKLIST(l,dd0); MKNODE(tn,l,0); MKNODE(tn1,minp,tn); MKLIST(*rp,tn1);
                    965: }
                    966:
                    967: void Pdp_criB(arg,rp)
                    968: NODE arg;
                    969: LIST *rp;
                    970: {
                    971:        NODE d,ij,dd,ddd;
                    972:        int i,j,s,n;
                    973:        DP *ps;
                    974:        DL ts,ti,tj,lij,tdl;
                    975:
                    976:        asir_assert(ARG0(arg),O_LIST,"dp_criB"); d = BDY((LIST)ARG0(arg));
                    977:        asir_assert(ARG1(arg),O_N,"dp_criB"); s = QTOS((Q)ARG1(arg));
                    978:        asir_assert(ARG2(arg),O_VECT,"dp_criB"); ps = (DP *)BDY((VECT)ARG2(arg));
                    979:        if ( !d )
                    980:                *rp = (LIST)ARG0(arg);
                    981:        else {
                    982:                ts = BDY(ps[s])->dl;
                    983:                n = ps[s]->nv;
                    984:                NEWDL(tdl,n);
                    985:                for ( dd = 0; d; d = NEXT(d) ) {
                    986:                        ij = BDY((LIST)BDY(d));
                    987:                        i = QTOS((Q)BDY(ij)); ij = NEXT(ij);
                    988:                        j = QTOS((Q)BDY(ij)); ij = NEXT(ij);
                    989:                        lij = BDY((DP)BDY(ij))->dl;
                    990:                        ti = BDY(ps[i])->dl; tj = BDY(ps[j])->dl;
                    991:                        if ( lij->td != lcm_of_DL(n,lij,ts,tdl)->td
                    992:                                || !dl_equal(n,lij,tdl)
                    993:                                || (lij->td == lcm_of_DL(n,ti,ts,tdl)->td
                    994:                                        && dl_equal(n,tdl,lij))
                    995:                                || (lij->td == lcm_of_DL(n,tj,ts,tdl)->td
                    996:                                        && dl_equal(n,tdl,lij)) ) {
                    997:                                MKNODE(ddd,BDY(d),dd);
                    998:                                dd = ddd;
                    999:                        }
                   1000:                }
                   1001:                MKLIST(*rp,dd);
                   1002:        }
                   1003: }
                   1004:
                   1005: void Pdp_nelim(arg,rp)
                   1006: NODE arg;
                   1007: Q *rp;
                   1008: {
                   1009:        if ( arg ) {
                   1010:                asir_assert(ARG0(arg),O_N,"dp_nelim");
                   1011:                dp_nelim = QTOS((Q)ARG0(arg));
                   1012:        }
                   1013:        STOQ(dp_nelim,*rp);
                   1014: }
                   1015:
                   1016: void Pdp_mag(arg,rp)
                   1017: NODE arg;
                   1018: Q *rp;
                   1019: {
                   1020:        DP p;
                   1021:        int s;
                   1022:        MP m;
                   1023:
                   1024:        p = (DP)ARG0(arg);
                   1025:        asir_assert(p,O_DP,"dp_mag");
                   1026:        if ( !p )
                   1027:                *rp = 0;
                   1028:        else {
                   1029:                for ( s = 0, m = BDY(p); m; m = NEXT(m) )
                   1030:                        s += p_mag(m->c);
                   1031:                STOQ(s,*rp);
                   1032:        }
                   1033: }
                   1034:
                   1035: extern int kara_mag;
                   1036:
                   1037: void Pdp_set_kara(arg,rp)
                   1038: NODE arg;
                   1039: Q *rp;
                   1040: {
                   1041:        if ( arg ) {
                   1042:                asir_assert(ARG0(arg),O_N,"dp_set_kara");
                   1043:                kara_mag = QTOS((Q)ARG0(arg));
                   1044:        }
                   1045:        STOQ(kara_mag,*rp);
                   1046: }
                   1047:
                   1048: void Pdp_homo(arg,rp)
                   1049: NODE arg;
                   1050: DP *rp;
                   1051: {
                   1052:        asir_assert(ARG0(arg),O_DP,"dp_homo");
                   1053:        dp_homo((DP)ARG0(arg),rp);
                   1054: }
                   1055:
1.8       noro     1056: void Pdp_dehomo(arg,rp)
                   1057: NODE arg;
1.1       noro     1058: DP *rp;
                   1059: {
1.8       noro     1060:        asir_assert(ARG0(arg),O_DP,"dp_dehomo");
                   1061:        dp_dehomo((DP)ARG0(arg),rp);
                   1062: }
                   1063:
                   1064: void Pdp_gr_flags(arg,rp)
                   1065: NODE arg;
                   1066: LIST *rp;
                   1067: {
                   1068:        Obj name,value;
                   1069:        NODE n;
1.1       noro     1070:
1.8       noro     1071:        if ( arg ) {
                   1072:                asir_assert(ARG0(arg),O_LIST,"dp_gr_flags");
                   1073:                n = BDY((LIST)ARG0(arg));
                   1074:                while ( n ) {
                   1075:                        name = (Obj)BDY(n); n = NEXT(n);
                   1076:                        if ( !n )
                   1077:                                break;
                   1078:                        else {
                   1079:                                value = (Obj)BDY(n); n = NEXT(n);
                   1080:                        }
                   1081:                        dp_set_flag(name,value);
1.1       noro     1082:                }
                   1083:        }
1.8       noro     1084:        dp_make_flaglist(rp);
                   1085: }
                   1086:
                   1087: extern int DP_Print;
                   1088:
                   1089: void Pdp_gr_print(arg,rp)
                   1090: NODE arg;
                   1091: Q *rp;
                   1092: {
                   1093:        Q q;
                   1094:
                   1095:        if ( arg ) {
                   1096:                asir_assert(ARG0(arg),O_N,"dp_gr_print");
                   1097:                q = (Q)ARG0(arg); DP_Print = QTOS(q);
                   1098:        } else
                   1099:                STOQ(DP_Print,q);
                   1100:        *rp = q;
1.1       noro     1101: }
                   1102:
1.8       noro     1103: void Pdp_gr_main(arg,rp)
1.1       noro     1104: NODE arg;
1.8       noro     1105: LIST *rp;
1.1       noro     1106: {
1.8       noro     1107:        LIST f,v;
                   1108:        Num homo;
                   1109:        Q m;
                   1110:        int modular;
                   1111:        struct order_spec ord;
                   1112:
1.11      noro     1113:        do_weyl = 0;
1.8       noro     1114:        asir_assert(ARG0(arg),O_LIST,"dp_gr_main");
                   1115:        asir_assert(ARG1(arg),O_LIST,"dp_gr_main");
                   1116:        asir_assert(ARG2(arg),O_N,"dp_gr_main");
                   1117:        asir_assert(ARG3(arg),O_N,"dp_gr_main");
                   1118:        f = (LIST)ARG0(arg); v = (LIST)ARG1(arg);
                   1119:        homo = (Num)ARG2(arg);
                   1120:        m = (Q)ARG3(arg);
                   1121:        if ( !m )
                   1122:                modular = 0;
                   1123:        else if ( PL(NM(m))>1 || (PL(NM(m)) == 1 && BD(NM(m))[0] >= 0x80000000) )
                   1124:                error("dp_gr_main : too large modulus");
                   1125:        else
                   1126:                modular = QTOS(m);
                   1127:        create_order_spec(ARG4(arg),&ord);
                   1128:        dp_gr_main(f,v,homo,modular,&ord,rp);
1.1       noro     1129: }
                   1130:
1.8       noro     1131: void Pdp_f4_main(arg,rp)
                   1132: NODE arg;
                   1133: LIST *rp;
1.1       noro     1134: {
1.8       noro     1135:        LIST f,v;
                   1136:        struct order_spec ord;
1.1       noro     1137:
1.11      noro     1138:        do_weyl = 0;
1.8       noro     1139:        asir_assert(ARG0(arg),O_LIST,"dp_f4_main");
                   1140:        asir_assert(ARG1(arg),O_LIST,"dp_f4_main");
                   1141:        f = (LIST)ARG0(arg); v = (LIST)ARG1(arg);
                   1142:        create_order_spec(ARG2(arg),&ord);
                   1143:        dp_f4_main(f,v,&ord,rp);
1.1       noro     1144: }
                   1145:
1.8       noro     1146: void Pdp_f4_mod_main(arg,rp)
                   1147: NODE arg;
                   1148: LIST *rp;
1.1       noro     1149: {
1.8       noro     1150:        LIST f,v;
                   1151:        int m;
                   1152:        struct order_spec ord;
                   1153:
1.11      noro     1154:        do_weyl = 0;
1.8       noro     1155:        asir_assert(ARG0(arg),O_LIST,"dp_f4_main");
                   1156:        asir_assert(ARG1(arg),O_LIST,"dp_f4_main");
                   1157:        asir_assert(ARG2(arg),O_N,"dp_f4_main");
                   1158:        f = (LIST)ARG0(arg); v = (LIST)ARG1(arg); m = QTOS((Q)ARG2(arg));
                   1159:        create_order_spec(ARG3(arg),&ord);
                   1160:        dp_f4_mod_main(f,v,m,&ord,rp);
                   1161: }
1.1       noro     1162:
1.8       noro     1163: void Pdp_gr_mod_main(arg,rp)
                   1164: NODE arg;
                   1165: LIST *rp;
                   1166: {
                   1167:        LIST f,v;
                   1168:        Num homo;
                   1169:        int m;
                   1170:        struct order_spec ord;
                   1171:
1.11      noro     1172:        do_weyl = 0;
1.8       noro     1173:        asir_assert(ARG0(arg),O_LIST,"dp_gr_mod_main");
                   1174:        asir_assert(ARG1(arg),O_LIST,"dp_gr_mod_main");
                   1175:        asir_assert(ARG2(arg),O_N,"dp_gr_mod_main");
                   1176:        asir_assert(ARG3(arg),O_N,"dp_gr_mod_main");
1.11      noro     1177:        f = (LIST)ARG0(arg); v = (LIST)ARG1(arg);
                   1178:        homo = (Num)ARG2(arg); m = QTOS((Q)ARG3(arg));
                   1179:        create_order_spec(ARG4(arg),&ord);
                   1180:        dp_gr_mod_main(f,v,homo,m,&ord,rp);
                   1181: }
                   1182:
                   1183: /* for Weyl algebra */
                   1184:
                   1185: void Pdp_weyl_gr_main(arg,rp)
                   1186: NODE arg;
                   1187: LIST *rp;
                   1188: {
                   1189:        LIST f,v;
                   1190:        Num homo;
                   1191:        Q m;
                   1192:        int modular;
                   1193:        struct order_spec ord;
                   1194:
                   1195:        asir_assert(ARG0(arg),O_LIST,"dp_weyl_gr_main");
                   1196:        asir_assert(ARG1(arg),O_LIST,"dp_weyl_gr_main");
                   1197:        asir_assert(ARG2(arg),O_N,"dp_weyl_gr_main");
                   1198:        asir_assert(ARG3(arg),O_N,"dp_weyl_gr_main");
                   1199:        f = (LIST)ARG0(arg); v = (LIST)ARG1(arg);
                   1200:        homo = (Num)ARG2(arg);
                   1201:        m = (Q)ARG3(arg);
                   1202:        if ( !m )
                   1203:                modular = 0;
                   1204:        else if ( PL(NM(m))>1 || (PL(NM(m)) == 1 && BD(NM(m))[0] >= 0x80000000) )
                   1205:                error("dp_gr_main : too large modulus");
                   1206:        else
                   1207:                modular = QTOS(m);
                   1208:        create_order_spec(ARG4(arg),&ord);
1.12    ! noro     1209:        do_weyl = 1;
1.11      noro     1210:        dp_gr_main(f,v,homo,modular,&ord,rp);
1.12    ! noro     1211:        do_weyl = 0;
1.11      noro     1212: }
                   1213:
                   1214: void Pdp_weyl_f4_main(arg,rp)
                   1215: NODE arg;
                   1216: LIST *rp;
                   1217: {
                   1218:        LIST f,v;
                   1219:        struct order_spec ord;
                   1220:
                   1221:        asir_assert(ARG0(arg),O_LIST,"dp_weyl_f4_main");
                   1222:        asir_assert(ARG1(arg),O_LIST,"dp_weyl_f4_main");
                   1223:        f = (LIST)ARG0(arg); v = (LIST)ARG1(arg);
                   1224:        create_order_spec(ARG2(arg),&ord);
1.12    ! noro     1225:        do_weyl = 1;
1.11      noro     1226:        dp_f4_main(f,v,&ord,rp);
1.12    ! noro     1227:        do_weyl = 0;
1.11      noro     1228: }
                   1229:
                   1230: void Pdp_weyl_f4_mod_main(arg,rp)
                   1231: NODE arg;
                   1232: LIST *rp;
                   1233: {
                   1234:        LIST f,v;
                   1235:        int m;
                   1236:        struct order_spec ord;
                   1237:
                   1238:        asir_assert(ARG0(arg),O_LIST,"dp_weyl_f4_main");
                   1239:        asir_assert(ARG1(arg),O_LIST,"dp_weyl_f4_main");
                   1240:        asir_assert(ARG2(arg),O_N,"dp_f4_main");
                   1241:        f = (LIST)ARG0(arg); v = (LIST)ARG1(arg); m = QTOS((Q)ARG2(arg));
                   1242:        create_order_spec(ARG3(arg),&ord);
1.12    ! noro     1243:        do_weyl = 1;
1.11      noro     1244:        dp_f4_mod_main(f,v,m,&ord,rp);
1.12    ! noro     1245:        do_weyl = 0;
1.11      noro     1246: }
                   1247:
                   1248: void Pdp_weyl_gr_mod_main(arg,rp)
                   1249: NODE arg;
                   1250: LIST *rp;
                   1251: {
                   1252:        LIST f,v;
                   1253:        Num homo;
                   1254:        int m;
                   1255:        struct order_spec ord;
                   1256:
                   1257:        asir_assert(ARG0(arg),O_LIST,"dp_weyl_gr_mod_main");
                   1258:        asir_assert(ARG1(arg),O_LIST,"dp_weyl_gr_mod_main");
                   1259:        asir_assert(ARG2(arg),O_N,"dp_weyl_gr_mod_main");
                   1260:        asir_assert(ARG3(arg),O_N,"dp_weyl_gr_mod_main");
1.8       noro     1261:        f = (LIST)ARG0(arg); v = (LIST)ARG1(arg);
                   1262:        homo = (Num)ARG2(arg); m = QTOS((Q)ARG3(arg));
                   1263:        create_order_spec(ARG4(arg),&ord);
1.12    ! noro     1264:        do_weyl = 1;
1.8       noro     1265:        dp_gr_mod_main(f,v,homo,m,&ord,rp);
1.12    ! noro     1266:        do_weyl = 0;
1.1       noro     1267: }
1.8       noro     1268:

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