/* modbig: if seq % n == 0 return 0, * else return 1 */ int modbig(int *seq, int digit, int n) { int q[MAXD] = { 0 }; int qd, i; qd = divbig(seq, digit, q, n); mulbig(q, qd, digit, n); return equalbig(seq, q, digit); }
lispval Lmod() { register lispval arg1,arg2; lispval handy; struct sdot fake1, fake2; fake2.CDR = 0; fake1.CDR = 0; chkarg(2,"mod"); handy = arg1 = lbot->val; arg2 = (lbot+1)->val; switch(TYPE(arg1)) { case SDOT: switch(TYPE(arg2)) { case SDOT: /* both are already bignums */ break; case INT: /* convert arg2 to bignum */ fake2.I = arg2->i; arg2 =(lispval) &fake2; break; default: error("non-numeric argument",FALSE); } break; case INT: switch(TYPE(arg2)) { case SDOT: /* convert arg1 to bignum */ fake1.I = arg1->i; arg1 =(lispval) &fake1; break; case INT: /* both are fixnums */ return( inewint ((arg1->i) % (arg2->i)) ); default: error("non-numeric argument",FALSE); } break; default: error("non-numeric argument",FALSE); } if(TYPE((lbot+1)->val)==INT && lbot[1].val->i==0) return(handy); divbig(arg1,arg2,(lispval *)0,&handy); if(handy==((lispval)&fake1)) handy = inewint(fake1.I); if(handy==((lispval)&fake2)) handy = inewint(fake2.I); return(handy); }