//Oryginał algorytmu znajdowania liczb pierwszych nie jest mój i jest dostępny pod adresem: https : / / github.com / abudnik / primes
#include <cstdint>
#include <cstdio>
#include <cmath>
#include <inttypes.h>
#include <iostream>
#include <vector>
using namespace std;
typedef int64_t index_t;
bool isPrime(unsigned long long number){
if(number < 2) return false;
if(number == 2) return true;
if(number % 2 == 0) return false;
for(unsigned long long i=3; (i*i)<=number; i+=2){
if(number % i == 0 ) return false;
}
return true;
}
class HashTable
{
public:
HashTable(size_t n)
: size(1 << (uint64_t)ceil(log2(n))),
mask(size - 1),
keys(new uint64_t[size]),
values(new uint64_t[size])
{}
~HashTable() {
delete[] keys;
delete[] values;
}
void insert(uint64_t k, uint64_t v) {
size_t i = k & mask;
while (keys[i]) {
i = (i + 1) & mask;
}
keys[i] = k;
values[i] = v;
}
index_t search(uint64_t k) const {
size_t i = k & mask;
while (keys[i]) {
if (keys[i] == k)
return i;
else
i = (i + 1) & mask;
}
return -1;
}
void remove(index_t i) {
keys[i] = 0;
for (i = (i + 1) & mask; keys[i]; i = (i + 1) & mask) {
const uint64_t key = keys[i];
keys[i] = 0;
insert(key, values[i]);
}
}
uint64_t get_value(index_t pos) const {
return values[pos];
}
private:
const size_t size, mask;
uint64_t *keys, *values;
};
vector<long long> FindPrimes()
{
HashTable ht(2000);
vector<long long> primes;
primes.push_back(2);
for (uint64_t n = 3; n <= 4000000; n += 2) {
const index_t pos = ht.search(n);
if (pos >= 0) {
const uint64_t p = ht.get_value(pos);
ht.remove(pos);
uint64_t v = n + p + p;
for (; ht.search(v) >= 0; v += p + p);
ht.insert(v, p);
} else {
if (n <= 2000) {
ht.insert(n * n, n);
}
primes.push_back(n);
}
}
return primes;
}
int main()
{
vector<long long> miniPrimes = FindPrimes();
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int t;
long long start, stop,i,range;
cin >> t;
while(t--) {
cin >> start >> stop;
range = stop-start+1;
if(stop-start<500) {
int ile = 0;
int maxi = 0;
for(int i = start; i <=stop; i++) {
if(!isPrime(i)) {
ile++;
} else {
if(ile>maxi) maxi = ile;
ile = 0;
}
}
if (ile>maxi) maxi = ile;
cout << maxi << '\n';
} else {
vector<long long> primes(range);
int maxi = 0;
if(start == 0) {
if(stop == 0) maxi = 1;
if(stop >= 1) maxi = 2;
} else if(start == 1) {
if(stop >= 1) maxi = 1;
}
int ostatnia = 0;
for(long long prime : miniPrimes) {
if(prime > stop) break;
if(prime>=start)
if(ostatnia == 0) {
ostatnia = prime;
} else {
if(prime-ostatnia-1 > maxi) maxi = prime-ostatnia-1;
ostatnia = prime;
}
}
if (ostatnia == 0) maxi = stop-start+1;
else {
if(stop-ostatnia>maxi) maxi = stop-ostatnia;
}
if (stop-ostatnia-start+1>maxi) maxi = stop-ostatnia-start+1;
cout << maxi << '\n';
}
}
return 0;
}