void test02(void) { int m[7]; ObjRef n[7]; int i, j; int res; m[0] = 0; bigFromInt(m[0]); n[0] = bip.res; printf("n[0] = %d\n", m[0]); m[1] = 100; bigFromInt(m[1]); n[1] = bip.res; printf("n[1] = %d\n", m[1]); m[2] = -100; bigFromInt(m[2]); n[2] = bip.res; printf("n[2] = %d\n", m[2]); m[3] = 101; bigFromInt(m[3]); n[3] = bip.res; printf("n[3] = %d\n", m[3]); m[4] = -101; bigFromInt(m[4]); n[4] = bip.res; printf("n[4] = %d\n", m[4]); m[5] = 12345678; bigFromInt(m[5]); n[5] = bip.res; printf("n[5] = %d\n", m[5]); m[6] = -12345678; bigFromInt(m[6]); n[6] = bip.res; printf("n[6] = %d\n", m[6]); for (i = 0; i < 7; i++) { for (j = 0; j < 7; j++) { printf("%12d ", m[i]); bip.op1 = n[i]; bip.op2 = n[j]; res = bigCmp(); if (res < 0) { printf("<"); } else if (res > 0) { printf(">"); } else { printf("="); } printf(" %12d", m[j]); printf("\n"); } } }
void test14(void) { int n, m; ObjRef dividend; ObjRef divisor; int ok; printf("divisor"); for (m = 0; m < 256; m++) { if (m % 8 == 0) { printf("\n%3d to %3d: ", m, m + 7); } if (m == 0) { printf(" "); fflush(stdout); continue; } bigFromInt(m); divisor = bip.res; ok = 1; for (n = 0; n < (1 << 18); n++) { bigFromInt(n); dividend = bip.res; bip.op1 = dividend; bip.op2 = divisor; bigDiv(); bip.op1 = bip.res; bigMul(); free(bip.op1); bip.op1 = bip.res; bip.op2 = bip.rem; bigAdd(); free(bip.op1); free(bip.op2); bip.op1 = bip.res; bip.op2 = dividend; if (bigCmp() != 0) { ok = 0; } free(bip.op1); free(dividend); } free(divisor); printf("%c", ok ? '.' : '?'); fflush(stdout); } printf("\n"); }
bignum *bigmod(const bignum *n1, const bignum *n2,bignum *result) { ABORT_NABN(n1); ABORT_NABN(n2); int i=0,k=0,t=0,k2=0; bignum *divisor; bignum *divident; bignum *remainder; char *zeros; divisor =(bignum *)malloc(sizeof(bignum)); divident =(bignum *)malloc(sizeof(bignum)); zeros=(char *)malloc(1000*sizeof(char)); for(i=0;i<1000;i++) *(zeros+i)='0'; *(zeros+i)=0; *divident=*n1; *result=BIGZERO; k=strlen(divident->number)-strlen(divisor->number); if(k<0) return result; i=0; while((k--)>=0){ t=0; *divisor=*n2; strncat(divisor->number,zeros,k+1); while(bigCmp(divident,divisor)>0) bigabssub(divident,divisor,divident); } *result=*divident; ABORT_NABN(result); free(divisor); free(divident); free(zeros); return result; }
bignum *bigdiv(const bignum *n1, const bignum *n2,bignum *result) { ABORT_NABN(n1); ABORT_NABN(n2); int i=0,k=0,t=0,k2=0; bignum *divisor; bignum *divident; char *zeros; divisor =(bignum *)malloc(sizeof(bignum)); divident=(bignum *)malloc(sizeof(bignum)); zeros=(char *)malloc(1000*sizeof(char)); for(i=0;i<1000;i++) *(zeros+i)='0'; *(zeros+i)=0; *divident=*n1; *divisor=*n2; *result=BIGZERO; k=strlen(divident->number)-strlen(divisor->number); if(k<0) return result; i=0; while(k--){ t=0; *divisor=*n2; strncat(divisor->number,zeros,k); while(bigCmp(divident,divisor)>=0){ t++; bigabssub(divident,divisor,divident); } result->number[i++]=t%10+'0'; putbignum(result); putbignum(divident); putbignum(divisor); ABORT_NABN(result); ABORT_NABN(divisor); ABORT_NABN(divident); } result->number[i]=0; ABORT_NABN(result); free(divisor); free(divident); free(zeros); if(n1->sign!=n2->sign) result->sign='n'; return result; }
int isequalbig (bignum *n1,bignum *n2) { if(!bigCmp(n1,n2)) return 1; return 0; }