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

Annotation of OpenXM_contrib2/asir2000/engine/lmi.c, Revision 1.1

1.1     ! noro        1: /* $OpenXM: OpenXM/src/asir99/engine/lmi.c,v 1.1.1.1 1999/11/10 08:12:26 noro Exp $ */
        !             2: #include "ca.h"
        !             3: #include "base.h"
        !             4: #include "inline.h"
        !             5:
        !             6: typedef struct oGEN_LM {
        !             7:        int id;
        !             8:        N dense;
        !             9:        N sparse;
        !            10:        int bit;
        !            11:        unsigned int lower;
        !            12: } *GEN_LM;
        !            13:
        !            14: void pwrlm0(N,N,N *);
        !            15: void gen_simpn(N,N*);
        !            16: void gen_simpn_force(N,N*);
        !            17:
        !            18: int lm_lazy;
        !            19:
        !            20: static GEN_LM current_mod_lm;
        !            21:
        !            22: void random_lm(r)
        !            23: LM *r;
        !            24: {
        !            25:        N n,t;
        !            26:
        !            27:        if ( !current_mod_lm )
        !            28:                error("random_lm : current_mod_lm is not set");
        !            29:        randomn(current_mod_lm->bit+1,&n);
        !            30:        gen_simpn_force(n,&t);
        !            31:        MKLM(t,*r);
        !            32: }
        !            33:
        !            34: void ntosparsen(p,bits)
        !            35: N p;
        !            36: N *bits;
        !            37: {
        !            38:        int l,i,j,nz;
        !            39:        N r;
        !            40:        unsigned int *pb,*rb;
        !            41:        if ( !p )
        !            42:                *bits = 0;
        !            43:        else {
        !            44:                l = n_bits(p);
        !            45:                pb = BD(p);
        !            46:                for ( i = l-1, nz = 0; i >= 0; i-- )
        !            47:                        if ( pb[i>>5]&(1<<i&31) ) nz++;
        !            48:                *bits = r = NALLOC(nz); PL(r) = nz;
        !            49:                rb = BD(r);
        !            50:                for ( i = l-1, j = 0; i >= 0; i-- )
        !            51:                        if ( pb[i>>5]&(1<<i&31) )
        !            52:                                rb[j++] = i;
        !            53:        }
        !            54: }
        !            55:
        !            56: void setmod_lm(p)
        !            57: N p;
        !            58: {
        !            59:        int i;
        !            60:
        !            61:        if ( !current_mod_lm )
        !            62:                current_mod_lm = (GEN_LM)MALLOC(sizeof(struct oGEN_LM));
        !            63:        bzero((char *)current_mod_lm,sizeof(struct oGEN_LM));
        !            64:        current_mod_lm->dense = p;
        !            65:        ntosparsen(p,&current_mod_lm->sparse);
        !            66:        current_mod_lm->bit = n_bits(p);
        !            67:        current_mod_lm->id = UP2_DENSE; /* use ordinary rep. by default */
        !            68:        if ( !(current_mod_lm->bit%32) ) {
        !            69:                for ( i = PL(p)-1; i >= 1; i-- )
        !            70:                        if ( BD(p)[i] != 0xffffffff )
        !            71:                                break;
        !            72:                if ( !i ) {
        !            73:                        current_mod_lm->lower = (unsigned int)((((UL)1)<<32)-((UL)BD(p)[0]));
        !            74:                        current_mod_lm->id = UP2_SPARSE; /* XXX */
        !            75:                }
        !            76:        }
        !            77: }
        !            78:
        !            79: void getmod_lm(p)
        !            80: N *p;
        !            81: {
        !            82:        if ( !current_mod_lm )
        !            83:                *p = 0;
        !            84:        else
        !            85:                *p = current_mod_lm->dense;
        !            86: }
        !            87:
        !            88: void simplm(n,r)
        !            89: LM n;
        !            90: LM *r;
        !            91: {
        !            92:        N rem;
        !            93:
        !            94:        if ( !n )
        !            95:                *r = 0;
        !            96:        else if ( NID(n) != N_LM )
        !            97:                *r = n;
        !            98:        else {
        !            99:                gen_simpn(n->body,&rem);
        !           100:                MKLM(rem,*r);
        !           101:        }
        !           102: }
        !           103:
        !           104: void qtolm(q,l)
        !           105: Q q;
        !           106: LM *l;
        !           107: {
        !           108:        N rn;
        !           109:        LM a,b,c;
        !           110:
        !           111:        if ( !q || (OID(q)==O_N && ((NID(q) == N_LM) || (NID(q) == N_GFPN))) ) { /* XXX */
        !           112:                *l = (LM)q;
        !           113:        } else if ( OID(q) == O_N && NID(q) == N_Q ) {
        !           114:                gen_simpn(NM(q),&rn); MKLM(rn,a);
        !           115:                if ( SGN(q) < 0 ) {
        !           116:                        chsgnlm(a,&c); a = c;
        !           117:                }
        !           118:                if ( DN(q) ) {
        !           119:                        gen_simpn_force(DN(q),&rn); MKLM(rn,b);
        !           120:                        if ( !b )
        !           121:                                error("qtolm : invalid denominator");
        !           122:                        divlm(a,b,l);
        !           123:                } else
        !           124:                        *l = a;
        !           125:        } else
        !           126:                error("qtolm : invalid argument");
        !           127: }
        !           128:
        !           129: #define NZLM(a) ((a)&&(NID(a)==N_LM))
        !           130:
        !           131: void addlm(a,b,c)
        !           132: LM a,b;
        !           133: LM *c;
        !           134: {
        !           135:        int s;
        !           136:        N t,t1;
        !           137:        LM z;
        !           138:
        !           139:        qtolm((Q)a,&z); a = z; qtolm((Q)b,&z); b = z;
        !           140:        if ( !a )
        !           141:                *c = b;
        !           142:        else if ( !b )
        !           143:                *c = a;
        !           144:        else {
        !           145:                addn(a->body,b->body,&t);
        !           146:                gen_simpn(t,&t1);
        !           147:                MKLM(t1,*c);
        !           148:        }
        !           149: }
        !           150:
        !           151: void sublm(a,b,c)
        !           152: LM a,b;
        !           153: LM *c;
        !           154: {
        !           155:        int s;
        !           156:        N t,t1,mod;
        !           157:        LM z;
        !           158:
        !           159:        qtolm((Q)a,&z); a = z; qtolm((Q)b,&z); b = z;
        !           160:        if ( !b )
        !           161:                *c = a;
        !           162:        else if ( !a )
        !           163:                chsgnlm(b,c);
        !           164:        else {
        !           165:                s = subn(a->body,b->body,&t);
        !           166:                if ( !s )
        !           167:                        *c = 0;
        !           168:                else {
        !           169:                        MKLM(t,z);
        !           170:                        if ( s < 0 )
        !           171:                                chsgnlm(z,c);
        !           172:                        else
        !           173:                                *c = z;
        !           174:                }
        !           175:        }
        !           176: }
        !           177:
        !           178: void mullm(a,b,c)
        !           179: LM a,b;
        !           180: LM *c;
        !           181: {
        !           182:        N t,q,r;
        !           183:        LM z;
        !           184:
        !           185:        qtolm((Q)a,&z); a = z; qtolm((Q)b,&z); b = z;
        !           186:        if ( !a || !b )
        !           187:                *c = 0;
        !           188:        else {
        !           189:                kmuln(a->body,b->body,&t);
        !           190:                gen_simpn(t,&r);
        !           191:                MKLM(r,*c);
        !           192:        }
        !           193: }
        !           194:
        !           195: void divlm(a,b,c)
        !           196: LM a,b;
        !           197: LM *c;
        !           198: {
        !           199:        LM r;
        !           200:        Q t,m,i;
        !           201:        LM z;
        !           202:
        !           203:        qtolm((Q)a,&z); a = z; qtolm((Q)b,&z); b = z;
        !           204:        if ( !b )
        !           205:                error("divlm: division by 0");
        !           206:        else if ( !a )
        !           207:                *c = 0;
        !           208:        else {
        !           209:                NTOQ(b->body,1,t); NTOQ(current_mod_lm->dense,1,m);
        !           210:                invl(t,m,&i);
        !           211:                MKLM(NM(i),r);
        !           212:                mullm(a,r,c);
        !           213:        }
        !           214: }
        !           215:
        !           216: void chsgnlm(a,c)
        !           217: LM a,*c;
        !           218: {
        !           219:        LM t;
        !           220:        N s,u;
        !           221:
        !           222:        if ( !a )
        !           223:                *c = a;
        !           224:        else {
        !           225:                qtolm((Q)a,&t); a = t;
        !           226:                gen_simpn_force(a->body,&s);
        !           227:                subn(current_mod_lm->dense,s,&u);
        !           228:                MKLM(u,*c);
        !           229:        }
        !           230: }
        !           231:
        !           232: void pwrlm(a,b,c)
        !           233: LM a;
        !           234: Q b;
        !           235: LM *c;
        !           236: {
        !           237:        LM t;
        !           238:        N s;
        !           239:
        !           240:        if ( !b ) {
        !           241:                MKLM(ONEN,*c);
        !           242:        } else if ( !a )
        !           243:                *c = 0;
        !           244:        else {
        !           245:                qtolm((Q)a,&t); a = t;
        !           246:                pwrlm0(a->body,NM(b),&s);
        !           247:                MKLM(s,*c);
        !           248:        }
        !           249: }
        !           250:
        !           251: void pwrlm0(a,n,c)
        !           252: N a,n;
        !           253: N *c;
        !           254: {
        !           255:        N n1,t,t1,t2,r1;
        !           256:        int r;
        !           257:
        !           258:        if ( !n )
        !           259:                *c = ONEN;
        !           260:        else if ( UNIN(n) )
        !           261:                *c = a;
        !           262:        else {
        !           263:                r = divin(n,2,&n1);
        !           264:                pwrlm0(a,n1,&t);
        !           265:                kmuln(t,t,&t1); gen_simpn(t1,&r1);
        !           266:                if ( r ) {
        !           267:                        kmuln(r1,a,&t2); gen_simpn(t2,&r1);
        !           268:                }
        !           269:                *c = r1;
        !           270:        }
        !           271: }
        !           272:
        !           273: int cmplm(a,b)
        !           274: LM a,b;
        !           275: {
        !           276:        LM z;
        !           277:
        !           278:        qtolm((Q)a,&z); a = z; qtolm((Q)b,&z); b = z;
        !           279:        if ( !a )
        !           280:                if ( !b )
        !           281:                        return 0;
        !           282:                else
        !           283:                        return -1;
        !           284:        else if ( !b )
        !           285:                        return 1;
        !           286:        else
        !           287:                return cmpn(a->body,b->body);
        !           288: }
        !           289:
        !           290: void remn_special(N,N,int,unsigned int ,N *);
        !           291:
        !           292: void gen_simpn(a,b)
        !           293: N a;
        !           294: N *b;
        !           295: {
        !           296:        if ( !current_mod_lm )
        !           297:                error("gen_simpn: current_mod_lm is not set");
        !           298:        if ( lm_lazy )
        !           299:                *b = a;
        !           300:        else if ( current_mod_lm->id == UP2_SPARSE )
        !           301:                remn_special(a,current_mod_lm->dense,current_mod_lm->bit,current_mod_lm->lower,b);
        !           302:        else
        !           303:                remn(a,current_mod_lm->dense,b);
        !           304: }
        !           305:
        !           306: void gen_simpn_force(a,b)
        !           307: N a;
        !           308: N *b;
        !           309: {
        !           310:        if ( !current_mod_lm )
        !           311:                error("gen_simpn_force: current_mod_lm is not set");
        !           312:        else if ( current_mod_lm->id == UP2_SPARSE )
        !           313:                remn_special(a,current_mod_lm->dense,current_mod_lm->bit,current_mod_lm->lower,b);
        !           314:        else
        !           315:                remn(a,current_mod_lm->dense,b);
        !           316: }
        !           317:

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