import sys

read = sys.stdin.buffer.read

readline = sys.stdin.buffer.readline

from fractions import gcd



class SegmentTree:

    def __init__(self, dat, func, I):

        N = len(dat)

        self.sz = N

        self.func = func

        self.I = I

        self.seg = [I]*N + dat

 

    def assign(self, k, x):

        self.seg[k + self.sz] = x

 

    def build(self):

        for i in range(self.sz - 1, 0, -1):

            self.seg[i] = self.func(self.seg[2 * i], self.seg[2 * i + 1])

 

    def update(self, k, x):

        k += self.sz

        self.seg[k] = x

        while k > 1:

            k //= 2

            self.seg[k] = self.func(self.seg[2 * k], self.seg[2 * k + 1])

 

    def query(self, a, b):

        R = self.I

        a += self.sz

        b += self.sz

        while a < b:

            if a % 2 == 1:

                R = self.func(R, self.seg[a])

                a += 1

            if b % 2 == 1:

                b -= 1

                R = self.func(self.seg[b], R)

            a //= 2

            b //= 2

        return R



def main():

    N = int(readline())

    dat = list(map(int,read().split()))

    seg = SegmentTree(dat , gcd , 0)

    seg.build()

    ans = 1

    for i in range(N):

        ans = max(ans,gcd(seg.query(0,i) , seg.query(i+1,N)))

    print(ans)



main()

# test



def main():

    import sys

    from fractions import gcd

    input = sys.stdin.readline



    def init(init_val):

        #set_val

        for i in range(n):

            seg[i+num-1]=init_val[i]    

        #built

        for i in range(num-2,-1,-1) :

            seg[i]=gcd(seg[2*i+1],seg[2*i+2]) 

        

    def update(k,x):

        k += num-1

        seg[k] = x

        while k:

            k = (k-1)//2

            seg[k] = gcd(seg[k*2+1],seg[k*2+2])

        

    def query(p,q):

        if q<=p:

            return ide_ele

        p += num-1

        q += num-2

        res=ide_ele

        while q-p>1:

            if p&1 == 0:

                res = gcd(res,seg[p])

            if q&1 == 1:

                res = gcd(res,seg[q])

                q -= 1

            p = p//2

            q = (q-1)//2

        if p == q:

            res = gcd(res,seg[p])

        else:

            res = gcd(gcd(res,seg[p]),seg[q])

        return res







    n = int(eval(input()))

    a = tuple(map(int,input().split()))



    #####単位元######

    ide_ele = 0



    #num:n以上の最小の2のべき乗

    num =2**(n-1).bit_length()

    seg=[ide_ele]*2*num

    init(a)



    ans = -1

    for i in range(n):

        ans = max(ans,gcd(query(0,i),query(i+1,n)))

    print(ans)



if __name__ == '__main__':

    main()

import sys

read = sys.stdin.buffer.read
readline = sys.stdin.buffer.readline
from fractions import gcd


class SegmentTree:
    def __init__(self, dat, func, I):
        N = len(dat)
        self.sz = N
        self.func = func
        self.I = I
        self.seg = [I] * N + dat

    def assign(self, k, x):
        self.seg[k + self.sz] = x

    def build(self):
        for i in range(self.sz - 1, 0, -1):
            self.seg[i] = self.func(self.seg[2 * i], self.seg[2 * i + 1])

    def update(self, k, x):
        k += self.sz
        self.seg[k] = x
        while k > 1:
            k //= 2
            self.seg[k] = self.func(self.seg[2 * k], self.seg[2 * k + 1])

    def query(self, a, b):
        R = self.I
        a += self.sz
        b += self.sz
        while a < b:
            if a % 2 == 1:
                R = self.func(R, self.seg[a])
                a += 1
            if b % 2 == 1:
                b -= 1
                R = self.func(self.seg[b], R)
            a //= 2
            b //= 2
        return R


def main():
    N = int(readline())
    dat = list(map(int, read().split()))
    seg = SegmentTree(dat, gcd, 0)
    seg.build()
    ans = 1
    for i in range(N):
        ans = max(ans, gcd(seg.query(0, i), seg.query(i + 1, N)))
    print(ans)


main()

# test
def main():
    import sys
    from fractions import gcd

    input = sys.stdin.readline

    def init(init_val):
        # set_val
        for i in range(n):
            seg[i + num - 1] = init_val[i]
        # built
        for i in range(num - 2, -1, -1):
            seg[i] = gcd(seg[2 * i + 1], seg[2 * i + 2])

    def update(k, x):
        k += num - 1
        seg[k] = x
        while k:
            k = (k - 1) // 2
            seg[k] = gcd(seg[k * 2 + 1], seg[k * 2 + 2])

    def query(p, q):
        if q <= p:
            return ide_ele
        p += num - 1
        q += num - 2
        res = ide_ele
        while q - p > 1:
            if p & 1 == 0:
                res = gcd(res, seg[p])
            if q & 1 == 1:
                res = gcd(res, seg[q])
                q -= 1
            p = p // 2
            q = (q - 1) // 2
        if p == q:
            res = gcd(res, seg[p])
        else:
            res = gcd(gcd(res, seg[p]), seg[q])
        return res

    n = int(eval(input()))
    a = tuple(map(int, input().split()))
    #####単位元######
    ide_ele = 0
    # num:n以上の最小の2のべき乗
    num = 2 ** (n - 1).bit_length()
    seg = [ide_ele] * 2 * num
    init(a)
    ans = -1
    for i in range(n):
        ans = max(ans, gcd(query(0, i), query(i + 1, n)))
    print(ans)


if __name__ == "__main__":
    main()

-import sys +# test +def main(): +    import sys +    from fractions import gcd -read = sys.stdin.buffer.read -readline = sys.stdin.buffer.readline -from fractions import gcd +    input = sys.stdin.readline +    def init(init_val): +        # set_val +        for i in range(n): +            seg[i + num - 1] = init_val[i] +        # built +        for i in range(num - 2, -1, -1): +            seg[i] = gcd(seg[2 * i + 1], seg[2 * i + 2]) -class SegmentTree: -    def __init__(self, dat, func, I): -        N = len(dat) -        self.sz = N -        self.func = func -        self.I = I -        self.seg = [I] * N + dat +    def update(k, x): +        k += num - 1 +        seg[k] = x +        while k: +            k = (k - 1) // 2 +            seg[k] = gcd(seg[k * 2 + 1], seg[k * 2 + 2]) -    def assign(self, k, x): -        self.seg[k + self.sz] = x +    def query(p, q): +        if q <= p: +            return ide_ele +        p += num - 1 +        q += num - 2 +        res = ide_ele +        while q - p > 1: +            if p & 1 == 0: +                res = gcd(res, seg[p]) +            if q & 1 == 1: +                res = gcd(res, seg[q]) +                q -= 1 +            p = p // 2 +            q = (q - 1) // 2 +        if p == q: +            res = gcd(res, seg[p]) +        else: +            res = gcd(gcd(res, seg[p]), seg[q]) +        return res -    def build(self): -        for i in range(self.sz - 1, 0, -1): -            self.seg[i] = self.func(self.seg[2 * i], self.seg[2 * i + 1]) - -    def update(self, k, x): -        k += self.sz -        self.seg[k] = x -        while k > 1: -            k //= 2 -            self.seg[k] = self.func(self.seg[2 * k], self.seg[2 * k + 1]) - -    def query(self, a, b): -        R = self.I -        a += self.sz -        b += self.sz -        while a < b: -            if a % 2 == 1: -                R = self.func(R, self.seg[a]) -                a += 1 -            if b % 2 == 1: -                b -= 1 -                R = self.func(self.seg[b], R) -            a //= 2 -            b //= 2 -        return R - - -def main(): -    N = int(readline()) -    dat = list(map(int, read().split())) -    seg = SegmentTree(dat, gcd, 0) -    seg.build() -    ans = 1 -    for i in range(N): -        ans = max(ans, gcd(seg.query(0, i), seg.query(i + 1, N))) +    n = int(eval(input())) +    a = tuple(map(int, input().split())) +    #####単位元###### +    ide_ele = 0 +    # num:n以上の最小の2のべき乗 +    num = 2 ** (n - 1).bit_length() +    seg = [ide_ele] * 2 * num +    init(a) +    ans = -1 +    for i in range(n): +        ans = max(ans, gcd(query(0, i), query(i + 1, n))) -main() +if __name__ == "__main__": +    main()