//#define _GLIBCXX_DEBUG
#include<bits/stdc++.h>
using namespace std;
template <class A, class B> inline bool chmax(A &a, const B &b) { return b > a && (a = b, true); }
template <class A, class B> inline bool chmin(A &a, const B &b) { return b < a && (a = b, true); }
typedef long long ll;
typedef vector<int> vint;
typedef pair<int, int> pint;
typedef vector<long long> vlong;
typedef vector<string> vstring;
#define vpush(a,x) a.push_back(x);
#define rep(i, n) REP(i, 0, n)
#define all(v) v.begin(), v.end()
#define REP(i, x, n) for(int i = x; i < n; i++)
const int INF = 1 << 30;
const int dx[] = {1,0,-1,0,1,1,-1,-1};
const int dy[] = {0,-1,0,1,1,-1,-1,1};
#define stp(x)  setprecision(x)
const long double PI=3.14159265358979323846264338327950;

/*SegTree<x>(n,fx,ex): モノイド(集合X,二項演算fx,単位元ex)についてサイズnで構築
  set(int i,X x),build(): i番目の要素をxにセット。まとめてセグ木を構築する0(n)
  update(i,x): i番目の要素をxに更新。O(log(n))
  query(a,b): [a,b) 全てにfxを作用させた値を取得。O(log(n))
  operator[k] := k番目の要素を返す。
  find_rightest : [a,b) で x以下の要素を持つ最右位置はどこか
  find_leftest : [a,b) で x以下の要素を持つ最左位置はどこか
  binary_search : a_1 + a_2 + ... + a_x >= w となるような最小の x を求める(ただし a_i >
*/
template <typename X>
struct SegTree{
  using FX=function<X(X,X)>; //X●X -> X となる関数の型
  int n; 
  FX fx;
  const X ex;
  vector<X> dat;
  SegTree(int size,FX fx_,X ex_) : n(),fx(fx_),ex(ex_),dat(size*4,ex_){
    int x=1;
    while(size>x){
      x*=2;
    }
    n=x;
    return;
  }

  void set(int i,X x){ dat[i+n-1]=x;}
  void build(){
    for(int k=n-2;k>=0;k--) dat[k]=fx(dat[2*k+1],dat[2*k+2]);
    return;
  }

  void update(int i,X x){
    i+=n-1;
    dat[i]=x;
    while(i>0){
      i=(i-1)/2;
      dat[i]=fx(dat[i*2+1],dat[i*2+2]);
    }      
    return;  
  }

  X query(int a,int b){ return (query_sub(a,b,0,0,n));}
  X query_sub(int a,int b,int k,int l,int r){
    if(r<=a || b<=l){
      return ex;
    }
    else if(a<=l && r<=b){
      return dat[k];
    }
    else{
      X vl=query_sub(a,b,k*2+1,l,(l+r)/2);
      X vr=query_sub(a,b,k*2+2,(l+r)/2,r);
      return fx(vl,vr);
    }
  }

  X operator[](const int &k) const{
    return dat[k+n-1];
  }

    X find_rightest(int a, int b, X x) { return find_rightest_sub(a, b, x, 0, 0, n); }
    X find_leftest(int a, int b, X x) { return find_leftest_sub(a, b, x, 0, 0, n); }
    X find_rightest_sub(int a, int b, X x, int k, int l, int r) {
        if (dat[k] > x || r <= a || b <= l) {  // 自分の値がxより大きい or [a,b)が[l,r)の範囲
            return a - 1;
        } else if (k >= n - 1) {  // 自分が葉ならその位置をreturn
            return (k - (n - 1));
        } else {
            int vr = find_rightest_sub(a, b, x, 2 * k + 2, (l + r) / 2, r);
            if (vr != a - 1) {  // 右の部分木を見て a-1 以外ならreturn
                return vr;
            } else {  // 左の部分木を見て値をreturn
                return find_rightest_sub(a, b, x, 2 * k + 1, l, (l + r) / 2);
            }
        }
    }
    X find_leftest_sub(int a, int b, X x, int k, int l, int r) {
        if (dat[k] > x || r <= a || b <= l) {  // 自分の値がxより大きい or [a,b)が[l,r)の範囲
            return b;
        } else if (k >= n - 1) {  // 自分が葉ならその位置をreturn
            return (k - (n - 1));
        } else {
            int vl = find_leftest_sub(a, b, x, 2 * k + 1, l, (l + r) / 2);
            if (vl != b) {  // 左の部分木を見て b 以外ならreturn
                return vl;
            } else {  // 右の部分木を見て値をreturn
                return find_leftest_sub(a, b, x, 2 * k + 2, (l + r) / 2, r);
            }
        }
    }

  int binary_search(int &x,int k){
    if(dat[k]<x){
      x-=dat[k];
      return (-1);
    }
    if(k>=n-1) return(k-(n-1));
    int p=binary_search(x,2*k+1);
    if(~p) return(p);
    return (binary_search(x,2*k+2));
  }
};

int main(){
  cin.tie(nullptr);
  ios::sync_with_stdio(false);
  int n;
  cin>>n;
  vint a(n);
  auto fx=[](int x1,int x2) -> int {return __gcd(x1,x2);};
  int ex=0;
  SegTree<int> gcdseg(n+5,fx,ex);

  rep(i,n){
    cin>>a[i];
    gcdseg.update(i,a[i]);
  }

  int max=0;
  rep(i,n){
    chmax(max,__gcd(gcdseg.query(0,i),gcdseg.query(i+1,n)));
  }  
  cout<<max<<'\n';
  return(0);
}

Measured memory_bytes: 5312