|
|
1.1 ! root 1: /* @(#)msqrt.c 4.1 12/25/82 */ ! 2: ! 3: #include <mp.h> ! 4: msqrt(a,b,r) MINT *a,*b,*r; ! 5: { MINT x,junk,y; ! 6: int j; ! 7: x.len=junk.len=y.len=0; ! 8: if(a->len<0) fatal("msqrt: neg arg"); ! 9: if(a->len==0) ! 10: { b->len=0; ! 11: r->len=0; ! 12: return(0); ! 13: } ! 14: if(a->len%2==1) x.len=(1+a->len)/2; ! 15: else x.len=1+a->len/2; ! 16: x.val=xalloc(x.len,"msqrt"); ! 17: for(j=0;j<x.len;x.val[j++]=0); ! 18: if(a->len%2==1) x.val[x.len-1]=0400; ! 19: else x.val[x.len-1]=1; ! 20: xfree(b); ! 21: xfree(r); ! 22: loop: ! 23: mdiv(a,&x,&y,&junk); ! 24: xfree(&junk); ! 25: madd(&x,&y,&y); ! 26: sdiv(&y,2,&y,(short *)&j); ! 27: if(mcmp(&x,&y)>0) ! 28: { xfree(&x); ! 29: move(&y,&x); ! 30: xfree(&y); ! 31: goto loop; ! 32: } ! 33: xfree(&y); ! 34: move(&x,b); ! 35: mult(&x,&x,&x); ! 36: msub(a,&x,r); ! 37: xfree(&x); ! 38: return(r->len); ! 39: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.