import java.math.BigInteger; import java.util.Random; import java.util.Date; public class twokp { static BigInteger zero = new BigInteger("0"); static BigInteger one = new BigInteger("1"); static BigInteger two = new BigInteger("2"); static BigInteger thousand = new BigInteger("1000"); static BigInteger p = new BigInteger("0"); static BigInteger startk = new BigInteger("0"); static BigInteger MW = new BigInteger("1"); static String s; static int olds1 = 0; static int s1 = 0; public static void main (String args[]) throws java.io.IOException { twokp twokpinst = new twokp(); char c; String sInput; Date d; long starttime; long finishtime; long duration; while (true) { StringBuffer sbInput = new StringBuffer(""); while ((c = (char)System.in.read()) != '\n' && c != '\r') sbInput.append(c); System.in.read(); sInput = sbInput.toString().trim(); if (sInput.charAt(0) == 'f' || sInput.charAt(0) == 'F') { s = sInput.substring(1).trim(); s1 = 0; olds1 = 0; p = twokpinst.eval(s); } else { p = new BigInteger(sInput); } BigInteger i = new BigInteger("0"); for (i=zero; i.compareTo(p)<0; i=i.add(one)) MW = MW.multiply(two); MW = MW.add(one); System.out.println('[' + MW.toString() + ']'); sbInput = new StringBuffer(""); while ((c = (char)System.in.read()) != '\n' && c != '\r') sbInput.append(c); System.in.read(); sInput = sbInput.toString().trim(); startk = new BigInteger(sInput); d = new Date(); starttime = d.getTime(); twokpinst.factorize(MW); d = new Date(); finishtime = d.getTime(); duration = (finishtime-starttime)/1000; System.out.println("duration: " + duration + " seconds"); System.out.println(); } } public boolean factorize(BigInteger n) { boolean prime = false; BigInteger k = new BigInteger("1"); BigInteger result = new BigInteger("0"); BigInteger T = new BigInteger("0"); if (n.isProbablePrime(1000)) { prime = true; System.out.println(n); return prime; } k = startk; if (k.compareTo(one)<0) k = one; do { T = two.multiply(k).multiply(p).add(one); result = n.mod(T); if (k.mod(thousand).compareTo(zero)==0) System.out.print("k = " + k.toString() + '\r'); k = k.add(one); } while (result.compareTo(zero) > 0); if (T.compareTo(one) > 0 && T.compareTo(n) < 0) { factorize(T); factorize(n.divide(T)); } else { prime = false; System.out.println("composite" +'\t' + n); } return prime; } public BigInteger evalRand(char op, BigInteger oldn) { BigInteger n = new BigInteger("1"); switch (op) { case 'r': case 'R': Random r = new Random(); n = new BigInteger(oldn.intValue(), r); break; default: n = oldn; break; } return n; } public BigInteger evalFact(BigInteger oldn, char op) { BigInteger n = new BigInteger("1"); BigInteger i = new BigInteger("1"); BigInteger j = new BigInteger("1"); boolean prime = true; switch (op) { case '!': for (i = one; i.compareTo(oldn) <= 0; i = i.add(one)) n = n.multiply(i); break; case '#': for (i = one; i.compareTo(oldn) <= 0; i = i.add(one)) { prime = true; for (j = two; (prime == true) && (j.multiply(j).compareTo(i) <= 0); j = j.add(one)) if (i.remainder(j).compareTo(zero) == 0) prime = false; if (prime == true) n = n.multiply(i); } break; default: n = oldn; break; } return n; } public BigInteger evalPower(BigInteger oldn, BigInteger n1, char op) { BigInteger n = new BigInteger("0"); switch (op) { case '^': n = oldn.pow(n1.intValue()); break; default: n = n1; break; } return n; } public BigInteger evalProduct(BigInteger oldn, BigInteger n1, char op) { BigInteger n = new BigInteger("0"); switch (op) { case '*': n = oldn.multiply(n1); break; case '/': n = oldn.divide(n1); break; case '%': n = oldn.remainder(n1); break; default: n = n1; break; } return n; } public BigInteger evalSum(BigInteger oldn, BigInteger n1, char op) { BigInteger n = new BigInteger("0"); switch (op) { case '+': n = oldn.add(n1); break; case '-': n = oldn.subtract(n1); break; default: n = n1; break; } return n; } public BigInteger eval(String s) { BigInteger oldn0 = new BigInteger("0"); BigInteger oldn1 = new BigInteger("0"); BigInteger oldn2 = new BigInteger("0"); BigInteger n = new BigInteger("0"); char oldop0 = 0; char oldop1 = 0; char oldop2 = 0; char op = 0; while (s1 < s.length()) { switch (s.charAt(s1)) { case '(': case '[': case '{': s1++; n = eval(s); break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': n = readNum(s); break; default: break; } if (s1 < s.length()) { switch (s.charAt(s1)) { case ')': case ']': case '}': case '!': case '#': case 'r': case 'R': case '^': case '*': case '/': case '%': case '+': case '-': op = s.charAt(s1); s1++; break; default: break; } } else op = 0; switch (op) { case 0: case ')': case ']': case '}': n = evalPower(oldn2, n, oldop2); n = evalProduct(oldn1, n, oldop1); n = evalSum(oldn0, n, oldop0); return n; case '!': case '#': n = evalFact(n, op); break; case 'r': case 'R': n = readNum(s); n = evalRand(op, n); break; case '^': n = evalPower(oldn2, n, oldop2); oldn2 = n; oldop2 = op; break; case '*': case '/': case '%': n = evalPower(oldn2, n, oldop2); oldop2 = 0; n = evalProduct(oldn1, n, oldop1); oldn1 = n; oldop1 = op; break; case '+': case '-': n = evalPower(oldn2, n, oldop2); oldop2 = 0; n = evalProduct(oldn1, n, oldop1); oldop1 = 0; n = evalSum(oldn0, n, oldop0); oldn0 = n; oldop0 = op; break; default: break; } } return n; } public BigInteger readNum(String s) { BigInteger n = new BigInteger("0"); olds1 = s1; while (s1 < s.length() && Character.isDigit(s.charAt(s1))) s1++; n = new BigInteger(s.substring(olds1, s1)); return n; } }