(no message)
[unix-history] / usr / src / lib / libmp / msqrt.c
CommitLineData
a0dba064
SL
1/* @(#)msqrt.c 4.1 %G% */
2
3#include <mp.h>
4msqrt(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);
22loop:
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}