1 /* @(#)pow.c 4.1 12/25/82 */ 2 3 #include <mp.h> 4 pow(a,b,c,d) MINT *a,*b,*c,*d; 5 { int i,j,n; 6 MINT x,y; 7 x.len=y.len=0; 8 xfree(d); 9 d->len=1; 10 d->val=xalloc(1,"pow"); 11 *d->val=1; 12 for(j=0;j<b->len;j++) 13 { n=b->val[b->len-j-1]; 14 for(i=0;i<15;i++) 15 { mult(d,d,&x); 16 mdiv(&x,c,&y,d); 17 if((n=n<<1)&0100000) 18 { mult(a,d,&x); 19 mdiv(&x,c,&y,d); 20 } 21 } 22 } 23 xfree(&x); 24 xfree(&y); 25 return; 26 } 27 rpow(a,n,b) MINT *a,*b; 28 { MINT x,y; 29 int i; 30 x.len=1; 31 x.val=xalloc(1,"rpow"); 32 *x.val=n; 33 y.len=n*a->len+4; 34 y.val=xalloc(y.len,"rpow2"); 35 for(i=0;i<y.len;i++) y.val[i]=0; 36 y.val[y.len-1]=010000; 37 xfree(b); 38 pow(a,&x,&y,b); 39 xfree(&x); 40 xfree(&y); 41 return; 42 } 43