using System;
using System.Numerics;
using System.Linq;
using System.Collections.Generic;
using System.Text;
using System.Collections;

namespace debug
{
    class main
    {
        static void Main(string[] args)
        {
            //問題クラスを展開
            ProgramC a = new ProgramC();
            a.main();//実行する

        }

    }

    class ProgramA
    {
        public void main()
        {
            //入力
            string[] s = Console.ReadLine().Split(' ');
            int a = int.Parse(s[0]);
            int b = int.Parse(s[1]);
            int t = int.Parse(s[2]);


            //b*(t/a)が答え
            Console.WriteLine(b * (t/a));

        }
    }

    class ProgramB
    {
        public void main()
        {

            //入力
            int n = int.Parse(Console.ReadLine());
            string[] v = Console.ReadLine().Split(' ');
            string[] c = Console.ReadLine().Split(' ');
            int sum = 0;


            //v-cをしてマイナスでなければ足す
            for (int i = 0; i < n; i++)
            {
                if (int.Parse(v[i]) - int.Parse(c[i]) > 0)
                    sum += int.Parse(v[i]) - int.Parse(c[i]);
            }

            //答え出力
            Console.WriteLine(sum);
            

        }
    }

    class ProgramC
    {
        public void main()
        {

            //入力
            int n = int.Parse(Console.ReadLine());
            long[] R = new long[n];
            long[] L = new long[n];

           

            string[] a = Console.ReadLine().Split(' ');
            L[0] = long.Parse(a[0]);
            R[0] = long.Parse(a[n - 1]);

            //左からのgcdと右からのgcdを求める
            for (int i = 1; i < n; i++)
            {
                L[i] = gcd(L[i - 1], long.Parse(a[i]));
                R[i] = gcd(R[i - 1], long.Parse(a[n - 1 - i]));
            }

            long max = 0;

            for (int i = 0; i < n; i++)
            {
                //それぞれの位置で引き出す
                long temp = 0;
                if (i == 0)//一番左は右n-1個分のみで考える
                    temp = R[n - 2];
                else if(i == n- 1)//一番右は左n-1個分のみで考える
                    temp = L[n - 2];
                else
                    temp = gcd(L[i - 1], R[n - 2 - i]);

                //最大を求める
                max = Math.Max(max, temp);
            }

            //答えを出力
            Console.WriteLine(max);

        }

        /*最大公約数を求める関数*/
        static long gcd(long p, long q)
        {
            if (p < q)
            {
                long temp = p;
                p = q;
                q = temp;
            }

            long r = 1;

            while (r != 0)
            {
                r = p % q;
                p = q;
                q = r;
            }

            return p;
        }

    }


    class ProgramD
    {
        static void main()
        {

            //入力
            string[] input = Console.ReadLine().Split(' ');
            int H = int.Parse(input[0]);
            int W = int.Parse(input[1]);
            int INF = 1000000;


            //ワーシャルフロイド法の準備。すべてとりあえず#とする。（そうするとこのあと.だけの判定で済む）
            int[,] dis = new int[H * W + 1, H * W + 1];
            for (int i = 0; i < H * W; i++)
                for (int j = 0; j < H * W; j++)
                {
                    if (i == j)
                        dis[i, j] = 0;
                    else
                        dis[i, j] = INF;
                }


            //前の迷路状態を記録して置くためにmaze2を作成。
            string maze2 = "####################";

            for (int i = 0; i < H; i++)
            {
                //迷路を読み込む
                string maze = Console.ReadLine();

                for (int j = 0; j < W; j++)
                {
                    //横のつながりを判定する。つながっていれば1を代入
                    if (j > 0 && maze[j - 1] == '.' && maze[j] == '.')
                    {
                        dis[i * W + j, i * W + j - 1] = 1;
                        dis[i * W + j - 1, i * W + j] = 1;
                    }

                    //縦のつながりを判定する。ひとつ上と判定します。
                    if (i > 0 && maze2[j] == '.' && maze[j] == '.')
                    {
                        dis[i * W + j, (i - 1) * W + j] = 1;
                        dis[(i - 1) * W + j, i * W + j] = 1;
                    }


                }

                //メイズを記録する
                maze2 = maze;

            }


            //ワーシャルフロイド法を用いる
            for (int k = 0; k < H * W; k++)       // 経由する頂点
                for (int i = 0; i < H * W; i++)     // 始点
                    for (int j = 0; j < H * W; j++)   // 終点
                        dis[i, j] = Math.Min(dis[i, j], dis[i, k] + dis[k, j]);

            int ans = 0;


            //最大の経路を算出する
            for (int i = 0; i < H * W; i++)
                for (int j = 0; j < H * W; j++)
                {
                    if (dis[i, j] <= INF)
                    {
                        int temp = dis[i, j];
                        if (ans < temp)
                            ans = temp;

                    }
                }

            //答を出す
            Console.WriteLine(ans);

        }

    }

    

}




    

Measured memory_bytes: 26208