Annotation of 41BSD/lib/libmp/mdiv.c, revision 1.1.1.1

1.1       root        1: #include <mp.h>
                      2: mdiv(a,b,q,r) MINT *a,*b,*q,*r;
                      3: {      MINT x,y;
                      4:        int sign;
                      5:        sign=1;
                      6:        x.val=a->val;
                      7:        y.val=b->val;
                      8:        x.len=a->len;
                      9:        if(x.len<0) {sign= -1; x.len= -x.len;}
                     10:        y.len=b->len;
                     11:        if(y.len<0) {sign= -sign; y.len= -y.len;}
                     12:        xfree(q);
                     13:        xfree(r);
                     14:        m_div(&x,&y,q,r);
                     15:        if(sign==-1)
                     16:        {       q->len= -q->len;
                     17:                r->len = - r->len;
                     18:        }
                     19:        return;
                     20: }
                     21: m_dsb(q,n,a,b) short *a,*b;
                     22: {      long int x,qx;
                     23:        int borrow,j,u;
                     24:        qx=q;
                     25:        borrow=0;
                     26:        for(j=0;j<n;j++)
                     27:        {       x=borrow-a[j]*qx+b[j];
                     28:                b[j]=x&077777;
                     29:                borrow=x>>15;
                     30:        }
                     31:        x=borrow+b[j];
                     32:        b[j]=x&077777;
                     33:        if(x>>15 ==0) { return(0);}
                     34:        borrow=0;
                     35:        for(j=0;j<n;j++)
                     36:        {       u=a[j]+b[j]+borrow;
                     37:                if(u<0) borrow=1;
                     38:                else borrow=0;
                     39:                b[j]=u&077777;
                     40:        }
                     41:        { return(1);}
                     42: }
                     43: m_trq(v1,v2,u1,u2,u3)
                     44: {      long int d;
                     45:        long int x1;
                     46:        if(u1==v1) d=077777;
                     47:        else d=(u1*0100000L+u2)/v1;
                     48:        while(1)
                     49:        {       x1=u1*0100000L+u2-v1*d;
                     50:                x1=x1*0100000L+u3-v2*d;
                     51:                if(x1<0) d=d-1;
                     52:                else {return(d);}
                     53:        }
                     54: }
                     55: m_div(a,b,q,r) MINT *a,*b,*q,*r;
                     56: {      MINT u,v,x,w;
                     57:        short d,*qval;
                     58:        int qq,n,v1,v2,j;
                     59:        u.len=v.len=x.len=w.len=0;
                     60:        if(b->len==0) { fatal("mdiv divide by zero"); return;}
                     61:        if(b->len==1)
                     62:        {       r->val=xalloc(1,"m_div1");
                     63:                sdiv(a,b->val[0],q,r->val);
                     64:                if(r->val[0]==0)
                     65:                {       shfree(r->val);
                     66:                        r->len=0;
                     67:                }
                     68:                else r->len=1;
                     69:                return;
                     70:        }
                     71:        if(a->len < b->len)
                     72:        {       q->len=0;
                     73:                r->len=a->len;
                     74:                r->val=xalloc(r->len,"m_div2");
                     75:                for(qq=0;qq<r->len;qq++) r->val[qq]=a->val[qq];
                     76:                return;
                     77:        }
                     78:        x.len=1;
                     79:        x.val = &d;
                     80:        n=b->len;
                     81:        d=0100000L/(b->val[n-1]+1L);
                     82:        mult(a,&x,&u); /*subtle: relies on fact that mult allocates extra space */
                     83:        mult(b,&x,&v);
                     84:        v1=v.val[n-1];
                     85:        v2=v.val[n-2];
                     86:        qval=xalloc(a->len-n+1,"m_div3");
                     87:        for(j=a->len-n;j>=0;j--)
                     88:        {       qq=m_trq(v1,v2,u.val[j+n],u.val[j+n-1],u.val[j+n-2]);
                     89:                if(m_dsb(qq,n,v.val,&(u.val[j]))) qq -= 1;
                     90:                qval[j]=qq;
                     91:        }
                     92:        x.len=n;
                     93:        x.val=u.val;
                     94:        mcan(&x);
                     95:        sdiv(&x,d,&w,(short *)&qq);
                     96:        r->len=w.len;
                     97:        r->val=w.val;
                     98:        q->val=qval;
                     99:        qq=a->len-n+1;
                    100:        if(qq>0 && qval[qq-1]==0) qq -= 1;
                    101:        q->len=qq;
                    102:        if(qq==0) shfree(qval);
                    103:        if(x.len!=0) xfree(&u);
                    104:        xfree(&v);
                    105:        return;
                    106: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.