#define _USE_MATH_DEFINES
#include <assert.h>
#include <math.h>
#include <algorithm>
#include <vector>
#include <string>
#include <list>
#include <set>
#include <map>
#include <unordered_set>
#include <unordered_map>
#include <queue>
#include <sstream>
#include <iostream>
#include <fstream>
#include <iomanip>

using namespace std;
typedef long long     ll;
typedef unsigned int  uint;
#define ALL(a)          (a).begin(), (a).end()
#define FOR(i,a,b)      for(int i = a;   i <  (int)(b); ++i)
#define FOR_REV(i,a,b)  for(int i = b-1; i >= (int)(a); --i)
#define FOR_EACH(it,a)  for(remove_reference<decltype(a)>::type::iterator it = (a).begin(); it != (a).end(); ++it)
#define FOR_EACH_REV(it,a) for(remove_reference<decltype(a)>::type::reverse_iterator it = (a).rbegin(); it != (a).rend(); ++it)
#define FOR_EACH_CONST(it,a) for(remove_reference<decltype(a)>::type::const_iterator it = (a).begin(); it != (a).end(); ++it)
#define FOR_EACH_CONST_REV(it,a) for(remove_reference<decltype(a)>::type::const_reverse_iterator it = (a).rbegin(); it != (a).rend(); ++it)
template<class T> inline T   sqr(T v)  { return v * v; }
template<class T> inline int sign(T v) { return v == 0 ? 0 : (v > 0 ? 1 : -1); }
template<class T> inline int get_bit(T v, int bit_index) { return (v >> bit_index) & 1; } //return {0,1}
template<class T> inline T   gcd(T a, T b) { while(b){ T t = b; b   = a % b; a   = t; } return a; }
#define IN_INT(a)            int a;       is >> a;
#define IN_INT2(a,b)         int a,b;     is >> a >> b;
#define IN_INT3(a,b,c)       int a,b,c;   is >> a >> b >> c;
#define IN_INT4(a,b,c,d)     int a,b,c,d; is >> a >> b >> c >> d;
#define IN_LL(a)             ll a;        is >> a;
#define IN_LL2(a,b)          ll a,b;      is >> a >> b;
#define IN_LL3(a,b,c)        ll a,b,c;    is >> a >> b >> c;
#define IN_LL4(a,b,c,d)      ll a,b,c,d;  is >> a >> b >> c >> d;
#define IN_STR(s)            string s;    is >> s;

//////////////////////////////////////////////////////////////////////////

istream& input(bool release_tie = false)
{
  ios_base::sync_with_stdio(false);
#ifdef INPUT_FROM_FILE
  static ifstream is("AtCoder/input.txt");
  return is;
#endif
  if (release_tie)
    cin.tie(NULL);
  return cin;
}

ostream& output(bool release_tie = false)
{
  cout << setprecision(15);
  if (release_tie)
    cout.tie(NULL);
  return cout;
}

template <typename T>
void init_v2(vector<vector<T>>& v, int lx, int ly, const T& val = T())
{
  v.resize(lx);
  FOR (i,0,lx)
    v[i].resize(ly, val);
};

//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//
////a
//int main()
//{
//  istream& is = input();
//  ostream& os = output();
//
//  IN_INT2(a,b);
//  cout<<a*b-a-b+1;
//  return 0;
//}

//////////////////////////////////////////////////////////////////////////
//int main()
//{
//  istream& is = input();
//  ostream& os = output();
//
//  IN_INT3(n,m,q);
//  vector<vector<int>> t,s;
//  init_v2(t,n,n,0);
//  init_v2(s,n,n,0);
//  FOR (i,0,m)
//  {
//    IN_INT2(l,r);    
//    ++t[l-1][r-1];
//  }
//
//  FOR (i,0,q)
//  {
//    IN_INT2(l,r); 
//    --r;
//    --l;
//    os<<s[r][r]-s[r][l]-s[l][r]-s[l][l];
//  }
//
//  //os << res;
//  return 0;
//}

//////////////////////////////////////////////////////////////////////////
////abc125_a
//int main()
//{
//  istream& is = input();
//  ostream& os = output();
//  IN_INT3(a,b,t);
//  os<<b*(t/a);
//  return 0;
//}

//////////////////////////////////////////////////////////////////////////
////abc125_b
//int main()
//{
//  istream& is = input();
//  ostream& os = output();
//
//  IN_INT(n);
//  vector<int> a(n);
//  FOR (i,0,n)
//    is >> a[i];
//  int res = 0;
//  FOR (i,0,n)
//  {
//    IN_INT(c);
//    res+=max(a[i]-c,0);
//  }
//  os << res;
//  return 0;
//}

//////////////////////////////////////////////////////////////////////////
//abc125_c
int main()
{
  istream& is = input();
  ostream& os = output();

  IN_INT(n);
  unordered_set<int> s0,s1;
  vector<int> a(n);
  FOR (i,0,n)
    is >> a[i];
  s0.insert(0);
  int g = a[0];
  FOR (i,1,n)
  {
    s1.clear();
    s1.insert(g);
    FOR_EACH (it,s0)
      s1.insert(gcd(*it,a[i]));
    g = gcd(g,a[i]);
    swap(s0,s1);
  }
  os << max(*max_element(ALL(s0)),g);
  return 0;
}

//////////////////////////////////////////////////////////////////////////

//int main()
//{
//  istream& is = input();
//  ostream& os = output();
//
//  IN_INT(n);
//
//  //vector<int> a(n);
//  //FOR (i,0,n)
//  //  is >> a[i];
//
//  //os << res;
//  return 0;
//}



Measured memory_bytes: 640