#include <bits/stdc++.h>
using namespace std;
int main() {
  long long int N, M, K, cnt = 0;
  vector<long long int> a_v(100000, 0), b_v, f_v, b_v2, f_v2;
  cin >> N;
  for (int i = 0; i < N; i++) {
    cin >> a_v.at(i);
  }
  long long int max_idx = 0, second_idx = 0;
  for (int i = 0; i < N; i++) {
    if (a_v[i] > a_v[max_idx]) {
      max_idx = i;
    }
  }
  for (int i = 0; i < N; i++) {
    if (a_v[i] > a_v[second_idx] && i != max_idx) {
      second_idx = i;
    }
  }

  /////
  long long int len = 0;
  for (int i = 1; i <= (int)sqrt(a_v[max_idx]); i++) {
    if (a_v[max_idx] % i == 0) {
      len++;
      b_v.push_back(i);
      f_v.push_back(a_v[max_idx] / i);
      //s_v.push_back(a_v[max_idx] / i);
    }    
  }
  reverse(b_v.begin(), b_v.end());
  for (int i = 0; i < len; i++) {
    f_v.push_back(b_v[i]);
  }
  
  int true_f = 0;
  long long int res = 0;
  for (int i = 0; i < f_v.size(); i++) {
    int flag = 0;
    for (int j = 0; j < N; j++) {
      if (a_v[j] % f_v[i] == 0 && a_v[j] >= f_v[i]) {
        ;
      }
      else {
        flag += 1;
      }
      if (flag >= 2) break;
    }
    if (flag <= 1) {
      true_f = 1;
      res = f_v[i];
      break;
    }
  }
  ////


  len = 0;
  for (int i = 1; i <= (int)sqrt(a_v[second_idx]); i++) {
    if (a_v[second_idx] % i == 0) {
      len++;
      b_v2.push_back(i);
      f_v2.push_back(a_v[second_idx] / i);
      //s_v.push_back(a_v[second_idx] / i);
    }    
  }
  reverse(b_v2.begin(), b_v2.end());
  for (int i = 0; i < len; i++) {
    f_v2.push_back(b_v[i]);
  }
  
  true_f = 0;
  long long int res2 = 0;
  for (int i = 0; i < f_v2.size(); i++) {
    int flag = 0;
    for (int j = 0; j < N; j++) {
      if (a_v[j] % f_v2[i] == 0 && a_v[j] >= f_v2[i]) {
        ;
      }
      else {
        flag += 1;
      }
      if (flag >= 2) break;
    }
    if (flag <= 1) {
      true_f = 1;
      res2 = f_v2[i];
      break;
    }
  }











  
  if (true_f == 1) {
    if (res > res2) {
      cout << res << endl;
    }
    else {
      cout << res2 << endl;
    }
  }
  //cout << res << endl;
  //   cout << res2 << endl;

  //cout << P/(float)N << endl;
  // for (int i = 0; i < M; i++) {
  //   cin >> k;
  //   k_v.at(i) = k;
  //   for (int j = 0; j < k; j++) {
  //     //cout << "sdssd" << endl;
  //     cin >> s_v.at(i).at(j);
  //   }
  // }
  // for (int i = 0; i < M; i++) {
  //   cin >> p_v.at(i); 
  // }
  // x_v[N-1] = -1;
  // for (int i = 0; i < pow(2, N); i++) {
  //   int flag = 0;
  //   x_v[N-1] += 1;
  //   for (int j = N-1; j >= 0; j--) {
  //     //cout << "s" << endl;
  //     if (x_v[j] >= 2) {
  //       x_v[j] = 0;
  //       x_v[j-1] += 1;
  //     }
  //   }
    
  //   for (int j = 0; j < N; j++) {
  //     //printf("%lld ", x_v[j]);
  //   }
  //   //puts("");
 
  //   for (int j = 0; j < M; j++) {
  //     int sum = 0;
  //     for (int k = 0; k < k_v[j]; k++) {
  //       sum += x_v[s_v[j][k]-1];
  //     }
  //     if (sum % 2 == p_v[j]) {
  //       ;
  //     }
  //     else {
  //       flag = -1;
  //       break;
  //     }
  //   }
  //   if (flag == 0) cnt++;
 
  // }
  // cout << cnt << endl;
  // f_n = f_{n-1} + f_{n-2}
  // f_0 = 1
  // f_1 = 1
  // f_2 = 2
  // f_3 = 3
  // long long int j = 0;
  // for (int i = 0; i <= N; i++) {
  //   if (a_v[j] == i) {
  //     j++;
  //   }
  //   else {
  //     if (i >= 2) {
  //       f[i] = f[i-1] + f[i-2];
  //     }
  //     else if (i == 1) {
  //       f[i] = f[i-1] + 0;
  //     }
  //     else if (i == 0) {
  //       f[i] = 1;
  //     }
 
  //   }
  // }
  // for (int i = 0; i <= N; i++) {
  //   //cout << "f" << f[i] << endl;
  // }
  // //cout << "j:" << j << endl;
 
  // cout << f[N]%1000000007 << endl;
  return 0;
}



















// #include <bits/stdc++.h>
// using namespace std;
// int main() {
//   char S[1000000] = {0};
//   vector<int> s_v, s_01v, s_10v;
//   cin >> S;
//   //cout << strlen(S) << endl;
//   for (int i = 0; i < strlen(S); i++) {

//   }
//   return 0;
// }


Measured memory_bytes: 1024