Annotation of researchv10no/cmd/lfactor/util.c, revision 1.1

1.1     ! root        1: #define testing 0
        !             2: /*
        !             3:  * compos performs the composition of two reduced_______ forms.
        !             4:  * Thus we are entitled to assume that
        !             5:  * |b| <= a <= c
        !             6:  * and
        !             7:  * a,b < 1e16
        !             8:  */
        !             9: #include "mp.h"
        !            10: #include "form.h"
        !            11: form
        !            12: compos(f1,f2)
        !            13: form f1, f2;
        !            14: {
        !            15:        form f3;
        !            16:        mint m, r, y;
        !            17:        mint yq, yr;
        !            18:        mint v1, v2;
        !            19:        mint d, d1, s, n;
        !            20:        mint x1, x2, y1, y2;
        !            21:        mint temp, temp1, temp2;
        !            22:        mint zero;
        !            23:        double dinv();
        !            24:        double modf();
        !            25: 
        !            26:        zero = itom(0);
        !            27:        n.high = s.high = 0;
        !            28:        s.low = (f1.b.low + f2.b.low)*0.5;
        !            29:        n.low = s.low - f2.b.low;
        !            30: #if testing
        !            31:        temp1 = msub(mult(f1.c,f1.a),mult(f2.c,f2.a));
        !            32:        if(mcmp(temp1,mult(n,s)) != 0){
        !            33:                printf("compos: unequal determinants!\n");
        !            34:                tobort(5);
        !            35:        }
        !            36: #endif
        !            37:        d.high = 0;
        !            38:        x1.high = y1.high = 0;
        !            39:        d.low = dinv(f1.a.low,f2.a.low,&x1.low,&y1.low);
        !            40:        d1.high = 0;
        !            41:        x2.high = 0;
        !            42:        y2.high = 0;
        !            43:        v1.high = v2.high = 0;
        !            44:        if(d.low == 1){
        !            45:                d1.low = 1;
        !            46:                v1.low = f1.a.low;
        !            47:                v2.low = f2.a.low;
        !            48:                m = mult(y1,n);
        !            49:        }else{
        !            50:                d1.low = dinv(s.low,d.low,&x2.low,&y2.low);
        !            51:                v1.low = f1.a.low/d1.low;
        !            52:                v2.low = f2.a.low/d1.low;
        !            53:                mdiv(mult(y1,y2), v1, &temp);
        !            54:                temp1 = mult(temp, n);
        !            55:                temp2 = mult(x2, f2.c);
        !            56:                m = msub(temp1, temp2);
        !            57:        }
        !            58:        mdiv(m, v1, &r);
        !            59:        if((r.low + r.low) > v1.low)
        !            60:                r.low -= v1.low;
        !            61:        else if((r.low+r.low) < -v1.low)
        !            62:                r.low += v1.low;
        !            63:        yq = mdiv(mult(r,r), v1, &yr);
        !            64:        temp = mult(f2.c, d1);
        !            65:        temp = madd(temp, mult(r,f2.b));
        !            66:        y = madd(temp,mult(v2,yr));
        !            67:        temp = mdiv(y, v1, &temp2);
        !            68:        if(mcmp(temp2,zero) != 0) tobort(10);
        !            69:        f3.a = mult(v1, v2);
        !            70:        f3.b = madd(f2.b, smult(mult(v2,r),2));
        !            71:        f3.c = madd(temp, mult(yq,v2));
        !            72:        reduce(&f3);
        !            73:        return(f3);;
        !            74: }
        !            75: void
        !            76: reduce(f)
        !            77: form *f;
        !            78: {
        !            79:        mint babs;
        !            80:        mint zero, one;
        !            81:        mint mtemp, k;
        !            82:        mint ka;
        !            83:        double dt1, dt2, dtemp;
        !            84: 
        !            85:        zero = itom(0);
        !            86:        one = itom(1);
        !            87: back:
        !            88:        if(mcmp(f->a,f->c) > 0){
        !            89:                mtemp = f->a;
        !            90:                f->a = f->c;
        !            91:                f->c = mtemp;
        !            92:                f->b = mchs(f->b);
        !            93:        }
        !            94:        babs = f->b;
        !            95:        if(mcmp(f->b,zero) < 0)
        !            96:                babs = mchs(babs);
        !            97:        if(mcmp(f->a,babs) >= 0){
        !            98:                if((mcmp(f->a,f->c)==0) || (mcmp(f->a,babs)==0)){
        !            99:                        f->b = babs;
        !           100:                }
        !           101:                return;
        !           102:        }
        !           103:        dt1 = f->b.high*1e16 + f->b.low;
        !           104:        dt2 = f->a.high*1e16 + f->a.low;
        !           105:        modf(dt1/dt2, &dtemp);
        !           106:        if(dtemp>0) dtemp += 1;
        !           107:        else if(dtemp<0) dtemp -= 1;
        !           108:        modf(dtemp/2, &dtemp);
        !           109:        modf(dtemp/1e16, &k.high);
        !           110:        k.low = dtemp - 1e16*k.high;
        !           111:        ka = mult(k,f->a);
        !           112:        f->b = msub(f->b,madd(ka,ka));
        !           113:        f->c = msub(f->c,mult(k,madd(ka,f->b)));
        !           114:        goto back;
        !           115: }
        !           116: tobort(n)
        !           117: int n;
        !           118: {
        !           119:        printf("Error %d\n", n);
        !           120:        abort();
        !           121: }
        !           122: 
        !           123: form
        !           124: formpow(f,h)
        !           125: form f;
        !           126: double h;
        !           127: {
        !           128:        form ftemp;
        !           129:        int i,n;
        !           130:        int bit[120];
        !           131:        double junk;
        !           132:        double temph;
        !           133:        double modf();
        !           134: 
        !           135:        if(h == 0.){
        !           136:                ftemp = f;
        !           137:                ftemp.b = mchs(ftemp.b);
        !           138:                ftemp = compos(f, ftemp);
        !           139:                return(ftemp);
        !           140:        }
        !           141: 
        !           142:        i = 0;
        !           143:        temph = h;
        !           144:        while(temph != 0){
        !           145:                modf(temph/2, &junk);
        !           146:                if(2.*junk != temph)
        !           147:                        bit[i++] = 1;
        !           148:                else
        !           149:                        bit[i++] = 0;
        !           150:                temph = junk;
        !           151:        }
        !           152:        n = i-1;
        !           153: 
        !           154:        ftemp = f;
        !           155:        for(i=n; i>0; i--){
        !           156:                ftemp = compos(ftemp, ftemp);
        !           157:                if(bit[i-1] != 0){
        !           158:                        ftemp = compos(f, ftemp);
        !           159:                }
        !           160:        }
        !           161:        return(ftemp);
        !           162: }
        !           163: void
        !           164: formout(f)
        !           165: form f;
        !           166: {
        !           167:        printf("(");
        !           168:        mout1(f.a);
        !           169:        printf(",");
        !           170:        mout1(f.b);
        !           171:        printf(",");
        !           172:        mout1(f.c);
        !           173:        printf(")");
        !           174:        return;
        !           175: }

unix.superglobalmegacorp.com

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