CS3343/3341 Analysis of Algorithms |
Exponentiation Three Ways |
Output at the end includes all the examples that were asked for in Recitation 4. The first table gives implementations in C, while the second gives implementations in Java using long type. The earlier examples produce exactly the same output, while Java programs show a run with much bigger numbers.
Exponentiation Algorithms in C | ||
---|---|---|
From Class | Recursive | From Text |
// exponend.c: test fast exponen #include <stdio.h> double mul (double r, double s){ printf("mul: r=%.0f, ", r); printf("s=%.0f\n", s); return r*s; } double sqr (double r) { printf("sqr: r=%.0f\n", r); return r*r; } // expon: fast exponentiation double expon(double a, int b) { double d = 1; // final result while(b > 0) { if (b%2 == 1) d =mul(d,a); b = b/2; // drop right bit if (b > 0) a = sqr(a); } return d; } int main() { double a, res; int b; scanf("%lf %i", &a, &b); res = expon(a, b); printf("a: %g, b: %i, ",a,b); printf("res: %.0f\n", res); } | // exprecd.c: test recur. expon #include <stdio.h> double mul (double r, double s){ printf("mul: r=%.0f, ", r); printf("s=%.0f\n", s); return r*s; } double sqr (double r) { printf("sqr: r=%.0f\n", r); return r*r; } // expon: recur. exponentiation double expr(double a, int b) { if (b == 0) return 1; if (b%2 == 0) { double d=sqr(expr(a,b/2)); return d; } if (b%2 == 1) { double d = mul(sqr(expr(a, (b-1)/2)), a); return d; } } int main() { double a, res; int b; scanf("%lf %i", &a, &b); res = expr(a, b); printf("a: %g, b: %i, ",a,b); printf("res: %.0f\n", res); } | // exponend2.c: test fast expon #include <stdio.h> int binary(int , int []); double mul(double r, double s){ printf("mul: r=%.0f, ", r); printf("s=%.0f\n", s); return r*s; } double sqr (double r) { printf("sqr: r=%.0f\n", r); return r*r; } // expon: fast exponentiation double expon(double a, int b[], int k) { double d = 1; // final res int i; for (i = k; i >= 0; i--) { d = sqr(d); if (b[i] == 1)d=mul(d,a); } return d; } int main() { double a, res; int bin, k, i; int b[20]; scanf("%lf %i", &a, &bin); k = binary(bin, b); res = expon(a, b, k); printf("a: %.0lf, b: ", a); for (i = k; i >= 0; i--) printf("%i", b[i]); printf(", res: %.0f\n",res); } // produce binary rep of exp int binary(int bin, int b[]) { int k = 0; while (1) { b[k] = bin%2; bin = bin/2; if (bin == 0) break; k++; } return k; } |
Output: 3^23 | ||
%cc -o exponend exponend.c -Wall % ./exponend 3 23 mul: r=1, s=3 sqr: r=3 mul: r=3, s=9 sqr: r=9 mul: r=27, s=81 sqr: r=81 sqr: r=6561 mul: r=2187, s=43046721 a: 3, b: 23, res: 94143178827 | % cc -o exprecd exprecd.c -Wall % ./exprecd 3 23 sqr: r=1 mul: r=1, s=3 sqr: r=3 sqr: r=9 mul: r=81, s=3 sqr: r=243 mul: r=59049, s=3 sqr: r=177147 mul: r=31381059609, s=3 a: 3, b: 23, res: 94143178827 | % cc -o exponend2 exponend2.c % ./exponend2 3 23 sqr: r=1 mul: r=1, s=3 sqr: r=3 sqr: r=9 mul: r=81, s=3 sqr: r=243 mul: r=59049, s=3 sqr: r=177147 mul: r=31381059609, s=3 a: 3, b: 10111, res:94143178827 |
Output: 3^22 | ||
% ./exponend 3 22 sqr: r=3 mul: r=1, s=9 sqr: r=9 mul: r=9, s=81 sqr: r=81 sqr: r=6561 mul: r=729, s=43046721 a: 3, b: 22, res: 31381059609 | % ./exprecd 3 22 sqr: r=1 mul: r=1, s=3 sqr: r=3 sqr: r=9 mul: r=81, s=3 sqr: r=243 mul: r=59049, s=3 sqr: r=177147 a: 3, b: 22, res: 31381059609 | % ./exponend2 3 22 sqr: r=1 mul: r=1, s=3 sqr: r=3 sqr: r=9 mul: r=81, s=3 sqr: r=243 mul: r=59049, s=3 sqr: r=177147 a: 3, b: 10110, res:31381059609 |
Output: 3^19 | ||
% ./exponend 3 19 mul: r=1, s=3 sqr: r=3 mul: r=3, s=9 sqr: r=9 sqr: r=81 sqr: r=6561 mul: r=27, s=43046721 a: 3, b: 19, res: 1162261467 | % ./exprecd 3 19 sqr: r=1 mul: r=1, s=3 sqr: r=3 sqr: r=9 sqr: r=81 mul: r=6561, s=3 sqr: r=19683 mul: r=387420489, s=3 a: 3, b: 19, res: 1162261467 | % ./exponend2 3 19 sqr: r=1 mul: r=1, s=3 sqr: r=3 sqr: r=9 sqr: r=81 mul: r=6561, s=3 sqr: r=19683 mul: r=387420489, s=3 a: 3, b: 10011, res: 1162261467 |
Output: 5^13 | ||
% ./exponend 5 13 5 13 mul: r=1, s=5 sqr: r=5 sqr: r=25 mul: r=5, s=625 sqr: r=625 mul: r=3125, s=390625 a: 5, b: 13, res: 1220703125 | % ./exprecd 5 13 sqr: r=1 mul: r=1, s=5 sqr: r=5 mul: r=25, s=5 sqr: r=125 sqr: r=15625 mul: r=244140625, s=5 a: 5, b: 13, res: 1220703125 | % ./exponend2 5 13 5 13 sqr: r=1 mul: r=1, s=5 sqr: r=5 mul: r=25, s=5 sqr: r=125 sqr: r=15625 mul: r=244140625, s=5 a: 5, b: 1101, res: 1220703125 |
Exponentiation Algorithms in C | ||
---|---|---|
From Class | Recursive | From Text |
// Exponen.java: test fast exponen public class Exponen { static long mul (long r, long s){ System.out.print("mul: r=" + r+", "); System.out.println("s=" + s); return r*s; } static long sqr (long r) { System.out.println("sqr: r=" + r); return r*r; } // expon: fast exponentiation static long expon(long a, long b) { long d = 1; // final result while(b > 0) { if (b%2 == 1) d =mul(d,a); b = b/2; // drop right bit if (b > 0) a = sqr(a); } return d; } public static void main(String[] args) { long a = Integer.parseInt(args[0]); long b = Integer.parseInt(args[1]); long res = expon(a, b); System.out.print("a: " + a + ", b:" + b + ", "); System.out.println("res: " + res); } } | // Exprec.c: test recursive expon public class Exprec { static long mul (long r, long s){ System.out.print("mul: r=" + r+", "); System.out.println("s=" + s); return r*s; } static long sqr (long r) { System.out.println("sqr: r=" + r); return r*r; } // expon: recursive exponentiation static long expr(long a, long b) { if (b == 0) return 1; if (b%2 == 0) { long d = sqr(expr(a, b/2)); return d; } if (b%2 == 1) { long d = mul(sqr(expr(a, (b-1)/2)), a); return d; } return -1; // for compiler } public static void main(String[] args) { long a = Integer.parseInt(args[0]); long b = Integer.parseInt(args[1]); long res = expr(a, b); System.out.print("a: " + a + ", b:" + b + ", "); System.out.println("res: " + res); } } | // Exponen2.java: test recursive expon // uses binary rep of exponent public class Exponen2 { static long mul (long r, long s){ System.out.print("mul: r=" + r + ", "); System.out.println("s=" + s); return r*s; } static long sqr (long r) { System.out.println("sqr: r=" + r); return r*r; } // expon: fast exponentiation static long expon(long a, int b[], int k) { long d = 1; // final result for (int i = k; i >= 0; i--) { d = sqr(d); if (b[i] == 1) d = mul(d, a); } return d; } public static void main(String[] args) { long a = Integer.parseInt(args[0]); int bin = Integer.parseInt(args[1]); int[] b = new int[20]; int k = binary(bin, b); long res = expon(a, b, k); System.out.print("a: " + a + ", b: "); for (int i = k; i >= 0; i--) System.out.print(b[i]); System.out.println("res: " + res); } // produce binary rep of exp static int binary(int bin, int b[]) { int k = 0; while (true) { b[k] = bin%2; bin = bin/2; if (bin == 0) break; k++; } return k; } } |
Output: 3^23 | ||
java Exponen 2 61 mul: r=1, s=2 sqr: r=2 sqr: r=4 mul: r=2, s=16 sqr: r=16 mul: r=32, s=256 sqr: r=256 mul: r=8192, s=65536 sqr: r=65536 mul: r=536870912, s=4294967296 a: 2, b:61, res: 2305843009213693952 | java Exprec 2 58 sqr: r=1 mul: r=1, s=2 sqr: r=2 mul: r=4, s=2 sqr: r=8 mul: r=64, s=2 sqr: r=128 sqr: r=16384 mul: r=268435456, s=2 sqr: r=536870912 a: 2, b:58, res: 288230376151711744 | java Exponen2 3 37 sqr: r=1 mul: r=1, s=3 sqr: r=3 sqr: r=9 sqr: r=81 mul: r=6561, s=3 sqr: r=19683 sqr: r=387420489 mul: r=150094635296999121, s=3 a: 3, b: 100101, res: 450283905890997363 |