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