/**
 * FastExpon is a fast computational algorithm for computing large exponents. x^e % m
 * This algorithm was used for a cryptography course dealing with RSA.
 * Feel free to slice it up for yourself. :)
 * @author Alan Lambkin
 * @version 1.0 September 2006
 */


public class FastExpon
{
        public long y = 1;

        /**
         * Performs the calculation...
         * While the exponent is not zero:
         * If the exponent is even, square the base, mod m, and divide the exponent by 2.
         * If the exponent is odd, mulitply the base times y (initially set to 1) mod m,
         * now place that value into y, and subtract 1 from the exponent.
         * @parm        x      the base
         * @parm        e      the exponent
         * @parm        m      the mod
         * @return      The answer, x raised to e, mod m.
         */

        public long fex(long x, long e, long m)
        {
                while (e != 0)
                {
                        if (e%2==0)
                        {
                                x=x*x%m;
                                e=e/2;
                        }
                        else
                        {
                                y=x*y%m;
                                e=e-1;
                        }
                }
                return y;
        }

        /**
         * Just a simple main program so I can test before posting.
         * Prints out the answer.
         */

        public static void main(String[] args)
        {
                long x = 6916502;
                long e = 2773637;
                long m = 8326363;
                FastExpon f = new FastExpon();
                System.out.println(x + " raised to the " + e + " power, mod " + m + " = " + f.fex(x,e,m));
        }
}