// BigIntegerTest.java SJ import java.math.BigInteger; public class BigIntegerTest { public static void main(String[] args) { int N = 10, M = 1, K = 1; Ajastin a = new Ajastin("Yhteensä"); BigIntegerTest l = new BigIntegerTest(); if (args.length > 0) N = Integer.valueOf(args[0]); if (args.length > 1) M = Integer.valueOf(args[1]); if (args.length > 2) K = Integer.valueOf(args[2]); for (int i = 8; i <= N; i*=2) { if (i > 100*1000) K = 5; if (i > 500*1000) K = 1; l.testaa(i-1, M, K); l.testaa(i, M, K); } System.out.println(a); } // main() void testaa(int n, int m, int k) { BigInteger x = BigInteger.valueOf(m); long paras1 = Long.MAX_VALUE; long paras2 = Long.MAX_VALUE; for (int j = 0; j < k; j++) { Ajastin2 a = new Ajastin2(); BigInteger r = pow1(x, n); a.stop(); if (n < 10 && j == 0) System.out.println("pow1 " + r); if (a.time() < paras1) paras1 = a.time(); a = new Ajastin2(); r = pow2(x, n); a.stop(); if (n < 10 && j == 0) System.out.println("pow2 " + r); if (a.time() < paras1) paras2 = a.time(); } System.out.println("pow1 n = " + n + " m = " + m + " " + paras1 + " ns"); System.out.println("pow2 n = " + n + " m = " + m + " " + paras2); System.out.println("pow1/pow2 n = " + n + " " + (1.0*paras1/paras2)); } BigInteger pow1(BigInteger x, int n) { BigInteger r = new BigInteger("1"); for (int i = 0; i < n; i++) r = r.multiply(x); return r; } BigInteger pow2(BigInteger x, int n) { if (n == 0 ) return BigInteger.valueOf(1); if (n == 1 ) return x; if (n%2 == 0) // n parillinen return (pow2(x.multiply(x), n/2 ) ); // pow(x*x, n/2) else return (x.multiply(pow2(x.multiply(x), n/2 ) )); // pow(x*x, n/2)*x } } // class BigIntegerTest