Annotation of researchv10no/cmd/lfactor/mdiv.c, revision 1.1.1.1

1.1       root        1: #include "mp.h"
                      2: 
                      3: mint
                      4: mdiv(a,b,r)
                      5: mint a, b, *r;
                      6: {
                      7:        mint c;
                      8:        mint num, den;
                      9:        mint quot, rem;
                     10:        mint temp, trial;
                     11:        mint zero, one;
                     12:        double tquot;
                     13:        int nsign, dsign;
                     14: 
                     15:        zero = itom(0);
                     16:        one = itom(1);
                     17:        nsign = 1;
                     18:        dsign = 1;
                     19:        if((b.low==0) && (b.high==0)){
                     20:                printf("mdiv: Zero divide.\n");
                     21:                abort();
                     22:        }
                     23:        num = a;
                     24:        den = b;
                     25:        if((num.low<0) || (num.high<0)){
                     26:                num.high = -num.high;
                     27:                num.low = -num.low;
                     28:                nsign = -1;
                     29:        }
                     30:        if((den.low<0) || (den.high<0)){
                     31:                den.high = -den.high;
                     32:                den.low = -den.low;
                     33:                dsign = -1;
                     34:        }
                     35:        if(mcmp(num,den) < 0){
                     36:                *r = a;
                     37:                return(zero);
                     38:        }
                     39:        tquot = (num.high*e16+num.low) / (den.high*e16+den.low);
                     40:        modf(tquot , &tquot);
                     41:        if(tquot < e16){
                     42:                c.high = 0.;
                     43:                c.low = tquot;
                     44:                temp = mult(c, den);
                     45:                *r = msub(num, temp);
                     46:                if(mcmp(*r,den) >= 0){
                     47:                        c = madd(c, one);
                     48:                        *r = msub(*r, den);
                     49:                }
                     50:                if(mcmp(*r,zero) < 0){
                     51:                        c = msub(c,one);
                     52:                        *r = madd(*r, den);
                     53:                }
                     54:                if(nsign == -1){
                     55:                        c.low = -c.low;
                     56:                        r->high = -r->high;
                     57:                        r->low = -r->low;
                     58:                }
                     59:                if(dsign == -1){
                     60:                        c.low = -c.low;
                     61:                }
                     62:        return(c);
                     63:        }
                     64:        modf( tquot/e16 , &trial.high);
                     65:        trial.low = tquot - trial.high*e16;
                     66:        temp = mult(trial, den);
                     67:        temp = msub(num, temp);
                     68:        quot = mdiv(temp, den, &rem);
                     69:        c = madd(trial, quot);
                     70:        if(mcmp(rem,den) >= 0){
                     71:                rem = msub(rem, den);
                     72:                c = madd(c, one);
                     73:        }
                     74:        if(mcmp(rem,zero) < 0){
                     75:                rem = madd(rem, den);
                     76:                c = msub(c, one);
                     77:        }
                     78:        *r = rem;
                     79:        if(nsign == -1){
                     80:                c.high = -c.high;
                     81:                c.low = -c.low;
                     82:                r->high = -r->high;
                     83:                r->low = -r->low;
                     84:        }
                     85:        if(dsign == -1){
                     86:                c.high = -c.high;
                     87:                c.low = -c.low;
                     88:        }
                     89:        return(c);
                     90: }
                     91: 
                     92: mint
                     93: sdiv(a,b,r)
                     94: mint a;
                     95: int b, *r;
                     96: {
                     97:        mint c;
                     98:        mint bb, rr;
                     99:        double temp1;
                    100: 
                    101:        if(a.high==0){
                    102:                c.high = 0.;
                    103:                modf(a.low/b , &temp1);
                    104:                *r = a.low - temp1*b;
                    105:                c.low = temp1;
                    106:                return(c);
                    107:        }
                    108:        bb = itom(b);
                    109:        c = mdiv(a,bb,&rr);
                    110:        *r = rr.low;
                    111:        return(c);
                    112: }
                    113: 
                    114: mint
                    115: msqrt(a,r)
                    116: mint a, *r;
                    117: {
                    118:        mint b;
                    119:        double temp, sqrt();
                    120:        mint dtemp;
                    121: 
                    122:        if((a.high<0) || (a.low<0)){
                    123:                printf("msqrt: Negative argument.\n");
                    124:                abort();
                    125:        }
                    126:        temp = sqrt(a.high*e16+a.low);
                    127:        modf(temp , &temp);
                    128:        b.high = 0.;
                    129:        b.low = temp;
                    130:        dtemp.high = 0.;
                    131:        dtemp.low = temp;
                    132:        dtemp = mult(dtemp, dtemp);
                    133:        *r = msub(a, dtemp);
                    134:        return(b);
                    135: }
                    136: 
                    137: mint
                    138: mcbrt(a,r)
                    139: mint a, *r;
                    140: {
                    141:        mint b;
                    142:        double temp;
                    143:        double log(), exp();
                    144:        mint dtemp;
                    145:        int sign = 1;
                    146:        mint zero;
                    147: 
                    148:        zero.low = 0.0;
                    149:        zero.high = 0.0;
                    150:        if((a.high<0) || (a.low<0)){
                    151:                sign = -1;
                    152:                a = mchs(a);
                    153:        }
                    154: 
                    155:        temp = exp(log(a.high*e16 + a.low)/3.0);
                    156:        modf(temp, &temp);
                    157: retry:
                    158:        b.high = 0;
                    159:        b.low = temp;
                    160: 
                    161:        dtemp.high = 0;
                    162:        dtemp.low = temp;
                    163:        dtemp = mult(dtemp,mult(dtemp,dtemp));
                    164:        *r = msub(a, dtemp);
                    165: 
                    166:        if(mcmp(*r, zero) < 0){
                    167:                temp = temp - 1;
                    168:                goto retry;
                    169:        }
                    170:        temp = temp + 1;
                    171:        dtemp.high = 0;
                    172:        dtemp.low = temp;
                    173:        dtemp = mult(dtemp,mult(dtemp,dtemp));
                    174:        if(mcmp(a,dtemp) >= 0){
                    175:                goto retry;
                    176:        }
                    177:        return(b);
                    178: }

unix.superglobalmegacorp.com

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