unittest
{
	assert( [ "3", "7 6 8" ].parse.expand.solve == 2 );
	assert( [ "3", "12 15 18" ].parse.expand.solve == 6 );
	assert( [ "2", "1000000000 1000000000" ].parse.expand.solve == 1000000000 );
}



import std.algorithm;
import std.conv;
import std.numeric : gcd;
import std.range;
import std.stdio;
import std.typecons;

void main()
{
	stdin.byLineCopy.parse.expand.solve.writeln;
}

auto parse( Range )( Range input )
if( isInputRange!Range && is( ElementType!Range == string ) )
{
	auto n = input.front.to!( long );
	input.popFront;
	auto as = input.front.split.to!( long[] );
	return tuple( as );
}

auto solve( long[] as )
{
	// 左からのgcd累積表を作成
	auto ls = new long[]( as.length );
	ls[ 0 ] = as[ 0 ];
	foreach( i, a; as[ 1 .. $ ] )
	{
		ls[ i + 1 ] = ls[ i ].gcd( a );
	}
	
	// 右からのgcd累積表を作成
	auto rs = new long[]( as.length );
	rs[ $ - 1 ] = as[ $ - 1 ];
	foreach_reverse( i, a; as[ 0 .. $ - 1 ] )
	{
		rs[ i ] = rs[ i + 1 ].gcd( a );
	}
	
	// aiを抜いたgcdを計算して一番大きいやつを答えにする
	auto ans = max( ls[ $ - 2 ], rs[ 1 ] );		// 端っこを抜いたやつは先にやっておく
	for( auto i = 1L; i + 1 < as.length; i++ )
	{
		ans = max( ans, ls[ i - 1 ].gcd( rs[ i + 1 ] ) );
	}
	return ans;
}
