F. Плохая криптография
ограничение по времени на тест
3 секунды
ограничение по памяти на тест
512 мегабайт
ввод
стандартный ввод
вывод
стандартный вывод

В современной криптографии многое завязано на алгоритмическую сложность решения нескольких задач. Одной из таких задач является задача дискретного логарифма. Она формулируется так:

Пусть зафиксированно некоторое конечное поле и выбраны два его элемента $$$a$$$ и $$$b$$$. Необходимо найти такое $$$x$$$, что $$$a^x = b$$$, либо определить, что его нет.

Наиболее вероятно, что современное человечество не умеет решать задачу дискретного логарифма для достаточно большого размера поля. Например, для поля остатков по простому модулю считаются безопасными модули размером в 1024 или 2048 бит. Однако, вычисления с такими большими числами, могут создавать существенную нагрузку на сервера, осуществляющие криптографические операции. По этому часто, вместо поля остатков по простому модулю используются более сложные поля, для которых не известно быстрых алгоритмов использующих стрктуру поля, и можно использовать более маленькие поля, а соотвественно соптимизировать операции.

Разработчик Николай не доверяет общепризнанным методам, поэтому хочет придумать свой. Недавно, он прочитал про очень странное поле — нимберы, и считает, что оно отлично подойдет для этой цели.

Поле нимберов определено на множестве целых чисел от 0 до $$$2^{2^k} - 1$$$ для некоторого положительного целого числа $$$k$$$. В качестве суммы используется операция побитового исключающего или ($$$\oplus$$$). Операцию умножения ($$$\odot$$$) можно определить, например, из следующих свойств:

  • $$$0 \odot a = a \odot 0 = 0$$$
  • $$$1 \odot a = a \odot 1 = a$$$
  • $$$a \odot b = b \odot a$$$
  • $$$a \odot (b \odot c)= (a \odot b) \odot c$$$
  • $$$a \odot (b \oplus c) = (a \odot b) \oplus (a \odot c)$$$
  • Если $$$a = 2^{2^n}$$$ для целого $$$n > 0$$$, и $$$b < a$$$, то $$$a \odot b = a \cdot b$$$.
  • Если $$$a = 2^{2^n}$$$ для целого $$$n > 0$$$, то $$$a \odot a = \frac{3}{2}\cdot a$$$.

Например:

  • $$$ 4 \odot 4 = 6$$$
  • $$$ 8 \odot 8 = 4 \odot 2 \odot 4 \odot 2 = 4 \odot 4 \odot 2 \odot 2 = 6 \odot 3 = (4 \oplus 2) \odot 3 = (4 \odot 3) \oplus (2 \odot (2 \oplus 1)) = (4 \odot 3) \oplus (2 \odot 2) \oplus (2 \odot 1) = 12 \oplus 3 \oplus 2 = 13.$$$
  • $$$32 \odot 64 = (16 \odot 2) \odot (16 \odot 4) = (16 \odot 16) \odot (2 \odot 4) = 24 \odot 8 = (16 \oplus 8) \odot 8 = (16 \odot 8) \oplus (8 \odot 8) = 128 \oplus 13 = 141$$$
  • $$$5 \odot 6 = (4 \oplus 1) \odot (4 \oplus 2) = (4\odot 4) \oplus (4 \odot 2) \oplus (4 \odot 1) \oplus (1 \odot 2) = 6 \oplus 8 \oplus 4 \oplus 2 = 8$$$

Формально, этот алгоритм можно описать следующим псевдокодом

multiply(a, b) {
ans = 0
for p1 in bits(a) // номера единичных битов числа a
for p2 in bits(b) // номера единичных битов числа b
ans = ans xor multiply_powers_of_2(1 << p1, 1 << p2)
return ans;
}
multiply_powers_of_2(a, b) {
if (a == 1 or b == 1) return a * b
n = maximal value, such 2^{2^{n}} <= max(a, b)
power = 2^{2^{n}};
if (a >= power and b >= power) {
return multiply(power * 3 / 2, multiply_powers_of_2(a / power, b / power))
} else if (a >= power) {
return multiply_powers_of_2(a / power, b) * power
} else {
return multiply_powers_of_2(a, b / power) * power
}
}

Можно показать, что эти операции действительно удовлетворяют всем свойствам поля. Кроме того, их можно разумно определить в терминах теории игр, но это не очень важно для задачи. C помощью правильного кеширования и группировки опреаций, возможно вычислять произвденеие достаточно быстро, что важно для ускорения работы криптоалгоритма. Более формальные определения, а так же дополнительные свойства можно уточнить в статье википедии по ссылке. Авторы задачи надеятся, что перечисленных в условии свойств должно хватать для решения.

Возведение в степень для такого умножения определяется аналогично обычному $$$a^{\odot k} = \underbrace{a \odot a \odot \cdots \odot a}_{k~\texttt{раз}}$$$.

Вам необходимо провески анализ предложенной схемы на криптостойскость. А именно научиться для пар чисел $$$a$$$ и $$$b$$$ находить такое $$$x$$$, что $$$a^{\odot x} = b$$$, либо определять что такого не существует.

Входные данные

В первой строке одно целое число $$$t$$$ ($$$1 \le t \le 100$$$) — количество пар чисел для которых нужно найти дискретный логарифм. В каждой из следующих $$$t$$$ строк находится пара чисел $$$a$$$ $$$b$$$ ($$$1 \le a, b < 2^{64}$$$).

Выходные данные

Для каждой пары выведите одно целое число $$$x$$$ ($$$0 \le x < 2^{64}$$$), такое что $$$a^{\odot x} = b$$$, либо число -1, если таких степенй не существует. Можно показать, что если существует хоть какое-то такое число $$$x$$$, то существует и лежащее в указанных границах. Если ответов в указанных границах несколько, можно вывести любой из них.

Пример
Входные данные
7
2 2
1 1
2 3
8 10
8 2
321321321321 2
123214213213 4356903202345442785
Выходные данные
1
1
2
4
-1
6148914691236517205
68943624821423112