// Original C++ solution (slower):
#include <bits/stdc++.h>

using namespace std;



using ll = long long;

using Pi = pair<int, int>;

using Pl = pair<ll, ll>;

using vint = vector<int>;

using vvint = vector<vint>;

using vvvint = vector<vvint>;

using vdouble = vector<double>;

using vvdouble = vector<vdouble>;

using vvvdouble = vector<vvdouble>;

using vll = vector<ll>;

using vvll = vector<vll>;

using vvvll = vector<vvll>;

using uint = unsigned int;

using ull = unsigned long long;



template<typename T> using uset = unordered_set<T>;

template<typename T1, typename T2> using umap = unordered_map<T1, T2>;



constexpr int INF = (1 << 30) - 1;

constexpr ll LLINF = 1LL << 60;

constexpr int dy[] = {1, 0, -1, 0, 1, -1, -1, 1};

constexpr int dx[] = {0, 1, 0, -1, 1, 1, -1, -1};

constexpr char el = '\n';

constexpr int mod = 1000000007;

constexpr int mod2 = 998244353;

template<typename T> T gcd(T a, T b) { return (b ? gcd(b, a % b) : a); }

template<typename T> T lcm(T a, T b) { return (a / gcd(a, b) * b); }

template<typename T1, typename T2>

inline bool chmin(T1 &a, T2 b) { return (a > b && (a = b, true)); }

template<typename T1, typename T2>

inline bool chmax(T1 &a, T2 b) { return (a < b && (a = b, true)); }



template<typename T>

vector<T> makeVector(size_t a, T b) { return (vector<T>(a, b)); }

template<typename... Ts>

auto makeVector(size_t a, Ts... ts) { 

	return (vector<decltype(makeVector(ts...))>(a, makeVector(ts...)));

}



template<typename T>

bool isin(T y, T x, T h, T w) { return (0 <= y && 0 <= x && y < h && x < w); }

template<typename T>

bool isin1(T y, T x, T h, T w) { return (0 < y && 0 < x && y <= h && x <= w); }



template<typename T>

ostream& operator <<(ostream &os, vector<T> &v) {

	if (v.size()) {

		os << v[0];

		for (int i = 1; i < v.size(); i++) os << " " << v[i];

	}

	return (os);

}



template<typename T>

istream& operator >>(istream &is, vector<T> &v) {

	for (auto &u : v) is >> u;

	return (is);

}



template<typename T1, typename T2>

istream& operator >>(istream &is, pair<T1, T2> &p) {

	return (is >> p.first >> p.second);

}



ll N;

ll calc(vll &A) {

	vll divisor;

	for (ll i = 1; i*i <= A[0]; i++) {

		if (A[0] % i == 0) {

			divisor.push_back(i);

			if (i != A[0]/i) divisor.push_back(A[0]/i);

		}

	}

	sort(begin(divisor), end(divisor));

	ll ans = 0;

	for (auto &div : divisor) {

		int cnt = 0;

		for (int i = 1; i < N; i++) {

			if (A[i]%div == 0) {

				cnt++;

			}

		}

		if (cnt >= N-2) ans = div;

	}

	return (ans);

}



void Main() {

	cin >> N;

	vll A(N); cin >> A;

	ll ans = calc(A);

	swap(A[0], A[1]);

	chmax(ans, calc(A));

	cout << ans << endl;

}



int main() {

	cin.tie(0);

	ios::sync_with_stdio(0);

	cout << fixed << setprecision(20);

	Main();

	return (0);

}


// Optimized solution to the same problem (faster):
#include <bits/stdc++.h>

using namespace std;



using ll = long long;

using Pi = pair<int, int>;

using Pl = pair<ll, ll>;

using vint = vector<int>;

using vvint = vector<vint>;

using vvvint = vector<vvint>;

using vdouble = vector<double>;

using vvdouble = vector<vdouble>;

using vvvdouble = vector<vvdouble>;

using vll = vector<ll>;

using vvll = vector<vll>;

using vvvll = vector<vvll>;

using uint = unsigned int;

using ull = unsigned long long;



template<typename T> using uset = unordered_set<T>;

template<typename T1, typename T2> using umap = unordered_map<T1, T2>;



constexpr int INF = (1 << 30) - 1;

constexpr ll LLINF = 1LL << 60;

constexpr int dy[] = {1, 0, -1, 0, 1, -1, -1, 1};

constexpr int dx[] = {0, 1, 0, -1, 1, 1, -1, -1};

constexpr char el = '\n';

constexpr int mod = 1000000007;

constexpr int mod2 = 998244353;

template<typename T> T gcd(T a, T b) { return (b ? gcd(b, a % b) : a); }

template<typename T> T lcm(T a, T b) { return (a / gcd(a, b) * b); }

template<typename T1, typename T2>

inline bool chmin(T1 &a, T2 b) { return (a > b && (a = b, true)); }

template<typename T1, typename T2>

inline bool chmax(T1 &a, T2 b) { return (a < b && (a = b, true)); }



template<typename T>

vector<T> makeVector(size_t a, T b) { return (vector<T>(a, b)); }

template<typename... Ts>

auto makeVector(size_t a, Ts... ts) { 

	return (vector<decltype(makeVector(ts...))>(a, makeVector(ts...)));

}



template<typename T>

bool isin(T y, T x, T h, T w) { return (0 <= y && 0 <= x && y < h && x < w); }

template<typename T>

bool isin1(T y, T x, T h, T w) { return (0 < y && 0 < x && y <= h && x <= w); }



template<typename T>

ostream& operator <<(ostream &os, vector<T> &v) {

	if (v.size()) {

		os << v[0];

		for (int i = 1; i < v.size(); i++) os << " " << v[i];

	}

	return (os);

}



template<typename T>

istream& operator >>(istream &is, vector<T> &v) {

	for (auto &u : v) is >> u;

	return (is);

}



template<typename T1, typename T2>

istream& operator >>(istream &is, pair<T1, T2> &p) {

	return (is >> p.first >> p.second);

}



void Main() {

	ll N; cin >> N;

	vll A(N); cin >> A;

	vll left(N), right(N);



	left[0] = A[0];

	for (int i = 1; i < N; i++) {

		left[i] = gcd(left[i-1], A[i]);

	}



	right[N-1] = A[N-1];

	for (int i = N-2; i >= 0; i--) {

		right[i] = gcd(right[i+1], A[i]);

	}

	

	ll maxv = 0;

	for (int i = 0; i < N; i++) {

		if (i > 0 && i < N-1) chmax(maxv, gcd(left[i-1], right[i+1]));

		else if (i == 0) chmax(maxv, right[i+1]);

		else chmax(maxv, left[i-1]);

	}

	cout << maxv << endl;

}



int main() {

	cin.tie(0);

	ios::sync_with_stdio(0);

	cout << fixed << setprecision(20);

	Main();

	return (0);

}


// Fastest known solution for this problem: