home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / PDP-11 / Trees / V7 / usr / src / libmp / msqrt.c < prev    next >
Encoding:
C/C++ Source or Header  |  1979-01-10  |  649 b   |  38 lines

  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. }
  38.