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