/*For today, you happen to be the defeated. But what will you become tomorrow?*/
#include<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
using namespace std;
#define dbg if(debugg)
#define F first
#define S second
#define int long long
bool debugg = false;
template <typename T>
using order_set = tree<T, null_type,less<T>, rb_tree_tag,tree_order_statistics_node_update>;
template <typename T>
using minheap = priority_queue<T, vector<T>, greater<T>>;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
const int N = 100005;
vector<int>divisors[N];
void sieve()
{
for(int i = 1; i < N; i ++){
for(int j = i; j < N; j += i){
divisors[j].push_back(i);
}
}
}
int cnt[N], tot[N];
void solve()
{
int n;
cin >> n;
vector<int>v(n);
int gd = 0;
memset(cnt, 0, sizeof(cnt));
memset(tot, 0, sizeof(tot));
for(int i = 0; i < n; i ++){
cin >> v[i];
gd = __gcd(gd, v[i]);
cnt[v[i]] += 1;
}
for(int i = 1; i < N; i ++){
for(int j = i; j < N; j += i){
tot[i] += cnt[j];
}
}
int ans = 2 * gd;
assert(n > 0);
for(int itr = 0; itr < 10; itr ++){
int x = v[rng() % n], y = v[rng() % n];
for(int i : divisors[x]){
for(int j : divisors[y]){
if(i == j) continue;
int lm = (1ll * i * j) / gcd(i, j);
if(lm >= N) lm = 0;
assert(lm < N);
if(tot[i] + tot[j] - tot[lm] != n) continue;
int p = tot[i], q = tot[j];
if(max(p, q) >= ((n + 1) / 2)){
if(min(p, q) >= (n / 2)){
ans = max(ans, i + j);
}
}
}
}
}
cout << ans << '\n';
}
int32_t main()
{
ios::sync_with_stdio(0);
cin.tie(0);
int t = 1;
cin>>t;
sieve();
while(t--){
solve();
}
return 0;
}