import java.math.BigInteger; import java.util.Scanner; public class Main { /* 検査範囲数最小 */ private long l; /* 検査範囲数最大 */ private long h; public Main(long l, long h) { this.l = l; this.h = h; } /** * 素数判定。isProbablePrimeのcertaintyは適当に。 */ private boolean isPrime(long l) { BigInteger bi = new BigInteger(String.valueOf(l)); return bi.isProbablePrime(7); } /** * lを素因数分解したときに1番小さい素因数を返す。 */ private long getMinPrimeFactor(long l) { /* lが素数ならlで確定 */ if (isPrime(l)) { return l; } /* lが合成数ならばp(素数)とn=l/p(素数かわからない)の2数の積に分解できる。この時pとnのうち小さいほうの数が最大となるのは、p=n(両者素数)のときなので、とりあえずsqrt(l)以下の最大の素数から割り始める */ for (long i = (long) Math.sqrt(l); i > 1; i--) { if (isPrime(i) && l % i == 0) { /* 割り切れた場合、pと、nの素因数のうちの最小のもの、を比較して小さいほうがこの数の最小の素因数 */ long quotient = l / i; return Math.min(i, getMinPrimeFactor(quotient)); } } /* 素数でないならば、必ずどこかで割り切れる素因数が存在するので、ここに到達することはない。 */ throw new IllegalArgumentException(); } private void execute() { for (long i = (long) Math.sqrt(h); i > 1; i--) { if (isPrime(i)) { for (long j = h; j >= l; j--) { if (j % i == 0 && getMinPrimeFactor(j / i) >= i) { System.out.println(j); System.exit(0); } } } } } public static void main(String[] args) { Scanner cin = new Scanner(System.in); String line = null; while (cin.hasNext()) { line = cin.nextLine(); } cin.close(); String[] lines = line.split(" "); Main prime = new Main(Long.parseLong(lines[0]), Long.parseLong(lines[1])); prime.execute(); } }