mpow.cpp 350 B

123456789101112131415161718192021222324252627282930313233343536
  1. // Bignum power
  2. #include "stdafx.h"
  3. #include "defs.h"
  4. unsigned int *
  5. mpow(unsigned int *a, unsigned int n)
  6. {
  7. unsigned int *aa, *t;
  8. a = mcopy(a);
  9. aa = mint(1);
  10. for (;;) {
  11. if (n & 1) {
  12. t = mmul(aa, a);
  13. mfree(aa);
  14. aa = t;
  15. }
  16. n >>= 1;
  17. if (n == 0)
  18. break;
  19. t = mmul(a, a);
  20. mfree(a);
  21. a = t;
  22. }
  23. mfree(a);
  24. return aa;
  25. }