ulli modPower(ulli n, ulli e, ulli mod){ if (e == 0) return 1; else if (e % 2 == 0) return square(modPower(n,e/2,mod)) % mod; else return (modPower(n,e-1,mod) * n) % mod; }
unsigned int modPower(unsigned int b, unsigned int p, unsigned int m) { //assumes m is no less than 1 if ( p == 0 ) return 1; if ( p == 1 ) return (b % m); return (modPower(b,p/2,m) * modPower(b,p-(p/2),m)) % m; }
int main (int argc, const char * argv[]) { unsigned int ans = 1, p = 1, m = 1; unsigned char * ptr; if ( argv[1] != 0 ) p = atoi(argv[1]); if ( argv[2] != 0 ) m = atoi(argv[2]); ptr = (unsigned char *) argv[3]; printf("Input: to the power of %d, modulo by %d\r\n", p, m); printf("Message: %s\r\n", ptr); for ( ; ptr != 0 && *ptr != 0; ptr++) { ans = modPower(*ptr, p, m); printf(" '%c' %d \t($%x) ^%d mod %d = %d \t($%x)\r\n", *ptr, *ptr, *ptr, p, m, ans, ans, ans); } return 0; }