#include <bits/stdc++.h>
using namespace std;
#define read(type) readInt<type>() // Fast read
#define ll long long
#define nL "n"
#define pb push_back
#define mk make_pair
#define pii pair<int, int>
#define a first
#define b second
#define vi vector<int>
#define all(x) (x).begin(), (x).end()
#define umap unordered_map
#define uset unordered_set
#define MOD 1000000007
#define imax INT_MAX
#define imin INT_MIN
#define exp 1e9
#define sz(x) (int((x).size()))
vector<int> getDivisors(int n)
{
vector<int> res;
for (int i=1; i<=sqrt(n); i++)
{
if (n%i == 0)
{
// If divisors are equal, print only one
if (n/i == i)
res.pb(i);
else // Otherwise print both
res.pb(i);
res.pb(n/i);
}
}
return res;
}
void solve() {
int n, m; cin >> n >> m;
set<int> topics;
for(auto i = 2; i <= m; i++) {topics.insert(i);}
set<int> stu; for(auto i = 0; i < n; i++) {int d; cin >> d; stu.insert(d);}
int miv = int_max;
int mav = int_min;
vector<int> mivAble;
for(auto itr = stu.begin(); itr != stu.end(); itr++) {
int prevS = topics.size();
for(auto val : getDivisors(*itr)) {
topics.erase(val);
if (topics.find(val) != topics.end()) {mivAble.pb(val);}
}
if (prevS > (int)topics.size()) {
if (miv > *itr) {miv = *itr;}
else {mivAble = {};}
if (mav < *itr) {mav = *itr;}
}
}
if ((int)topics.size() == 0) {
auto loopItr = stu.upper_bound(miv);
while (*loopItr < mav) {
bool vaild = true;
for(auto div : mivAble) {
if (*loopItr % div != 0) {vaild = false;}
}
if (vaild) {
miv = *loopItr;
}
loopItr++;
}
cout << mav - miv << endl;
} else {
cout << -1 << endl;
}
}
int32_t main()
{
ios_base::sync_with_stdio(false);
cin.tie(null);
int t; cin >> t;
while (t--) {
solve();
}
return 0;
}