[BACK]Return to ddN-27.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib2 / asir2000 / engine-27

Annotation of OpenXM_contrib2/asir2000/engine-27/ddN-27.c, Revision 1.1

1.1     ! noro        1: /* $OpenXM: OpenXM/src/asir99/engine-27/ddN-27.c,v 1.1.1.1 1999/11/10 08:12:27 noro Exp $ */
        !             2: #include "ca-27.h"
        !             3: #include "base.h"
        !             4: #include "inline.h"
        !             5:
        !             6: void divn_27(n1,n2,nq,nr)
        !             7: N n1,n2,*nq,*nr;
        !             8: {
        !             9:        int tmp;
        !            10:        int br;
        !            11:        int j,d,d1,d2,dd;
        !            12:        int *m1,*m1e,*m2,*mr;
        !            13:        N q,r;
        !            14:
        !            15:        if ( !n2 )
        !            16:                error("divn: division by 0");
        !            17:        else if ( !n1 ) {
        !            18:                *nq = 0; *nr = 0;
        !            19:        } else if ( UNIN(n2) ) {
        !            20:                *nq = n1; *nr = 0;
        !            21:        } else if ( (d1 = PL(n1)) < (d2 = PL(n2)) ) {
        !            22:                *nr = n1; *nq = 0;
        !            23:        } else if ( d2 == 1 ) {
        !            24:                if ( d1 == 1 ) {
        !            25:                        DQR(BD(n1)[0],BD(n2)[0],br,tmp)
        !            26:                        STON(br,*nq); STON(tmp,*nr);
        !            27:                } else {
        !            28:                        tmp = divin_27(n1,BD(n2)[0],nq); STON(tmp,*nr);
        !            29:                }
        !            30:                return;
        !            31:        } else if ( (d1 == d2) && ((tmp = cmpn(n1,n2)) <= 0) )
        !            32:                if ( !tmp ) {
        !            33:                        *nr = 0; *nq = ONEN;
        !            34:                } else {
        !            35:                        *nr = n1; *nq = 0;
        !            36:                }
        !            37:        else {
        !            38:                d = BASE27/(BD(n2)[d2-1] + 1); dd = d1-d2;
        !            39:                m1 = W_ALLOC(d1+1); m2 = W_ALLOC(d2+1);
        !            40:                mulin_27(n1,d,m1); mulin_27(n2,d,m2);
        !            41:                *nq = q = NALLOC(dd+1);
        !            42:                divnmain_27(d1,d2,m1,m2,BD(q));
        !            43:                PL(q) = (BD(q)[dd]?dd+1:dd);
        !            44:                for ( j = d2-1; (j >= 0) && (m1[j] == 0); j--);
        !            45:                if ( j == -1 )
        !            46:                        *nr = 0;
        !            47:                else {
        !            48:                        *nr = r = NALLOC(j+1);
        !            49:                        for ( br = 0, m1e = m1+j, mr = BD(r)+j;
        !            50:                                m1e >= m1; m1e--, mr-- ) {
        !            51:                                DSAB27(d,br,*m1e,*mr,br)
        !            52:                        }
        !            53:                        PL(r) = (BD(r)[j]?j+1:j);
        !            54:                }
        !            55:        }
        !            56: }
        !            57:
        !            58: void divnmain_27(d1,d2,m1,m2,q)
        !            59: int d1,d2;
        !            60: int *m1,*m2,*q;
        !            61: {
        !            62:        unsigned int tmp;
        !            63:        int *n1,*n2;
        !            64:        int i,j;
        !            65:        int l,r;
        !            66:        int u,qhat;
        !            67:        int v1,v2;
        !            68:
        !            69:        v1 = m2[d2-1]; v2 = m2[d2-2];
        !            70:        for ( j = d1-d2, m1 += j, q += j; j >= 0; j--, q--, m1-- ) {
        !            71:                n1 = m1+d2; n2 = m1+d2-1;
        !            72:                if ( *n1 == v1 ) {
        !            73:                        qhat = BASE27 - 1; r = *n1 + *n2;
        !            74:                } else {
        !            75:                        DSAB27(v1,*n1,*n2,qhat,r)
        !            76:                }
        !            77:                DM27(v2,qhat,u,l)
        !            78:                while ( 1 ) {
        !            79:                        if ((r > u) || ((r == u) && (*(n1-2) >= l)))
        !            80:                                break;
        !            81:                        if ( ( l -= v2 ) < 0 ) {
        !            82:                                l += BASE27; u--;
        !            83:                        }
        !            84:                r += v1; qhat--;
        !            85:                }
        !            86:                if ( qhat ) {
        !            87:                        for ( i = d2, u = 0, n1 = m1, n2 = m2; i > 0; i--, n1++, n2++ ) {
        !            88:                                DMA27(*n2,qhat,u,u,l)
        !            89:                                if ( (l = *n1 - l) < 0 ) {
        !            90:                                        u++; *n1 = l + BASE27;
        !            91:                                } else
        !            92:                                        *n1 = l;
        !            93:                        }
        !            94:                        if ( *n1 < u ) {
        !            95:                                for ( i = d2, qhat--, r = 0, n1 = m1, n2 = m2;
        !            96:                                        i > 0; i--, n1++, n2++ ) {
        !            97:                                        l = *n1 + *n2 + r; *n1 = l % BASE27; r = l / BASE27;
        !            98:                                }
        !            99:                        }
        !           100:                        *n1 = 0;
        !           101:                }
        !           102:                *q = qhat;
        !           103:        }
        !           104: }
        !           105:
        !           106: void mulin_27(n,d,p)
        !           107: N n;
        !           108: int d;
        !           109: int *p;
        !           110: {
        !           111:        int carry;
        !           112:        int *m,*me;
        !           113:
        !           114:        bzero((char *)p,(int)((PL(n)+1)*sizeof(int)));
        !           115:        for ( carry = 0, m = BD(n), me = m+PL(n); m < me; p++, m++ ) {
        !           116:                carry += *p;
        !           117:                DMA27(*m,d,carry,carry,*p)
        !           118:        }
        !           119:        *p = carry;
        !           120: }
        !           121:
        !           122: int divin_27(n,dvr,q)
        !           123: N n;
        !           124: int dvr;
        !           125: N *q;
        !           126: {
        !           127:        int up,d;
        !           128:        int *m,*mq,*md;
        !           129:        N nq;
        !           130:
        !           131:        d = PL(n); m = BD(n);
        !           132:        if ( ( d == 1 ) && ( dvr > *m ) ) {
        !           133:                *q = 0;
        !           134:                return( *m );
        !           135:        }
        !           136:        *q = nq = NALLOC(d);
        !           137:        for ( md = m+d-1, mq = BD(nq)+d-1, up = 0; md >= m; md--, mq-- ) {
        !           138:                DSAB27(dvr,up,*md,*mq,up)
        !           139:        }
        !           140:        PL(nq) = (BD(nq)[d-1]?d:d-1);
        !           141:        return ( up );
        !           142: }

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